From 871508723707f0d4331ae6db2c247c7c40578909 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 14 Jan 2015 14:07:05 +0100 Subject: [PATCH 001/313] Extract ApplicationRoute to a separate file --- assets/scripts/app/routes.coffee | 59 +------------------- assets/scripts/app/routes/application.coffee | 45 +++++++++++++++ assets/scripts/app/routes/route.coffee | 19 +++++++ assets/scripts/travis.coffee | 1 + 4 files changed, 66 insertions(+), 58 deletions(-) create mode 100644 assets/scripts/app/routes/application.coffee create mode 100644 assets/scripts/app/routes/route.coffee diff --git a/assets/scripts/app/routes.coffee b/assets/scripts/app/routes.coffee index 6d224156..031689aa 100644 --- a/assets/scripts/app/routes.coffee +++ b/assets/scripts/app/routes.coffee @@ -1,4 +1,5 @@ require 'travis/location' +require 'routes/application' Ember.Router.reopen location: (if testMode? then Ember.NoneLocation.create() else Travis.Location.create()) @@ -7,64 +8,6 @@ Ember.Router.reopen url = url.replace(/#.*?$/, '') @_super(url) -Travis.Route = Ember.Route.extend - beforeModel: (transition) -> - @auth.autoSignIn() unless @signedIn() - - if !@signedIn() && @get('needsAuth') - @auth.set('afterSignInTransition', transition) - Ember.RSVP.reject("needs-auth") - else - @_super.apply(this, arguments) - - signedIn: -> - @controllerFor('currentUser').get('model') - - needsAuth: (-> - # on pro, we need to auth on every route - Travis.config.pro - ).property() - -Travis.ApplicationRoute = Travis.Route.extend - needsAuth: false - - renderTemplate: -> - if Travis.config.pro - $('body').addClass('pro') - - @_super.apply(this, arguments) - - actions: - redirectToGettingStarted: -> - # do nothing, we handle it only in index path - - renderDefaultTemplate: -> - @renderDefaultTemplate() if @renderDefaultTemplate - - error: (error) -> - if error == 'needs-auth' - authController = @container.lookup('controller:auth') - authController.set('redirected', true) - @transitionTo('auth') - else - return true - - renderFirstSync: -> - @transitionTo 'first_sync' - - afterSignIn: -> - if transition = @auth.get('afterSignInTransition') - @auth.set('afterSignInTransition', null) - transition.retry() - else - @transitionTo('main') - - afterSignOut: -> - if Travis.config.pro - @transitionTo('auth') - else - @transitionTo('main') - Travis.Router.map -> @resource 'main', path: '/', -> @resource 'getting_started' diff --git a/assets/scripts/app/routes/application.coffee b/assets/scripts/app/routes/application.coffee new file mode 100644 index 00000000..04dc6a7c --- /dev/null +++ b/assets/scripts/app/routes/application.coffee @@ -0,0 +1,45 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + needsAuth: false + + renderTemplate: -> + if @get('config').pro + $('body').addClass('pro') + + @_super.apply(this, arguments) + + actions: + redirectToGettingStarted: -> + # do nothing, we handle it only in index path + + renderDefaultTemplate: -> + @renderDefaultTemplate() if @renderDefaultTemplate + + error: (error) -> + if error == 'needs-auth' + authController = @container.lookup('controller:auth') + authController.set('redirected', true) + @transitionTo('auth') + else + return true + + renderFirstSync: -> + @transitionTo 'first_sync' + + afterSignIn: -> + if transition = @auth.get('afterSignInTransition') + @auth.set('afterSignInTransition', null) + transition.retry() + else + @transitionTo('main') + + afterSignOut: -> + if @get('config').pro + @transitionTo('auth') + else + @transitionTo('main') + +Travis.ApplicationRoute = Route diff --git a/assets/scripts/app/routes/route.coffee b/assets/scripts/app/routes/route.coffee new file mode 100644 index 00000000..318bd68e --- /dev/null +++ b/assets/scripts/app/routes/route.coffee @@ -0,0 +1,19 @@ +Route = Ember.Route.extend + beforeModel: (transition) -> + @auth.autoSignIn() unless @signedIn() + + if !@signedIn() && @get('needsAuth') + @auth.set('afterSignInTransition', transition) + Ember.RSVP.reject("needs-auth") + else + @_super.apply(this, arguments) + + signedIn: -> + @controllerFor('currentUser').get('model') + + needsAuth: (-> + # on pro, we need to auth on every route + Travis.config.pro + ).property() + +Travis.Route = Route diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index 0690389f..e6691600 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -180,6 +180,7 @@ Travis.initializer application.register 'config:main', Travis.config, { instantiate: false } application.inject('controller', 'config', 'config:main') + application.inject('route', 'config', 'config:main') Travis.Router.reopen From 1ab14e9188b1428b65c1397277d9c74668e62842 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 14 Jan 2015 15:59:33 +0100 Subject: [PATCH 002/313] Extract routes to individual files --- assets/scripts/app/controllers.coffee | 2 +- assets/scripts/app/routes.coffee | 441 ++---------------- .../scripts/app/routes/abstract_builds.coffee | 26 ++ assets/scripts/app/routes/account.coffee | 20 + assets/scripts/app/routes/accounts.coffee | 15 + .../scripts/app/routes/accounts/index.coffee | 15 + .../scripts/app/routes/accounts/info.coffee | 14 + assets/scripts/app/routes/application.coffee | 2 +- assets/scripts/app/routes/auth.coffee | 25 + assets/scripts/app/routes/branches.coffee | 7 + assets/scripts/app/routes/build.coffee | 28 ++ assets/scripts/app/routes/builds.coffee | 7 + assets/scripts/app/routes/caches.coffee | 33 ++ assets/scripts/app/routes/env_vars.coffee | 10 + assets/scripts/app/routes/first_sync.coffee | 12 + .../scripts/app/routes/getting_started.coffee | 9 + .../insufficient_oauth_permissions.coffee | 12 + assets/scripts/app/routes/job.coffee | 29 ++ assets/scripts/app/routes/main.coffee | 19 + assets/scripts/app/routes/main/index.coffee | 10 + .../app/routes/main/my_repositories.coffee | 9 + assets/scripts/app/routes/main/recent.coffee | 9 + .../app/routes/main/repositories.coffee | 12 + assets/scripts/app/routes/main/search.coffee | 27 ++ assets/scripts/app/routes/main_tab.coffee | 30 ++ assets/scripts/app/routes/not_found.coffee | 11 + assets/scripts/app/routes/profile.coffee | 16 + .../scripts/app/routes/pull_requests.coffee | 18 + assets/scripts/app/routes/repo.coffee | 40 ++ assets/scripts/app/routes/repo/index.coffee | 21 + assets/scripts/app/routes/request.coffee | 14 + assets/scripts/app/routes/requests.coffee | 15 + assets/scripts/app/routes/settings.coffee | 10 + .../scripts/app/routes/settings/index.coffee | 11 + .../scripts/app/routes/simple_layout.coffee | 15 + assets/scripts/app/routes/ssh_key.coffee | 36 ++ assets/scripts/app/routes/stats.coffee | 12 + 37 files changed, 635 insertions(+), 407 deletions(-) create mode 100644 assets/scripts/app/routes/abstract_builds.coffee create mode 100644 assets/scripts/app/routes/account.coffee create mode 100644 assets/scripts/app/routes/accounts.coffee create mode 100644 assets/scripts/app/routes/accounts/index.coffee create mode 100644 assets/scripts/app/routes/accounts/info.coffee create mode 100644 assets/scripts/app/routes/auth.coffee create mode 100644 assets/scripts/app/routes/branches.coffee create mode 100644 assets/scripts/app/routes/build.coffee create mode 100644 assets/scripts/app/routes/builds.coffee create mode 100644 assets/scripts/app/routes/caches.coffee create mode 100644 assets/scripts/app/routes/env_vars.coffee create mode 100644 assets/scripts/app/routes/first_sync.coffee create mode 100644 assets/scripts/app/routes/getting_started.coffee create mode 100644 assets/scripts/app/routes/insufficient_oauth_permissions.coffee create mode 100644 assets/scripts/app/routes/job.coffee create mode 100644 assets/scripts/app/routes/main.coffee create mode 100644 assets/scripts/app/routes/main/index.coffee create mode 100644 assets/scripts/app/routes/main/my_repositories.coffee create mode 100644 assets/scripts/app/routes/main/recent.coffee create mode 100644 assets/scripts/app/routes/main/repositories.coffee create mode 100644 assets/scripts/app/routes/main/search.coffee create mode 100644 assets/scripts/app/routes/main_tab.coffee create mode 100644 assets/scripts/app/routes/not_found.coffee create mode 100644 assets/scripts/app/routes/profile.coffee create mode 100644 assets/scripts/app/routes/pull_requests.coffee create mode 100644 assets/scripts/app/routes/repo.coffee create mode 100644 assets/scripts/app/routes/repo/index.coffee create mode 100644 assets/scripts/app/routes/request.coffee create mode 100644 assets/scripts/app/routes/requests.coffee create mode 100644 assets/scripts/app/routes/settings.coffee create mode 100644 assets/scripts/app/routes/settings/index.coffee create mode 100644 assets/scripts/app/routes/simple_layout.coffee create mode 100644 assets/scripts/app/routes/ssh_key.coffee create mode 100644 assets/scripts/app/routes/stats.coffee diff --git a/assets/scripts/app/controllers.coffee b/assets/scripts/app/controllers.coffee index 4b62306d..22f829e4 100644 --- a/assets/scripts/app/controllers.coffee +++ b/assets/scripts/app/controllers.coffee @@ -40,7 +40,7 @@ Travis.FirstSyncController = Em.Controller.extend isSyncing: Ember.computed.alias('user.isSyncing') -Travis.IndexErrorController = Em.Controller.extend() +Travis.MainErrorController = Em.Controller.extend() Travis.BuildsItemController = Em.ObjectController.extend(Travis.GithubUrlProperties, needs: ['builds'] isPullRequestsListBinding: 'controllers.builds.isPullRequestsList' diff --git a/assets/scripts/app/routes.coffee b/assets/scripts/app/routes.coffee index 031689aa..96233579 100644 --- a/assets/scripts/app/routes.coffee +++ b/assets/scripts/app/routes.coffee @@ -44,408 +44,39 @@ Travis.Router.map -> @route 'notFound', path: "/*path" -Travis.RequestsRoute = Travis.Route.extend - needsAuth: true - setupController: -> - @_super.apply this, arguments - @controllerFor('repo').activate('requests') - - model: -> - Travis.Request.fetch repository_id: @modelFor('repo').get('id') - -Travis.CachesRoute = Travis.Route.extend - needsAuth: true - setupController: -> - @_super.apply this, arguments - @controllerFor('repo').activate('caches') - - model: -> - repo = @modelFor('repo') - Travis.ajax.get("/repos/#{repo.get('id')}/caches").then( (data) -> - groups = {} - data["caches"].forEach (cacheData) -> - branch = cacheData["branch"] - group = groups[branch] - unless group - group = groups[branch] = Ember.Object.create(branch: branch, caches: []) - cache = Ember.Object.create(cacheData) - cache.set('parent', group) - group.get('caches').pushObject(cache) - - result = [] - for branch, caches of groups - result.push caches - - result - ) - -Travis.RequestRoute = Travis.Route.extend - setupController: -> - @_super.apply this, arguments - @controllerFor('repo').activate('request') - - model: (params) -> - Travis.Request.fetch params.request_id - -Travis.GettingStartedRoute = Travis.Route.extend - renderTemplate: -> - @render('no_owned_repos') - -Travis.SimpleLayoutRoute = Travis.Route.extend - setupController: -> - $('body').attr('id', 'home') - toActivate = if @signedIn() then 'owned' else 'recent' - @container.lookup('controller:repos').activate(toActivate) - @_super.apply(this, arguments) - - renderTemplate: -> - @_super.apply(this, arguments) - -Travis.FirstSyncRoute = Travis.SimpleLayoutRoute.extend - actions: - redirectToGettingStarted: -> - # do nothing, we are showing first sync, so it's normal that there is - # no owned repos - -Travis.InsufficientOauthPermissionsRoute = Travis.SimpleLayoutRoute.extend - setupController: (controller) -> - @_super.apply this, arguments - existingUser = document.location.hash.match(/#existing[_-]user/) - controller.set('existingUser', existingUser) - -Travis.MainTabRoute = Travis.Route.extend - renderTemplate: -> - @render 'repo' - @render 'build', into: 'repo' - - setupController: -> - @_super.apply this, arguments - - @controllerFor('repo').activate('index') - @controllerFor('repos').activate(@get('reposTabName')) - - @currentRepoDidChange() - @controllerFor('repos').addObserver('firstObject', this, 'currentRepoDidChange') - - deactivate: -> - @controllerFor('repos').removeObserver('firstObject', this, 'currentRepoDidChange') - - currentRepoDidChange: -> - if repo = @controllerFor('repos').get('firstObject') - @controllerFor('repo').set('repo', repo) - - actions: - redirectToGettingStarted: -> - @transitionTo('getting_started') - -Travis.MainMyRepositoriesRoute = Travis.Route.extend - redirect: -> - @transitionTo("main.repositories") - -Travis.MainRepositoriesRoute = Travis.MainTabRoute.extend - needsAuth: true - reposTabName: 'owned' - afterModel: -> - @controllerFor('repos').possiblyRedirectToGettingStartedPage() - -Travis.MainRecentRoute = Travis.MainTabRoute.extend - reposTabName: 'recent' - -Travis.MainSearchRoute = Travis.MainTabRoute.extend - renderTemplate: -> - @render 'repo' - @render 'build', into: 'repo' - - setupController: (controller, searchPhrase) -> - # TODO: this method is almost the same as _super, refactor this - @controllerFor('repo').activate('index') - @controllerFor('repos').activate('search', searchPhrase) - - @currentRepoDidChange() - @controllerFor('repos').addObserver('firstObject', this, 'currentRepoDidChange') - - model: (params) -> - params.phrase - - deactivate: -> - @_super.apply(this, arguments) - - @controllerFor('repos').set('search', undefined) - -Travis.AbstractBuildsRoute = Travis.Route.extend - renderTemplate: -> - @render 'builds' - - setupController: -> - @controllerFor('repo').activate(@get('contentType')) - @contentDidChange() - @controllerFor('repo').addObserver(@get('path'), this, 'contentDidChange') - - deactivate: -> - @controllerFor('repo').removeObserver(@get('path'), this, 'contentDidChange') - - contentDidChange: -> - path = @get('path') - @controllerFor('builds').set('model', @controllerFor('repo').get(path)) - - path: (-> - type = @get('contentType') - "repo.#{type.camelize()}" - ).property('contentType') - -Travis.BuildsRoute = Travis.AbstractBuildsRoute.extend(contentType: 'builds') -Travis.BranchesRoute = Travis.AbstractBuildsRoute.extend(contentType: 'branches') -Travis.PullRequestsRoute = Travis.AbstractBuildsRoute.extend( - contentType: 'pull_requests' - - # TODO: it would be better to have separate controller for branches and PRs list - setupController: (controller, model) -> - @_super(controller, model) - - this.controllerFor('builds').set('isPullRequestsList', true) - - deactivate: -> - this.controllerFor('builds').set('isPullRequestsList', false) -) - -Travis.BuildRoute = Travis.Route.extend - serialize: (model, params) -> - id = if model.get then model.get('id') else model - - { build_id: id } - - setupController: (controller, model) -> - model = Travis.Build.find(model) if model && !model.get - - repo = @controllerFor('repo') - #repo.set('build', model) - @controllerFor('build').set('build', model) - repo.activate('build') - #repo.set('build', model) - - model: (params) -> - Travis.Build.fetch(params.build_id) - - deactivate: -> - @controllerFor('job').set('job', null) - @controllerFor('build').set('build', null) - -Travis.JobRoute = Travis.Route.extend - serialize: (model, params) -> - id = if model.get then model.get('id') else model - - { job_id: id } - - setupController: (controller, model) -> - model = Travis.Job.find(model) if model && !model.get - - repo = @controllerFor('repo') - @controllerFor('job').set('job', model) - repo.activate('job') - - if build = model.get('build') - @controllerFor('build').set('build', build) - - model: (params) -> - Travis.Job.fetch(params.job_id) - - deactivate: -> - @controllerFor('build').set('build', null) - @controllerFor('job').set('job', null) - - -Travis.RepoIndexRoute = Travis.Route.extend - setupController: (controller, model) -> - @_super.apply this, arguments - @controllerFor('repo').activate('current') - - renderTemplate: -> - if @modelFor('repo').get('lastBuildId') - @render 'build' - else - @render 'builds/not_found' - - deactivate: -> - repo = @controllerFor('repo') - @controllerFor('build').set('build', null) - @controllerFor('job').set('job', null) - -Travis.RepoRoute = Travis.Route.extend - renderTemplate: -> - @render 'repo', into: 'main' - - setupController: (controller, model) -> - # TODO: if repo is just a data hash with id and slug load it - # as incomplete record - model = Travis.Repo.find(model.id) if model && !model.get - controller.set('repo', model) - - serialize: (repo) -> - slug = if repo.get then repo.get('slug') else repo.slug - [owner, name] = slug.split('/') - { owner: owner, name: name } - - model: (params) -> - slug = "#{params.owner}/#{params.name}" - Travis.Repo.fetchBySlug(slug) - - resetController: -> - @controllerFor('repo').deactivate() - - actions: - error: (error) -> - # if error throwed has a slug (ie. it was probably repo not found) - # set the slug on main.error controller to allow to properly - # display the repo information - if error.slug - this.controllerFor('main.error').set('slug', error.slug) - - # bubble to the top - return true - -Travis.MainIndexRoute = Travis.Route.extend - redirect: -> - target = if @signedIn() then 'repositories' else 'recent' - @transitionTo("main.#{target}") - -Travis.MainRoute = Travis.Route.extend - renderTemplate: -> - $('body').attr('id', 'home') - - @_super.apply this, arguments - - @render 'repos', outlet: 'left', into: 'main' - - setupController: (controller)-> - # TODO: this is redundant with repositories and recent routes - toActivate = if @signedIn() then 'owned' else 'recent' - @container.lookup('controller:repos').activate(toActivate) - -Travis.StatsRoute = Travis.Route.extend - renderTemplate: -> - $('body').attr('id', 'stats') - - @render 'stats' - -Travis.NotFoundRoute = Travis.Route.extend - renderTemplate: -> - $('body').attr('id', 'not-found') - - @render 'not_found' - -Travis.ProfileRoute = Travis.Route.extend - needsAuth: true - - setupController: (controller, model) -> - @controllerFor('accounts').set('model', model) - - renderTemplate: -> - $('body').attr('id', 'profile') - @_super.apply(this, arguments) - @render 'loading', outlet: 'left', into: 'profile' - -Travis.AccountsRoute = Travis.Route.extend - model: -> - Travis.Account.fetch(all: true) - - renderTemplate: -> - @_super.apply(this, arguments) - @render 'profile_accounts', outlet: 'left', into: 'profile' - -Travis.AccountsIndexRoute = Travis.Route.extend - redirect: -> - # TODO: setting accounts model in ProfileRoute is wrong, but - # at this stage it's better than what we had before - accounts = @modelFor('accounts') - login = @controllerFor('currentUser').get('login') - account = accounts.find (account) -> account.get('login') == login - @replaceWith 'account', account - -Travis.AccountRoute = Travis.Route.extend - setupController: (controller, account) -> - @_super.apply this, arguments - - @controllerFor('profile').activate 'hooks' - - model: (params) -> - @modelFor('accounts').find (account) -> account.get('login') == params.login - - serialize: (account) -> - if account && account.get - { login: account.get('login') } - else - {} - -Travis.AccountsInfoRoute = Travis.Route.extend - setupController: -> - user = @controllerFor('currentUser').get('model') - @controllerFor('account').set('model', user) - @controllerFor('profile').activate 'user' - - renderTemplate: -> - @render 'accounts_info' - -Travis.AuthRoute = Travis.Route.extend - needsAuth: false - - renderTemplate: -> - $('body').attr('id', 'auth') - - @render 'auth.signin' - - deactivate: -> - @controllerFor('auth').set('redirected', false) - - actions: - afterSignIn: -> - @transitionTo('index') - return true - - redirect: -> - if @signedIn() - @transitionTo('index') - -Travis.SettingsRoute = Travis.Route.extend - needsAuth: true - setupController: (controller, model) -> - @controllerFor('repo').activate('settings') - -Travis.SettingsIndexRoute = Travis.Route.extend - model: -> - repo = @modelFor('repo') - repo.fetchSettings().then (settings) -> - repo.set('settings', settings) - -Travis.EnvVarsRoute = Travis.Route.extend - model: (params) -> - repo = @modelFor('repo') - repo.get('envVars.promise') - -Travis.SshKeyRoute = Travis.Route.extend - model: (params) -> - repo = @modelFor('repo') - self = this - Travis.SshKey.fetch(repo.get('id')).then ( (result) -> result unless result.get('isNew') ), (xhr) -> - if xhr.status == 404 - # if there is no model, just return null. I'm not sure if this is the - # best answer, maybe we should just redirect to different route, like - # ssh_key.new or ssh_key.no_key - return null - - afterModel: (model, transition) -> - repo = @modelFor('repo') - Travis.ajax.get "/repositories/#{repo.get('id')}/key", (data) => - @defaultKey = Ember.Object.create(fingerprint: data.fingerprint) - - setupController: (controller, model) -> - controller.reset() - @_super.apply this, arguments - - if @defaultKey - controller.set('defaultKey', @defaultKey) - @defaultKey = null - - deactivate: -> - @_super.apply(this, arguments) - - @controllerFor('ssh_key').send('cancel') +require 'routes/abstract_builds' +require 'routes/account' +require 'routes/accounts/index' +require 'routes/accounts/info' +require 'routes/accounts' +require 'routes/application' +require 'routes/auth' +require 'routes/branches' +require 'routes/build' +require 'routes/builds' +require 'routes/caches' +require 'routes/env_vars' +require 'routes/first_sync' +require 'routes/getting_started' +require 'routes/insufficient_oauth_permissions' +require 'routes/job' +require 'routes/main/index' +require 'routes/main/my_repositories' +require 'routes/main/recent' +require 'routes/main/repositories' +require 'routes/main/search' +require 'routes/main' +require 'routes/main_tab' +require 'routes/not_found' +require 'routes/profile' +require 'routes/pull_requests' +require 'routes/repo/index' +require 'routes/repo' +require 'routes/request' +require 'routes/requests' +require 'routes/route' +require 'routes/settings/index' +require 'routes/settings' +require 'routes/simple_layout' +require 'routes/ssh_key' +require 'routes/stats' diff --git a/assets/scripts/app/routes/abstract_builds.coffee b/assets/scripts/app/routes/abstract_builds.coffee new file mode 100644 index 00000000..8be8dcc2 --- /dev/null +++ b/assets/scripts/app/routes/abstract_builds.coffee @@ -0,0 +1,26 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + renderTemplate: -> + @render 'builds' + + setupController: -> + @controllerFor('repo').activate(@get('contentType')) + @contentDidChange() + @controllerFor('repo').addObserver(@get('path'), this, 'contentDidChange') + + deactivate: -> + @controllerFor('repo').removeObserver(@get('path'), this, 'contentDidChange') + + contentDidChange: -> + path = @get('path') + @controllerFor('builds').set('model', @controllerFor('repo').get(path)) + + path: (-> + type = @get('contentType') + "repo.#{type.camelize()}" + ).property('contentType') + +Travis.AbstractBuildsRoute = Route diff --git a/assets/scripts/app/routes/account.coffee b/assets/scripts/app/routes/account.coffee new file mode 100644 index 00000000..6d57970a --- /dev/null +++ b/assets/scripts/app/routes/account.coffee @@ -0,0 +1,20 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + setupController: (controller, account) -> + @_super.apply this, arguments + + @controllerFor('profile').activate 'hooks' + + model: (params) -> + @modelFor('accounts').find (account) -> account.get('login') == params.login + + serialize: (account) -> + if account && account.get + { login: account.get('login') } + else + {} + +Travis.AccountRoute = Route diff --git a/assets/scripts/app/routes/accounts.coffee b/assets/scripts/app/routes/accounts.coffee new file mode 100644 index 00000000..5834b65c --- /dev/null +++ b/assets/scripts/app/routes/accounts.coffee @@ -0,0 +1,15 @@ +require 'routes/route' + +Account = Travis.Account +TravisRoute = Travis.Route + +Route = TravisRoute.extend + model: -> + Account.fetch(all: true) + + renderTemplate: -> + @_super.apply(this, arguments) + @render 'profile_accounts', outlet: 'left', into: 'profile' + + +Travis.AccountsRoute = Route diff --git a/assets/scripts/app/routes/accounts/index.coffee b/assets/scripts/app/routes/accounts/index.coffee new file mode 100644 index 00000000..2cff27a1 --- /dev/null +++ b/assets/scripts/app/routes/accounts/index.coffee @@ -0,0 +1,15 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + redirect: -> + # TODO: setting accounts model in ProfileRoute is wrong, but + # at this stage it's better than what we had before + accounts = @modelFor('accounts') + login = @controllerFor('currentUser').get('login') + account = accounts.find (account) -> account.get('login') == login + @replaceWith 'account', account + + +Travis.AccountsIndexRoute = Route diff --git a/assets/scripts/app/routes/accounts/info.coffee b/assets/scripts/app/routes/accounts/info.coffee new file mode 100644 index 00000000..5ae60a67 --- /dev/null +++ b/assets/scripts/app/routes/accounts/info.coffee @@ -0,0 +1,14 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + setupController: -> + user = @controllerFor('currentUser').get('model') + @controllerFor('account').set('model', user) + @controllerFor('profile').activate 'user' + + renderTemplate: -> + @render 'accounts_info' + +Travis.AccountsInfoRoute = Route diff --git a/assets/scripts/app/routes/application.coffee b/assets/scripts/app/routes/application.coffee index 04dc6a7c..35bbe540 100644 --- a/assets/scripts/app/routes/application.coffee +++ b/assets/scripts/app/routes/application.coffee @@ -1,6 +1,6 @@ require 'routes/route' -TravisRoute = Travis.Route +TravisRoute = TravisRoute Route = TravisRoute.extend needsAuth: false diff --git a/assets/scripts/app/routes/auth.coffee b/assets/scripts/app/routes/auth.coffee new file mode 100644 index 00000000..2cbaa689 --- /dev/null +++ b/assets/scripts/app/routes/auth.coffee @@ -0,0 +1,25 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + needsAuth: false + + renderTemplate: -> + $('body').attr('id', 'auth') + + @render 'auth.signin' + + deactivate: -> + @controllerFor('auth').set('redirected', false) + + actions: + afterSignIn: -> + @transitionTo('index') + return true + + redirect: -> + if @signedIn() + @transitionTo('index') + +Travis.AuthRoute = Route diff --git a/assets/scripts/app/routes/branches.coffee b/assets/scripts/app/routes/branches.coffee new file mode 100644 index 00000000..b7059dbb --- /dev/null +++ b/assets/scripts/app/routes/branches.coffee @@ -0,0 +1,7 @@ +require 'routes/route' + +AbstractBuildsRoute = Travis.AbstractBuildsRoute + +Route = AbstractBuildsRoute.extend(contentType: 'branches') + +Travis.BranchesRoute = Route diff --git a/assets/scripts/app/routes/build.coffee b/assets/scripts/app/routes/build.coffee new file mode 100644 index 00000000..c85d9936 --- /dev/null +++ b/assets/scripts/app/routes/build.coffee @@ -0,0 +1,28 @@ +require 'routes/route' + +Build = Travis.Build +TravisRoute = Travis.Route + +Route = TravisRoute.extend + serialize: (model, params) -> + id = if model.get then model.get('id') else model + + { build_id: id } + + setupController: (controller, model) -> + model = Build.find(model) if model && !model.get + + repo = @controllerFor('repo') + #repo.set('build', model) + @controllerFor('build').set('build', model) + repo.activate('build') + #repo.set('build', model) + + model: (params) -> + Build.fetch(params.build_id) + + deactivate: -> + @controllerFor('job').set('job', null) + @controllerFor('build').set('build', null) + +Travis.BuildRoute = Route diff --git a/assets/scripts/app/routes/builds.coffee b/assets/scripts/app/routes/builds.coffee new file mode 100644 index 00000000..140145b6 --- /dev/null +++ b/assets/scripts/app/routes/builds.coffee @@ -0,0 +1,7 @@ +require 'routes/route' + +AbstractBuildsRoute = Travis.AbstractBuildsRoute + +Route = AbstractBuildsRoute.extend(contentType: 'builds') + +Travis.BuildsRoute = Route diff --git a/assets/scripts/app/routes/caches.coffee b/assets/scripts/app/routes/caches.coffee new file mode 100644 index 00000000..a6a1db7d --- /dev/null +++ b/assets/scripts/app/routes/caches.coffee @@ -0,0 +1,33 @@ +require 'routes/route' + +Request = Travis.Request +Ajax = Travis.ajax +TravisRoute = Travis.Route + +Route = TravisRoute.extend + needsAuth: true + setupController: -> + @_super.apply this, arguments + @controllerFor('repo').activate('caches') + + model: -> + repo = @modelFor('repo') + Ajax.get("/repos/#{repo.get('id')}/caches").then( (data) -> + groups = {} + data["caches"].forEach (cacheData) -> + branch = cacheData["branch"] + group = groups[branch] + unless group + group = groups[branch] = Ember.Object.create(branch: branch, caches: []) + cache = Ember.Object.create(cacheData) + cache.set('parent', group) + group.get('caches').pushObject(cache) + + result = [] + for branch, caches of groups + result.push caches + + result + ) + +Travis.CachesRoute = Route diff --git a/assets/scripts/app/routes/env_vars.coffee b/assets/scripts/app/routes/env_vars.coffee new file mode 100644 index 00000000..9f49908b --- /dev/null +++ b/assets/scripts/app/routes/env_vars.coffee @@ -0,0 +1,10 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + model: (params) -> + repo = @modelFor('repo') + repo.get('envVars.promise') + +Travis.EnvVarsRoute = Route diff --git a/assets/scripts/app/routes/first_sync.coffee b/assets/scripts/app/routes/first_sync.coffee new file mode 100644 index 00000000..66d90319 --- /dev/null +++ b/assets/scripts/app/routes/first_sync.coffee @@ -0,0 +1,12 @@ +require 'routes/route' +require 'routes/simple_layout' + +SimpleLayoutRoute = Travis.SimpleLayoutRoute + +Route = SimpleLayoutRoute.extend + actions: + redirectToGettingStarted: -> + # do nothing, we are showing first sync, so it's normal that there is + # no owned repos + +Travis.FirstSyncRoute = Route diff --git a/assets/scripts/app/routes/getting_started.coffee b/assets/scripts/app/routes/getting_started.coffee new file mode 100644 index 00000000..66c9a810 --- /dev/null +++ b/assets/scripts/app/routes/getting_started.coffee @@ -0,0 +1,9 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + renderTemplate: -> + @render('no_owned_repos') + +Travis.GettingStartedRoute = Route diff --git a/assets/scripts/app/routes/insufficient_oauth_permissions.coffee b/assets/scripts/app/routes/insufficient_oauth_permissions.coffee new file mode 100644 index 00000000..282174d2 --- /dev/null +++ b/assets/scripts/app/routes/insufficient_oauth_permissions.coffee @@ -0,0 +1,12 @@ +require 'routes/route' +require 'routes/simple_layout' + +SimpleLayoutRoute = Travis.SimpleLayoutRoute + +Route = SimpleLayoutRoute.extend + setupController: (controller) -> + @_super.apply this, arguments + existingUser = document.location.hash.match(/#existing[_-]user/) + controller.set('existingUser', existingUser) + +Travis.InsufficientOauthPermissionsRoute = Route diff --git a/assets/scripts/app/routes/job.coffee b/assets/scripts/app/routes/job.coffee new file mode 100644 index 00000000..60d50fdc --- /dev/null +++ b/assets/scripts/app/routes/job.coffee @@ -0,0 +1,29 @@ +require 'routes/route' + +Job = Travis.Job +TravisRoute = Travis.Route + +Route = TravisRoute.extend + serialize: (model, params) -> + id = if model.get then model.get('id') else model + + { job_id: id } + + setupController: (controller, model) -> + model = Job.find(model) if model && !model.get + + repo = @controllerFor('repo') + @controllerFor('job').set('job', model) + repo.activate('job') + + if build = model.get('build') + @controllerFor('build').set('build', build) + + model: (params) -> + Job.fetch(params.job_id) + + deactivate: -> + @controllerFor('build').set('build', null) + @controllerFor('job').set('job', null) + +Travis.JobRoute = Route diff --git a/assets/scripts/app/routes/main.coffee b/assets/scripts/app/routes/main.coffee new file mode 100644 index 00000000..b5bf6bb5 --- /dev/null +++ b/assets/scripts/app/routes/main.coffee @@ -0,0 +1,19 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + renderTemplate: -> + $('body').attr('id', 'home') + + @_super.apply this, arguments + + @render 'repos', outlet: 'left', into: 'main' + + setupController: (controller)-> + # TODO: this is redundant with repositories and recent routes + toActivate = if @signedIn() then 'owned' else 'recent' + @container.lookup('controller:repos').activate(toActivate) + + +Travis.MainRoute = Route diff --git a/assets/scripts/app/routes/main/index.coffee b/assets/scripts/app/routes/main/index.coffee new file mode 100644 index 00000000..d1cc2ced --- /dev/null +++ b/assets/scripts/app/routes/main/index.coffee @@ -0,0 +1,10 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + redirect: -> + target = if @signedIn() then 'repositories' else 'recent' + @transitionTo("main.#{target}") + +Travis.MainIndexRoute = Route diff --git a/assets/scripts/app/routes/main/my_repositories.coffee b/assets/scripts/app/routes/main/my_repositories.coffee new file mode 100644 index 00000000..29250a73 --- /dev/null +++ b/assets/scripts/app/routes/main/my_repositories.coffee @@ -0,0 +1,9 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + redirect: -> + @transitionTo("main.repositories") + +Travis.MainMyRepositoriesRoute = Route diff --git a/assets/scripts/app/routes/main/recent.coffee b/assets/scripts/app/routes/main/recent.coffee new file mode 100644 index 00000000..eb87a416 --- /dev/null +++ b/assets/scripts/app/routes/main/recent.coffee @@ -0,0 +1,9 @@ +require 'routes/route' +require 'routes/main_tab' + +MainTabRoute = Travis.MainTabRoute + +Route = MainTabRoute.extend + reposTabName: 'recent' + +Travis.MainRecentRoute = Route diff --git a/assets/scripts/app/routes/main/repositories.coffee b/assets/scripts/app/routes/main/repositories.coffee new file mode 100644 index 00000000..1f43e052 --- /dev/null +++ b/assets/scripts/app/routes/main/repositories.coffee @@ -0,0 +1,12 @@ +require 'routes/route' +require 'routes/main_tab' + +MainTabRoute = Travis.MainTabRoute + +Route = MainTabRoute.extend + needsAuth: true + reposTabName: 'owned' + afterModel: -> + @controllerFor('repos').possiblyRedirectToGettingStartedPage() + +Travis.MainRepositoriesRoute = Route diff --git a/assets/scripts/app/routes/main/search.coffee b/assets/scripts/app/routes/main/search.coffee new file mode 100644 index 00000000..590e9b93 --- /dev/null +++ b/assets/scripts/app/routes/main/search.coffee @@ -0,0 +1,27 @@ +require 'routes/route' +require 'routes/main_tab' + +MainTabRoute = Travis.MainTabRoute + +Route = MainTabRoute.extend + renderTemplate: -> + @render 'repo' + @render 'build', into: 'repo' + + setupController: (controller, searchPhrase) -> + # TODO: this method is almost the same as _super, refactor this + @controllerFor('repo').activate('index') + @controllerFor('repos').activate('search', searchPhrase) + + @currentRepoDidChange() + @controllerFor('repos').addObserver('firstObject', this, 'currentRepoDidChange') + + model: (params) -> + params.phrase + + deactivate: -> + @_super.apply(this, arguments) + + @controllerFor('repos').set('search', undefined) + +Travis.MainSearchRoute = Route diff --git a/assets/scripts/app/routes/main_tab.coffee b/assets/scripts/app/routes/main_tab.coffee new file mode 100644 index 00000000..28c4872f --- /dev/null +++ b/assets/scripts/app/routes/main_tab.coffee @@ -0,0 +1,30 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + renderTemplate: -> + @render 'repo' + @render 'build', into: 'repo' + + setupController: -> + @_super.apply this, arguments + + @controllerFor('repo').activate('index') + @controllerFor('repos').activate(@get('reposTabName')) + + @currentRepoDidChange() + @controllerFor('repos').addObserver('firstObject', this, 'currentRepoDidChange') + + deactivate: -> + @controllerFor('repos').removeObserver('firstObject', this, 'currentRepoDidChange') + + currentRepoDidChange: -> + if repo = @controllerFor('repos').get('firstObject') + @controllerFor('repo').set('repo', repo) + + actions: + redirectToGettingStarted: -> + @transitionTo('getting_started') + +Travis.MainTabRoute = Route diff --git a/assets/scripts/app/routes/not_found.coffee b/assets/scripts/app/routes/not_found.coffee new file mode 100644 index 00000000..49feb919 --- /dev/null +++ b/assets/scripts/app/routes/not_found.coffee @@ -0,0 +1,11 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + renderTemplate: -> + $('body').attr('id', 'not-found') + + @render 'not_found' + +Travis.NotFoundRoute = Route diff --git a/assets/scripts/app/routes/profile.coffee b/assets/scripts/app/routes/profile.coffee new file mode 100644 index 00000000..be14a502 --- /dev/null +++ b/assets/scripts/app/routes/profile.coffee @@ -0,0 +1,16 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + needsAuth: true + + setupController: (controller, model) -> + @controllerFor('accounts').set('model', model) + + renderTemplate: -> + $('body').attr('id', 'profile') + @_super.apply(this, arguments) + @render 'loading', outlet: 'left', into: 'profile' + +Travis.ProfileRoute = Route diff --git a/assets/scripts/app/routes/pull_requests.coffee b/assets/scripts/app/routes/pull_requests.coffee new file mode 100644 index 00000000..cf908fbf --- /dev/null +++ b/assets/scripts/app/routes/pull_requests.coffee @@ -0,0 +1,18 @@ +require 'routes/route' + +AbstractBuildsRoute = Travis.AbstractBuildsRoute + +Route = AbstractBuildsRoute.extend( + contentType: 'pull_requests' + + # TODO: it would be better to have separate controller for branches and PRs list + setupController: (controller, model) -> + @_super(controller, model) + + this.controllerFor('builds').set('isPullRequestsList', true) + + deactivate: -> + this.controllerFor('builds').set('isPullRequestsList', false) +) + +Travis.PullRequestsRoute = Route diff --git a/assets/scripts/app/routes/repo.coffee b/assets/scripts/app/routes/repo.coffee new file mode 100644 index 00000000..9fe65b3b --- /dev/null +++ b/assets/scripts/app/routes/repo.coffee @@ -0,0 +1,40 @@ +require 'routes/route' +require 'models/repo' + +Repo = Travis.Repo +TravisRoute = Travis.Route + +Route = TravisRoute.extend + renderTemplate: -> + @render 'repo', into: 'main' + + setupController: (controller, model) -> + # TODO: if repo is just a data hash with id and slug load it + # as incomplete record + model = Repo.find(model.id) if model && !model.get + controller.set('repo', model) + + serialize: (repo) -> + slug = if repo.get then repo.get('slug') else repo.slug + [owner, name] = slug.split('/') + { owner: owner, name: name } + + model: (params) -> + slug = "#{params.owner}/#{params.name}" + Repo.fetchBySlug(slug) + + resetController: -> + @controllerFor('repo').deactivate() + + actions: + error: (error) -> + # if error throwed has a slug (ie. it was probably repo not found) + # set the slug on main.error controller to allow to properly + # display the repo information + if error.slug + this.controllerFor('main.error').set('slug', error.slug) + + # bubble to the top + return true + +Travis.RepoRoute = Route diff --git a/assets/scripts/app/routes/repo/index.coffee b/assets/scripts/app/routes/repo/index.coffee new file mode 100644 index 00000000..3d8257b3 --- /dev/null +++ b/assets/scripts/app/routes/repo/index.coffee @@ -0,0 +1,21 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + setupController: (controller, model) -> + @_super.apply this, arguments + @controllerFor('repo').activate('current') + + renderTemplate: -> + if @modelFor('repo').get('lastBuildId') + @render 'build' + else + @render 'builds/not_found' + + deactivate: -> + repo = @controllerFor('repo') + @controllerFor('build').set('build', null) + @controllerFor('job').set('job', null) + +Travis.RepoIndexRoute = Route diff --git a/assets/scripts/app/routes/request.coffee b/assets/scripts/app/routes/request.coffee new file mode 100644 index 00000000..bca14684 --- /dev/null +++ b/assets/scripts/app/routes/request.coffee @@ -0,0 +1,14 @@ +require 'routes/route' + +Request = Travis.Request +TravisRoute = Travis.Route + +Route = TravisRoute.extend + setupController: -> + @_super.apply this, arguments + @controllerFor('repo').activate('request') + + model: (params) -> + Request.fetch params.request_id + +Travis.RequestRoute = Route diff --git a/assets/scripts/app/routes/requests.coffee b/assets/scripts/app/routes/requests.coffee new file mode 100644 index 00000000..ac60955b --- /dev/null +++ b/assets/scripts/app/routes/requests.coffee @@ -0,0 +1,15 @@ +require 'routes/route' + +TravisRoute = Travis.Route +Request = Travis.Request + +Route = TravisRoute.extend + needsAuth: true + setupController: -> + @_super.apply this, arguments + @controllerFor('repo').activate('requests') + + model: -> + Request.fetch repository_id: @modelFor('repo').get('id') + +Travis.RequestRoute = Route diff --git a/assets/scripts/app/routes/settings.coffee b/assets/scripts/app/routes/settings.coffee new file mode 100644 index 00000000..17513bb5 --- /dev/null +++ b/assets/scripts/app/routes/settings.coffee @@ -0,0 +1,10 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + needsAuth: true + setupController: (controller, model) -> + @controllerFor('repo').activate('settings') + +Travis.SettingsRoute = Route diff --git a/assets/scripts/app/routes/settings/index.coffee b/assets/scripts/app/routes/settings/index.coffee new file mode 100644 index 00000000..bcee0222 --- /dev/null +++ b/assets/scripts/app/routes/settings/index.coffee @@ -0,0 +1,11 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + model: -> + repo = @modelFor('repo') + repo.fetchSettings().then (settings) -> + repo.set('settings', settings) + +Travis.SettingsIndexRoute = Route diff --git a/assets/scripts/app/routes/simple_layout.coffee b/assets/scripts/app/routes/simple_layout.coffee new file mode 100644 index 00000000..39e7cc86 --- /dev/null +++ b/assets/scripts/app/routes/simple_layout.coffee @@ -0,0 +1,15 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + setupController: -> + $('body').attr('id', 'home') + toActivate = if @signedIn() then 'owned' else 'recent' + @container.lookup('controller:repos').activate(toActivate) + @_super.apply(this, arguments) + + renderTemplate: -> + @_super.apply(this, arguments) + +Travis.SimpleLayoutRoute = Route diff --git a/assets/scripts/app/routes/ssh_key.coffee b/assets/scripts/app/routes/ssh_key.coffee new file mode 100644 index 00000000..6aaaa362 --- /dev/null +++ b/assets/scripts/app/routes/ssh_key.coffee @@ -0,0 +1,36 @@ +require 'routes/route' + +SshKey = Travis.SshKey +Ajax = Travis.ajax +TravisRoute = Travis.Route + +Route = TravisRoute.extend + model: (params) -> + repo = @modelFor('repo') + self = this + SshKey.fetch(repo.get('id')).then ( (result) -> result unless result.get('isNew') ), (xhr) -> + if xhr.status == 404 + # if there is no model, just return null. I'm not sure if this is the + # best answer, maybe we should just redirect to different route, like + # ssh_key.new or ssh_key.no_key + return null + + afterModel: (model, transition) -> + repo = @modelFor('repo') + Ajax.get "/repositories/#{repo.get('id')}/key", (data) => + @defaultKey = Ember.Object.create(fingerprint: data.fingerprint) + + setupController: (controller, model) -> + controller.reset() + @_super.apply this, arguments + + if @defaultKey + controller.set('defaultKey', @defaultKey) + @defaultKey = null + + deactivate: -> + @_super.apply(this, arguments) + + @controllerFor('ssh_key').send('cancel') + +Travis.SshKeyRoute = Route diff --git a/assets/scripts/app/routes/stats.coffee b/assets/scripts/app/routes/stats.coffee new file mode 100644 index 00000000..2b39dae0 --- /dev/null +++ b/assets/scripts/app/routes/stats.coffee @@ -0,0 +1,12 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend + renderTemplate: -> + $('body').attr('id', 'stats') + + @render 'stats' + + +Travis.StatsRoute = Route From a891892bd83f91f5dc479abdfe82e69d2232a3dc Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 14 Jan 2015 18:20:26 +0100 Subject: [PATCH 003/313] Add missing requires in routes --- assets/scripts/app/helpers/helpers.coffee | 19 ++++++++++--------- assets/scripts/app/models/build.coffee | 1 + assets/scripts/app/models/job.coffee | 1 + assets/scripts/app/routes/accounts.coffee | 1 + assets/scripts/app/routes/application.coffee | 2 +- assets/scripts/app/routes/build.coffee | 1 + assets/scripts/app/routes/caches.coffee | 2 ++ assets/scripts/app/routes/job.coffee | 1 + assets/scripts/app/routes/request.coffee | 1 + assets/scripts/app/routes/requests.coffee | 1 + assets/scripts/app/routes/ssh_key.coffee | 2 ++ 11 files changed, 22 insertions(+), 10 deletions(-) diff --git a/assets/scripts/app/helpers/helpers.coffee b/assets/scripts/app/helpers/helpers.coffee index 42cd88f1..ff935922 100644 --- a/assets/scripts/app/helpers/helpers.coffee +++ b/assets/scripts/app/helpers/helpers.coffee @@ -4,7 +4,6 @@ require 'helpers/urls' config_keys_map = Travis.CONFIG_KEYS_MAP config = Travis.config githubCommitUrl = Travis.Urls.githubCommit -currentDate = Travis.currentDate timeago = $.timeago intersect = $.intersect only = $.only @@ -47,9 +46,9 @@ formatConfig = (config) -> formatMessage = (message, options) -> message = message || '' message = message.split(/\n/)[0] if options.short - message = @_emojize(@_escape(message)) + message = _emojize(_escape(message)) if !!options.repo - message = @githubify(message, options.repo.get('owner'), options.repo.get('name')) + message = githubify(message, options.repo.get('owner'), options.repo.get('name')) if !!options.pre message = message.replace /\n/g, '
' message @@ -61,8 +60,8 @@ timeAgoInWords = (date) -> timeago.distanceInWords date durationFrom = (started, finished) -> - started = started and @_toUtc(new Date(@_normalizeDateString(started))) - finished = if finished then @_toUtc(new Date(@_normalizeDateString(finished))) else @_nowUtc() + started = started and _toUtc(new Date(_normalizeDateString(started))) + finished = if finished then _toUtc(new Date(_normalizeDateString(finished))) else _nowUtc() if started && finished then Math.round((finished - started) / 1000) else 0 timeInWords = (duration) -> @@ -83,11 +82,11 @@ timeInWords = (duration) -> githubify = (text, owner, repo) -> self = this - text = text.replace @_githubReferenceRegexp, (reference, matchedOwner, matchedRepo, matchedNumber) -> + text = text.replace _githubReferenceRegexp, (reference, matchedOwner, matchedRepo, matchedNumber) -> self._githubReferenceLink(reference, { owner: owner, repo: repo }, { owner: matchedOwner, repo: matchedRepo, number: matchedNumber } ) - text = text.replace @_githubUserRegexp, (reference, username) -> + text = text.replace _githubUserRegexp, (reference, username) -> self._githubUserLink(reference, username) - text = text.replace @_githubCommitReferenceRegexp, (reference, matchedOwner, matchedRepo, matchedSHA) -> + text = text.replace _githubCommitReferenceRegexp, (reference, matchedOwner, matchedRepo, matchedSHA) -> self._githubCommitReferenceLink(reference, { owner: owner, repo: repo }, { owner: matchedOwner, repo: matchedRepo, sha: matchedSHA }) text @@ -118,7 +117,9 @@ _normalizeDateString = (string) -> string _nowUtc = -> - @_toUtc currentDate() + # TODO: we overwrite Travis.currentDate in tests, so we need to leave this + # global usage as it is for now, but it should be removed at some point + _toUtc Travis.currentDate() _toUtc = (date) -> Date.UTC date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds() diff --git a/assets/scripts/app/models/build.coffee b/assets/scripts/app/models/build.coffee index a83fcf91..da755cd7 100644 --- a/assets/scripts/app/models/build.coffee +++ b/assets/scripts/app/models/build.coffee @@ -1,4 +1,5 @@ require 'travis/model' +require 'models/extensions' @Travis.Build = Travis.Model.extend Travis.DurationCalculations, repositoryId: Ember.attr('number') diff --git a/assets/scripts/app/models/job.coffee b/assets/scripts/app/models/job.coffee index b1d20d25..62824c60 100644 --- a/assets/scripts/app/models/job.coffee +++ b/assets/scripts/app/models/job.coffee @@ -1,4 +1,5 @@ require 'travis/model' +require 'models/extensions' @Travis.Job = Travis.Model.extend Travis.DurationCalculations, repoId: Ember.attr('string', key: 'repository_id') diff --git a/assets/scripts/app/routes/accounts.coffee b/assets/scripts/app/routes/accounts.coffee index 5834b65c..f5948f85 100644 --- a/assets/scripts/app/routes/accounts.coffee +++ b/assets/scripts/app/routes/accounts.coffee @@ -1,4 +1,5 @@ require 'routes/route' +require 'models/account' Account = Travis.Account TravisRoute = Travis.Route diff --git a/assets/scripts/app/routes/application.coffee b/assets/scripts/app/routes/application.coffee index 35bbe540..04dc6a7c 100644 --- a/assets/scripts/app/routes/application.coffee +++ b/assets/scripts/app/routes/application.coffee @@ -1,6 +1,6 @@ require 'routes/route' -TravisRoute = TravisRoute +TravisRoute = Travis.Route Route = TravisRoute.extend needsAuth: false diff --git a/assets/scripts/app/routes/build.coffee b/assets/scripts/app/routes/build.coffee index c85d9936..ac762ce9 100644 --- a/assets/scripts/app/routes/build.coffee +++ b/assets/scripts/app/routes/build.coffee @@ -1,4 +1,5 @@ require 'routes/route' +require 'models/build' Build = Travis.Build TravisRoute = Travis.Route diff --git a/assets/scripts/app/routes/caches.coffee b/assets/scripts/app/routes/caches.coffee index a6a1db7d..d478d3f3 100644 --- a/assets/scripts/app/routes/caches.coffee +++ b/assets/scripts/app/routes/caches.coffee @@ -1,4 +1,6 @@ require 'routes/route' +require 'models/request' +require 'travis/ajax' Request = Travis.Request Ajax = Travis.ajax diff --git a/assets/scripts/app/routes/job.coffee b/assets/scripts/app/routes/job.coffee index 60d50fdc..e0fcd136 100644 --- a/assets/scripts/app/routes/job.coffee +++ b/assets/scripts/app/routes/job.coffee @@ -1,4 +1,5 @@ require 'routes/route' +require 'models/job' Job = Travis.Job TravisRoute = Travis.Route diff --git a/assets/scripts/app/routes/request.coffee b/assets/scripts/app/routes/request.coffee index bca14684..3be4ddb0 100644 --- a/assets/scripts/app/routes/request.coffee +++ b/assets/scripts/app/routes/request.coffee @@ -1,4 +1,5 @@ require 'routes/route' +require 'models/request' Request = Travis.Request TravisRoute = Travis.Route diff --git a/assets/scripts/app/routes/requests.coffee b/assets/scripts/app/routes/requests.coffee index ac60955b..74d25f62 100644 --- a/assets/scripts/app/routes/requests.coffee +++ b/assets/scripts/app/routes/requests.coffee @@ -1,4 +1,5 @@ require 'routes/route' +require 'models/request' TravisRoute = Travis.Route Request = Travis.Request diff --git a/assets/scripts/app/routes/ssh_key.coffee b/assets/scripts/app/routes/ssh_key.coffee index 6aaaa362..782541c9 100644 --- a/assets/scripts/app/routes/ssh_key.coffee +++ b/assets/scripts/app/routes/ssh_key.coffee @@ -1,4 +1,6 @@ require 'routes/route' +require 'models/ssh_key' +require 'travis/ajax' SshKey = Travis.SshKey Ajax = Travis.ajax From 5065bb573978d94c664a31982c7334168ebb74ee Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Thu, 15 Jan 2015 10:36:35 +0100 Subject: [PATCH 004/313] Subscribe to pusher channels only when entering the MainRoute We don't want to subscribe if we're at any other routes, because there is no data there. The main target is to avoid all of the notifications from a common channel if we're on the /dashboard route. --- assets/scripts/app/pusher.coffee | 4 +++- assets/scripts/app/routes.coffee | 2 ++ assets/scripts/app/routes/dashboard.coffee | 7 +++++++ assets/scripts/app/routes/main.coffee | 6 ++++++ assets/scripts/app/templates/dashboard.hbs | 1 + .../app/templates/layouts/dashboard.hbs | 5 +++++ assets/scripts/app/views.coffee | 21 ++----------------- assets/scripts/app/views/dashboard.coffee | 8 +++++++ assets/scripts/app/views/view.coffee | 19 +++++++++++++++++ assets/scripts/travis.coffee | 7 +++++++ 10 files changed, 60 insertions(+), 20 deletions(-) create mode 100644 assets/scripts/app/routes/dashboard.coffee create mode 100644 assets/scripts/app/templates/dashboard.hbs create mode 100644 assets/scripts/app/templates/layouts/dashboard.hbs create mode 100644 assets/scripts/app/views/dashboard.coffee create mode 100644 assets/scripts/app/views/view.coffee diff --git a/assets/scripts/app/pusher.coffee b/assets/scripts/app/pusher.coffee index 74802a85..b1abc51f 100644 --- a/assets/scripts/app/pusher.coffee +++ b/assets/scripts/app/pusher.coffee @@ -21,7 +21,6 @@ $.extend Travis.Pusher.prototype, Pusher.warn = @warn.bind(this) Pusher.host = config.host if config.host @pusher = new Pusher(config.key, encrypted: Travis.Pusher.ENCRYPTED, disableStats: true) - @subscribeAll(Travis.Pusher.CHANNELS) if Travis.Pusher.CHANNELS @callbacksToProcess = [] @@ -33,6 +32,9 @@ $.extend Travis.Pusher.prototype, subscribeAll: (channels) -> @subscribe(channel) for channel in channels + unsubscribeAll: (channels) -> + @unsubscribe(channel) for channel in channels + subscribe: (channel) -> return unless channel channel = @prefix(channel) diff --git a/assets/scripts/app/routes.coffee b/assets/scripts/app/routes.coffee index 96233579..830bf89a 100644 --- a/assets/scripts/app/routes.coffee +++ b/assets/scripts/app/routes.coffee @@ -9,6 +9,7 @@ Ember.Router.reopen @_super(url) Travis.Router.map -> + @resource 'dashboard' @resource 'main', path: '/', -> @resource 'getting_started' @route 'recent' @@ -80,3 +81,4 @@ require 'routes/settings' require 'routes/simple_layout' require 'routes/ssh_key' require 'routes/stats' +require 'routes/dashboard' diff --git a/assets/scripts/app/routes/dashboard.coffee b/assets/scripts/app/routes/dashboard.coffee new file mode 100644 index 00000000..114efe6c --- /dev/null +++ b/assets/scripts/app/routes/dashboard.coffee @@ -0,0 +1,7 @@ +require 'routes/route' + +TravisRoute = Travis.Route + +Route = TravisRoute.extend() + +Travis.DashboardRoute = Route diff --git a/assets/scripts/app/routes/main.coffee b/assets/scripts/app/routes/main.coffee index b5bf6bb5..7ae7fe80 100644 --- a/assets/scripts/app/routes/main.coffee +++ b/assets/scripts/app/routes/main.coffee @@ -1,6 +1,8 @@ require 'routes/route' +require 'pusher' TravisRoute = Travis.Route +channels = Travis.Pusher.CHANNELS Route = TravisRoute.extend renderTemplate: -> @@ -15,5 +17,9 @@ Route = TravisRoute.extend toActivate = if @signedIn() then 'owned' else 'recent' @container.lookup('controller:repos').activate(toActivate) + activate: -> + # subscribe to pusher only if we're at a main route + if channels + @get('pusher').subscribeAll(channels) Travis.MainRoute = Route diff --git a/assets/scripts/app/templates/dashboard.hbs b/assets/scripts/app/templates/dashboard.hbs new file mode 100644 index 00000000..13a665c5 --- /dev/null +++ b/assets/scripts/app/templates/dashboard.hbs @@ -0,0 +1 @@ +DASHBOARD GOES HERE! diff --git a/assets/scripts/app/templates/layouts/dashboard.hbs b/assets/scripts/app/templates/layouts/dashboard.hbs new file mode 100644 index 00000000..8fd17179 --- /dev/null +++ b/assets/scripts/app/templates/layouts/dashboard.hbs @@ -0,0 +1,5 @@ +{{#link-to "main"}}Home{{/link-to}} + +{{yield}} + +END diff --git a/assets/scripts/app/views.coffee b/assets/scripts/app/views.coffee index ea0aa8b9..c7dda171 100644 --- a/assets/scripts/app/views.coffee +++ b/assets/scripts/app/views.coffee @@ -1,4 +1,5 @@ require 'ext/ember/namespace' +require 'views/view' Em.View.reopen init: -> @@ -9,25 +10,6 @@ Em.View.reopen Travis.NotFoundView = Ember.View.extend layoutName: 'layouts/simple' -@Travis.reopen - View: Em.View.extend - actions: - popup: (name) -> @popup(name) - popupClose: -> @popupClose() - - popup: (name) -> - @popupCloseAll() - name = event?.target?.name || name - $("##{name}").toggleClass('display') - popupClose: -> - $('.popup').removeClass('display') - popupCloseAll: -> - if view = Travis.View.currentPopupView - view.destroy() - Travis.View.currentPopupView = null - - $('.popup').removeClass('display') - Travis.MainView = Travis.View.extend layoutName: 'layouts/home' classNames: ['application'] @@ -120,3 +102,4 @@ require 'views/signin' require 'views/top' require 'views/status_images' require 'views/status_image_input' +require 'views/dashboard' diff --git a/assets/scripts/app/views/dashboard.coffee b/assets/scripts/app/views/dashboard.coffee new file mode 100644 index 00000000..4f29bfcd --- /dev/null +++ b/assets/scripts/app/views/dashboard.coffee @@ -0,0 +1,8 @@ +require 'views/view' + +TravisView = Travis.View + +View = TravisView.extend + layoutName: 'layouts/dashboard' + +Travis.DashboardView = View diff --git a/assets/scripts/app/views/view.coffee b/assets/scripts/app/views/view.coffee new file mode 100644 index 00000000..9ee4526a --- /dev/null +++ b/assets/scripts/app/views/view.coffee @@ -0,0 +1,19 @@ +View = Ember.View.extend + actions: + popup: (name) -> @popup(name) + popupClose: -> @popupClose() + + popup: (name) -> + @popupCloseAll() + name = event?.target?.name || name + $("##{name}").toggleClass('display') + popupClose: -> + $('.popup').removeClass('display') + popupCloseAll: -> + if view = Travis.View.currentPopupView + view.destroy() + Travis.View.currentPopupView = null + + $('.popup').removeClass('display') + +Travis.View = View diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index e6691600..eb0ee6d0 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -182,6 +182,13 @@ Travis.initializer application.inject('controller', 'config', 'config:main') application.inject('route', 'config', 'config:main') +Travis.initializer + name: 'inject-pusher' + + initialize: (container, application) -> + application.register 'pusher:main', Travis.pusher, { instantiate: false } + + application.inject('route', 'pusher', 'pusher:main') Travis.Router.reopen didTransition: -> From 9d72db05a52e2bc25867e1da5c68f08a0dadc8b6 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Thu, 15 Jan 2015 10:47:57 +0100 Subject: [PATCH 005/313] Move stylesheets to styles/app --- assets/styles/{ => app}/_mixins/all.sass | 0 assets/styles/{ => app}/_mixins/colors.sass | 0 assets/styles/{ => app}/_mixins/fonts.sass | 0 assets/styles/{ => app}/ansi.sass | 0 assets/styles/{ => app}/app.sass | 0 assets/styles/app/auth.sass | 100 ++++++++++++++++-- assets/styles/{ => app}/caches.sass | 0 assets/styles/{ => app}/charm.sass | 0 .../{ => app}/components/travis-switch.sass | 0 assets/styles/{ => app}/forms.scss | 0 assets/styles/{ => app}/getting_started.sass | 0 assets/styles/{ => app}/layout.sass | 0 assets/styles/{ => app}/left.sass | 0 assets/styles/{ => app}/left/list.sass | 0 assets/styles/{ => app}/main.sass | 0 assets/styles/{ => app}/main/annotations.sass | 0 assets/styles/{ => app}/main/list.sass | 0 assets/styles/{ => app}/main/log.sass | 0 assets/styles/{ => app}/main/repository.sass | 0 assets/styles/{ => app}/main/sponsors.sass | 0 assets/styles/{ => app}/main/summary.sass | 0 assets/styles/{ => app}/main/tools.sass | 0 assets/styles/{ => app}/maximize.sass | 0 assets/styles/{ => app}/pro.sass | 0 assets/styles/{ => app}/profile.sass | 0 assets/styles/{ => app}/profile/hooks.sass | 0 assets/styles/{ => app}/requests.sass | 0 assets/styles/{ => app}/right.sass | 0 assets/styles/{ => app}/right/lists.sass | 0 assets/styles/{ => app}/right/sponsors.sass | 0 assets/styles/{ => app}/settings.sass | 0 assets/styles/{ => app}/stats.sass | 0 assets/styles/{ => app}/status.sass | 0 assets/styles/{ => app}/tabs.sass | 0 assets/styles/{ => app}/tipsy.css | 0 assets/styles/{ => app}/top.sass | 0 assets/styles/auth.sass | 96 ----------------- 37 files changed, 93 insertions(+), 103 deletions(-) rename assets/styles/{ => app}/_mixins/all.sass (100%) rename assets/styles/{ => app}/_mixins/colors.sass (100%) rename assets/styles/{ => app}/_mixins/fonts.sass (100%) rename assets/styles/{ => app}/ansi.sass (100%) rename assets/styles/{ => app}/app.sass (100%) rename assets/styles/{ => app}/caches.sass (100%) rename assets/styles/{ => app}/charm.sass (100%) rename assets/styles/{ => app}/components/travis-switch.sass (100%) rename assets/styles/{ => app}/forms.scss (100%) rename assets/styles/{ => app}/getting_started.sass (100%) rename assets/styles/{ => app}/layout.sass (100%) rename assets/styles/{ => app}/left.sass (100%) rename assets/styles/{ => app}/left/list.sass (100%) rename assets/styles/{ => app}/main.sass (100%) rename assets/styles/{ => app}/main/annotations.sass (100%) rename assets/styles/{ => app}/main/list.sass (100%) rename assets/styles/{ => app}/main/log.sass (100%) rename assets/styles/{ => app}/main/repository.sass (100%) rename assets/styles/{ => app}/main/sponsors.sass (100%) rename assets/styles/{ => app}/main/summary.sass (100%) rename assets/styles/{ => app}/main/tools.sass (100%) rename assets/styles/{ => app}/maximize.sass (100%) rename assets/styles/{ => app}/pro.sass (100%) rename assets/styles/{ => app}/profile.sass (100%) rename assets/styles/{ => app}/profile/hooks.sass (100%) rename assets/styles/{ => app}/requests.sass (100%) rename assets/styles/{ => app}/right.sass (100%) rename assets/styles/{ => app}/right/lists.sass (100%) rename assets/styles/{ => app}/right/sponsors.sass (100%) rename assets/styles/{ => app}/settings.sass (100%) rename assets/styles/{ => app}/stats.sass (100%) rename assets/styles/{ => app}/status.sass (100%) rename assets/styles/{ => app}/tabs.sass (100%) rename assets/styles/{ => app}/tipsy.css (100%) rename assets/styles/{ => app}/top.sass (100%) delete mode 100644 assets/styles/auth.sass diff --git a/assets/styles/_mixins/all.sass b/assets/styles/app/_mixins/all.sass similarity index 100% rename from assets/styles/_mixins/all.sass rename to assets/styles/app/_mixins/all.sass diff --git a/assets/styles/_mixins/colors.sass b/assets/styles/app/_mixins/colors.sass similarity index 100% rename from assets/styles/_mixins/colors.sass rename to assets/styles/app/_mixins/colors.sass diff --git a/assets/styles/_mixins/fonts.sass b/assets/styles/app/_mixins/fonts.sass similarity index 100% rename from assets/styles/_mixins/fonts.sass rename to assets/styles/app/_mixins/fonts.sass diff --git a/assets/styles/ansi.sass b/assets/styles/app/ansi.sass similarity index 100% rename from assets/styles/ansi.sass rename to assets/styles/app/ansi.sass diff --git a/assets/styles/app.sass b/assets/styles/app/app.sass similarity index 100% rename from assets/styles/app.sass rename to assets/styles/app/app.sass diff --git a/assets/styles/app/auth.sass b/assets/styles/app/auth.sass index b9383137..6d611a9d 100644 --- a/assets/styles/app/auth.sass +++ b/assets/styles/app/auth.sass @@ -1,10 +1,96 @@ @import "_mixins/all" -#auth-frame - top: 50% - left: 50% - width: 400px - height: 300px - margin: -200px 0 0 -150px - @include popup +#auth + #main + margin: 0 auto + padding: 100px 50px 0 50px + height: 100px + -webkit-flex: none + flex: none + width: 300px + min-width: auto + max-height: 400px + @include border-radius(8px) + + h2 + color: #919191 + font-weight: 400 + text-align: center + margin-bottom: 50px + + h3 + font-size: 35px + color: #337389 + text-align: center + margin: 0 + + p + text-align: center + + a + display: inline + padding: 15px 30px + border: 0 + background-color: #a53230 + font-size: 20px + color: #ffffff + width: 200px + text-align: center + a:hover + display: inline + text-decoration: underline + + span + display: inline-block + text-align: center + + .mascot + display: block + margin: 0 0 50px 0 + height: 150px + background: inline-image('travis-mascot-150.png') 50% 0 no-repeat + background-size: 150px 150px + +#insufficient-permissions + width: 850px + margin: 0 auto + padding-top: 30px + font-family: 'Source Sans Pro', Helvetica, sans-serif + font-size: 17px + line-height: 26px + text-align: center + + .insufficient-permissions-head + font-size: 35px + color: #337389 + font-weight: 800 + text-align: center + padding-bottom: 20px + margin: 0 + + .insufficient-permissions-more + color: #919191 + font-size: 20px + font-weight: 400 + text-align: left + margin: 0px auto + padding: 0 + width: 600px + + .sad-travis + border: 0px + padding-bottom: 30px + align: center + + .insufficient-permissions-row + display: inline-block + clear: all + padding-top: 30px + + .insufficient-permissions-column + padding-right: 28px + max-width: 380px + display: block + float: left + clear: all diff --git a/assets/styles/caches.sass b/assets/styles/app/caches.sass similarity index 100% rename from assets/styles/caches.sass rename to assets/styles/app/caches.sass diff --git a/assets/styles/charm.sass b/assets/styles/app/charm.sass similarity index 100% rename from assets/styles/charm.sass rename to assets/styles/app/charm.sass diff --git a/assets/styles/components/travis-switch.sass b/assets/styles/app/components/travis-switch.sass similarity index 100% rename from assets/styles/components/travis-switch.sass rename to assets/styles/app/components/travis-switch.sass diff --git a/assets/styles/forms.scss b/assets/styles/app/forms.scss similarity index 100% rename from assets/styles/forms.scss rename to assets/styles/app/forms.scss diff --git a/assets/styles/getting_started.sass b/assets/styles/app/getting_started.sass similarity index 100% rename from assets/styles/getting_started.sass rename to assets/styles/app/getting_started.sass diff --git a/assets/styles/layout.sass b/assets/styles/app/layout.sass similarity index 100% rename from assets/styles/layout.sass rename to assets/styles/app/layout.sass diff --git a/assets/styles/left.sass b/assets/styles/app/left.sass similarity index 100% rename from assets/styles/left.sass rename to assets/styles/app/left.sass diff --git a/assets/styles/left/list.sass b/assets/styles/app/left/list.sass similarity index 100% rename from assets/styles/left/list.sass rename to assets/styles/app/left/list.sass diff --git a/assets/styles/main.sass b/assets/styles/app/main.sass similarity index 100% rename from assets/styles/main.sass rename to assets/styles/app/main.sass diff --git a/assets/styles/main/annotations.sass b/assets/styles/app/main/annotations.sass similarity index 100% rename from assets/styles/main/annotations.sass rename to assets/styles/app/main/annotations.sass diff --git a/assets/styles/main/list.sass b/assets/styles/app/main/list.sass similarity index 100% rename from assets/styles/main/list.sass rename to assets/styles/app/main/list.sass diff --git a/assets/styles/main/log.sass b/assets/styles/app/main/log.sass similarity index 100% rename from assets/styles/main/log.sass rename to assets/styles/app/main/log.sass diff --git a/assets/styles/main/repository.sass b/assets/styles/app/main/repository.sass similarity index 100% rename from assets/styles/main/repository.sass rename to assets/styles/app/main/repository.sass diff --git a/assets/styles/main/sponsors.sass b/assets/styles/app/main/sponsors.sass similarity index 100% rename from assets/styles/main/sponsors.sass rename to assets/styles/app/main/sponsors.sass diff --git a/assets/styles/main/summary.sass b/assets/styles/app/main/summary.sass similarity index 100% rename from assets/styles/main/summary.sass rename to assets/styles/app/main/summary.sass diff --git a/assets/styles/main/tools.sass b/assets/styles/app/main/tools.sass similarity index 100% rename from assets/styles/main/tools.sass rename to assets/styles/app/main/tools.sass diff --git a/assets/styles/maximize.sass b/assets/styles/app/maximize.sass similarity index 100% rename from assets/styles/maximize.sass rename to assets/styles/app/maximize.sass diff --git a/assets/styles/pro.sass b/assets/styles/app/pro.sass similarity index 100% rename from assets/styles/pro.sass rename to assets/styles/app/pro.sass diff --git a/assets/styles/profile.sass b/assets/styles/app/profile.sass similarity index 100% rename from assets/styles/profile.sass rename to assets/styles/app/profile.sass diff --git a/assets/styles/profile/hooks.sass b/assets/styles/app/profile/hooks.sass similarity index 100% rename from assets/styles/profile/hooks.sass rename to assets/styles/app/profile/hooks.sass diff --git a/assets/styles/requests.sass b/assets/styles/app/requests.sass similarity index 100% rename from assets/styles/requests.sass rename to assets/styles/app/requests.sass diff --git a/assets/styles/right.sass b/assets/styles/app/right.sass similarity index 100% rename from assets/styles/right.sass rename to assets/styles/app/right.sass diff --git a/assets/styles/right/lists.sass b/assets/styles/app/right/lists.sass similarity index 100% rename from assets/styles/right/lists.sass rename to assets/styles/app/right/lists.sass diff --git a/assets/styles/right/sponsors.sass b/assets/styles/app/right/sponsors.sass similarity index 100% rename from assets/styles/right/sponsors.sass rename to assets/styles/app/right/sponsors.sass diff --git a/assets/styles/settings.sass b/assets/styles/app/settings.sass similarity index 100% rename from assets/styles/settings.sass rename to assets/styles/app/settings.sass diff --git a/assets/styles/stats.sass b/assets/styles/app/stats.sass similarity index 100% rename from assets/styles/stats.sass rename to assets/styles/app/stats.sass diff --git a/assets/styles/status.sass b/assets/styles/app/status.sass similarity index 100% rename from assets/styles/status.sass rename to assets/styles/app/status.sass diff --git a/assets/styles/tabs.sass b/assets/styles/app/tabs.sass similarity index 100% rename from assets/styles/tabs.sass rename to assets/styles/app/tabs.sass diff --git a/assets/styles/tipsy.css b/assets/styles/app/tipsy.css similarity index 100% rename from assets/styles/tipsy.css rename to assets/styles/app/tipsy.css diff --git a/assets/styles/top.sass b/assets/styles/app/top.sass similarity index 100% rename from assets/styles/top.sass rename to assets/styles/app/top.sass diff --git a/assets/styles/auth.sass b/assets/styles/auth.sass deleted file mode 100644 index 6d611a9d..00000000 --- a/assets/styles/auth.sass +++ /dev/null @@ -1,96 +0,0 @@ -@import "_mixins/all" - -#auth - #main - margin: 0 auto - padding: 100px 50px 0 50px - height: 100px - - -webkit-flex: none - flex: none - width: 300px - min-width: auto - max-height: 400px - @include border-radius(8px) - - h2 - color: #919191 - font-weight: 400 - text-align: center - margin-bottom: 50px - - h3 - font-size: 35px - color: #337389 - text-align: center - margin: 0 - - p - text-align: center - - a - display: inline - padding: 15px 30px - border: 0 - background-color: #a53230 - font-size: 20px - color: #ffffff - width: 200px - text-align: center - a:hover - display: inline - text-decoration: underline - - span - display: inline-block - text-align: center - - .mascot - display: block - margin: 0 0 50px 0 - height: 150px - background: inline-image('travis-mascot-150.png') 50% 0 no-repeat - background-size: 150px 150px - -#insufficient-permissions - width: 850px - margin: 0 auto - padding-top: 30px - font-family: 'Source Sans Pro', Helvetica, sans-serif - font-size: 17px - line-height: 26px - text-align: center - - .insufficient-permissions-head - font-size: 35px - color: #337389 - font-weight: 800 - text-align: center - padding-bottom: 20px - margin: 0 - - .insufficient-permissions-more - color: #919191 - font-size: 20px - font-weight: 400 - text-align: left - margin: 0px auto - padding: 0 - width: 600px - - .sad-travis - border: 0px - padding-bottom: 30px - align: center - - .insufficient-permissions-row - display: inline-block - clear: all - padding-top: 30px - - .insufficient-permissions-column - padding-right: 28px - max-width: 380px - display: block - float: left - clear: all From 2396fb925dd35dd2b3fd5af6612acbcc638d3a34 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Thu, 15 Jan 2015 10:51:48 +0100 Subject: [PATCH 006/313] Fix imports in styles --- assets/styles/app/_mixins/all.sass | 6 +++--- assets/styles/app/ansi.sass | 2 +- assets/styles/app/app.sass | 2 +- assets/styles/app/auth.sass | 2 +- assets/styles/app/button.sass | 2 +- assets/styles/app/flash.sass | 2 +- assets/styles/app/forms.scss | 2 +- assets/styles/app/github.sass | 2 +- assets/styles/app/layout.sass | 2 +- assets/styles/app/left.sass | 2 +- assets/styles/app/left/list.sass | 2 +- assets/styles/app/loading.sass | 2 +- assets/styles/app/main.sass | 2 +- assets/styles/app/main/annotations.sass | 2 +- assets/styles/app/main/list.sass | 2 +- assets/styles/app/main/log.sass | 2 +- assets/styles/app/main/repository.sass | 2 +- assets/styles/app/main/summary.sass | 2 +- assets/styles/app/main/tools.sass | 2 +- assets/styles/app/maximize.sass | 2 +- assets/styles/app/misc.sass | 2 +- assets/styles/app/popup.sass | 2 +- assets/styles/app/pro.sass | 4 ++-- assets/styles/app/profile.sass | 2 +- assets/styles/app/profile/hooks.sass | 2 +- assets/styles/app/requests.sass | 2 +- assets/styles/app/right.sass | 2 +- assets/styles/app/right/lists.sass | 2 +- assets/styles/app/right/sponsors.sass | 2 +- assets/styles/app/stats.sass | 2 +- assets/styles/app/status.sass | 2 +- assets/styles/app/tabs.sass | 2 +- assets/styles/app/top.sass | 2 +- 33 files changed, 36 insertions(+), 36 deletions(-) diff --git a/assets/styles/app/_mixins/all.sass b/assets/styles/app/_mixins/all.sass index 30efdbea..fe9eb854 100644 --- a/assets/styles/app/_mixins/all.sass +++ b/assets/styles/app/_mixins/all.sass @@ -1,6 +1,6 @@ -@import "compass" -@import "_mixins/colors" -@import "_mixins/fonts" +@import "app/compass" +@import "app/_mixins/colors" +@import "app/_mixins/fonts" @mixin popup display: none diff --git a/assets/styles/app/ansi.sass b/assets/styles/app/ansi.sass index 01a92bad..165cca96 100644 --- a/assets/styles/app/ansi.sass +++ b/assets/styles/app/ansi.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" // ansi styles, see javascripts/lib/deansi.js .ansi diff --git a/assets/styles/app/app.sass b/assets/styles/app/app.sass index a44c2c77..96b237af 100644 --- a/assets/styles/app/app.sass +++ b/assets/styles/app/app.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" html, body font-family: 'Source Sans Pro', Helvetica, sans-serif diff --git a/assets/styles/app/auth.sass b/assets/styles/app/auth.sass index 6d611a9d..a93ec6cb 100644 --- a/assets/styles/app/auth.sass +++ b/assets/styles/app/auth.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #auth #main diff --git a/assets/styles/app/button.sass b/assets/styles/app/button.sass index 8350a14e..17e61e2d 100644 --- a/assets/styles/app/button.sass +++ b/assets/styles/app/button.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" .button position: relative diff --git a/assets/styles/app/flash.sass b/assets/styles/app/flash.sass index 677502e0..698991b0 100644 --- a/assets/styles/app/flash.sass +++ b/assets/styles/app/flash.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" .flash color: #fff diff --git a/assets/styles/app/forms.scss b/assets/styles/app/forms.scss index 5b25d75f..af3d6c30 100644 --- a/assets/styles/app/forms.scss +++ b/assets/styles/app/forms.scss @@ -1,4 +1,4 @@ -@import "compass"; +@import "app/compass"; .pro { form.subscription-form { diff --git a/assets/styles/app/github.sass b/assets/styles/app/github.sass index fdf9f1b1..876b34b0 100644 --- a/assets/styles/app/github.sass +++ b/assets/styles/app/github.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #github-wrapper position: absolute diff --git a/assets/styles/app/layout.sass b/assets/styles/app/layout.sass index a1c892a8..9cff7f3d 100644 --- a/assets/styles/app/layout.sass +++ b/assets/styles/app/layout.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" $left-width: 250px diff --git a/assets/styles/app/left.sass b/assets/styles/app/left.sass index 8f95f077..e126f246 100644 --- a/assets/styles/app/left.sass +++ b/assets/styles/app/left.sass @@ -1,4 +1,4 @@ -@import "_mixins/all.sass" +@import "app/_mixins/all.sass" #left #search_box diff --git a/assets/styles/app/left/list.sass b/assets/styles/app/left/list.sass index 767097ba..abd62627 100644 --- a/assets/styles/app/left/list.sass +++ b/assets/styles/app/left/list.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #accounts, #repos diff --git a/assets/styles/app/loading.sass b/assets/styles/app/loading.sass index c3371a4e..09298adb 100644 --- a/assets/styles/app/loading.sass +++ b/assets/styles/app/loading.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" .loading padding: 15px 25px 0 0 diff --git a/assets/styles/app/main.sass b/assets/styles/app/main.sass index 76064b22..06a74124 100644 --- a/assets/styles/app/main.sass +++ b/assets/styles/app/main.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #main h3 diff --git a/assets/styles/app/main/annotations.sass b/assets/styles/app/main/annotations.sass index 7fd355e7..bb5cd5d7 100644 --- a/assets/styles/app/main/annotations.sass +++ b/assets/styles/app/main/annotations.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #annotations margin: 8px 0 25px 12px diff --git a/assets/styles/app/main/list.sass b/assets/styles/app/main/list.sass index eecc6f52..497c5797 100644 --- a/assets/styles/app/main/list.sass +++ b/assets/styles/app/main/list.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" table.list width: 100% diff --git a/assets/styles/app/main/log.sass b/assets/styles/app/main/log.sass index d55c80ac..f59d964e 100644 --- a/assets/styles/app/main/log.sass +++ b/assets/styles/app/main/log.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" pre#log position: relative diff --git a/assets/styles/app/main/repository.sass b/assets/styles/app/main/repository.sass index 314857f4..fe02d1e4 100644 --- a/assets/styles/app/main/repository.sass +++ b/assets/styles/app/main/repository.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #repo position: relative diff --git a/assets/styles/app/main/summary.sass b/assets/styles/app/main/summary.sass index 84ac3397..8d83543c 100644 --- a/assets/styles/app/main/summary.sass +++ b/assets/styles/app/main/summary.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" .green .build-status background: #549e54 inline-image('icons/state-passed-white.svg') no-repeat diff --git a/assets/styles/app/main/tools.sass b/assets/styles/app/main/tools.sass index 4d1b040b..d44a7eba 100644 --- a/assets/styles/app/main/tools.sass +++ b/assets/styles/app/main/tools.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #tools position: relative diff --git a/assets/styles/app/maximize.sass b/assets/styles/app/maximize.sass index 2414ebe4..b8a469c1 100644 --- a/assets/styles/app/maximize.sass +++ b/assets/styles/app/maximize.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" .pro.maximized #right diff --git a/assets/styles/app/misc.sass b/assets/styles/app/misc.sass index 2b5a7a4a..fbea60a1 100644 --- a/assets/styles/app/misc.sass +++ b/assets/styles/app/misc.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" .display display: block !important diff --git a/assets/styles/app/popup.sass b/assets/styles/app/popup.sass index 1d8c86ca..ca551bdd 100644 --- a/assets/styles/app/popup.sass +++ b/assets/styles/app/popup.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" .help display: inline-block diff --git a/assets/styles/app/pro.sass b/assets/styles/app/pro.sass index 2dc3c6b0..09e9e330 100644 --- a/assets/styles/app/pro.sass +++ b/assets/styles/app/pro.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" .pro #log-container @@ -104,7 +104,7 @@ .group a cursor: pointer - @import "_mixins/all" + @import "app/_mixins/all" #right padding-bottom: 80px diff --git a/assets/styles/app/profile.sass b/assets/styles/app/profile.sass index ff7c488b..7e234f30 100644 --- a/assets/styles/app/profile.sass +++ b/assets/styles/app/profile.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #profile #main diff --git a/assets/styles/app/profile/hooks.sass b/assets/styles/app/profile/hooks.sass index aeaeb318..342040f2 100644 --- a/assets/styles/app/profile/hooks.sass +++ b/assets/styles/app/profile/hooks.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #profile #unadministerable-hooks diff --git a/assets/styles/app/requests.sass b/assets/styles/app/requests.sass index cd0227a7..6ed0112b 100644 --- a/assets/styles/app/requests.sass +++ b/assets/styles/app/requests.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #request h3 diff --git a/assets/styles/app/right.sass b/assets/styles/app/right.sass index 4457762b..b7f96f8d 100644 --- a/assets/styles/app/right.sass +++ b/assets/styles/app/right.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #profile #right diff --git a/assets/styles/app/right/lists.sass b/assets/styles/app/right/lists.sass index 0ad786c8..d9240341 100644 --- a/assets/styles/app/right/lists.sass +++ b/assets/styles/app/right/lists.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #right .tabs diff --git a/assets/styles/app/right/sponsors.sass b/assets/styles/app/right/sponsors.sass index a4b05d49..afbe2b8c 100644 --- a/assets/styles/app/right/sponsors.sass +++ b/assets/styles/app/right/sponsors.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #right .sponsors diff --git a/assets/styles/app/stats.sass b/assets/styles/app/stats.sass index 0a6e72b4..32211b12 100644 --- a/assets/styles/app/stats.sass +++ b/assets/styles/app/stats.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #repo_count_container, #build_count_container diff --git a/assets/styles/app/status.sass b/assets/styles/app/status.sass index 8e701646..884a74d1 100644 --- a/assets/styles/app/status.sass +++ b/assets/styles/app/status.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" .status display: inline-block diff --git a/assets/styles/app/tabs.sass b/assets/styles/app/tabs.sass index 198a1a42..67f616ec 100644 --- a/assets/styles/app/tabs.sass +++ b/assets/styles/app/tabs.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" .tabs height: 29px diff --git a/assets/styles/app/top.sass b/assets/styles/app/top.sass index 8f8b9e3a..16f1e7e3 100644 --- a/assets/styles/app/top.sass +++ b/assets/styles/app/top.sass @@ -1,4 +1,4 @@ -@import "_mixins/all" +@import "app/_mixins/all" #top line-height: 60px From fc0c5495566813e7e230a81cb29ced2e17c16336 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Thu, 15 Jan 2015 10:47:34 +0100 Subject: [PATCH 007/313] Create separate stylesheets for dashboard and the rest --- Assetfile | 7 ++++++- assets/scripts/app/routes/dashboard.coffee | 9 ++++++++- assets/scripts/app/templates/dashboard.hbs | 2 +- assets/scripts/travis.coffee | 15 +++++++++++++++ assets/styles/app/_mixins/all.sass | 2 +- assets/styles/app/forms.scss | 2 +- assets/styles/dashboard/dashboard.scss | 3 +++ public/index.html | 3 ++- public/styles/dashboard.css | 4 ++++ 9 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 assets/styles/dashboard/dashboard.scss create mode 100644 public/styles/dashboard.css diff --git a/Assetfile b/Assetfile index 60e700a4..200eff3b 100644 --- a/Assetfile +++ b/Assetfile @@ -71,10 +71,15 @@ end output 'public/styles' input assets.styles do - match '**/*.{scss,sass,css}' do + match 'app/**/*.{scss,sass,css}' do sass assets.production? ? { style: :compressed } : {} concat assets.styles_order, ['app.css'] end + + match 'dashboard/**/*.{scss,sass,css}' do + sass assets.production? ? { style: :compressed } : {} + concat assets.styles_order, ['dashboard.css'] + end end output 'public/images' diff --git a/assets/scripts/app/routes/dashboard.coffee b/assets/scripts/app/routes/dashboard.coffee index 114efe6c..0921fd09 100644 --- a/assets/scripts/app/routes/dashboard.coffee +++ b/assets/scripts/app/routes/dashboard.coffee @@ -2,6 +2,13 @@ require 'routes/route' TravisRoute = Travis.Route -Route = TravisRoute.extend() +Route = TravisRoute.extend + activate: -> + @get('stylesheetsManager').disable('main') + @get('stylesheetsManager').enable('dashboard') + + deactivate: -> + @get('stylesheetsManager').enable('main') + @get('stylesheetsManager').disable('dashboard') Travis.DashboardRoute = Route diff --git a/assets/scripts/app/templates/dashboard.hbs b/assets/scripts/app/templates/dashboard.hbs index 13a665c5..76de1c7a 100644 --- a/assets/scripts/app/templates/dashboard.hbs +++ b/assets/scripts/app/templates/dashboard.hbs @@ -1 +1 @@ -DASHBOARD GOES HERE! +

DASHBOARD GOES HERE!

diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index eb0ee6d0..63ddb0f4 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -190,6 +190,21 @@ Travis.initializer application.inject('route', 'pusher', 'pusher:main') +stylesheetsManager = Ember.Object.create + enable: (id) -> + $("##{id}").removeAttr('disabled') + + disable: (id) -> + $("##{id}").attr('disabled', 'disabled') + +Travis.initializer + name: 'inject-stylesheets-manager' + + initialize: (container, application) -> + application.register 'stylesheetsManager:main', stylesheetsManager, { instantiate: false } + + application.inject('route', 'stylesheetsManager', 'stylesheetsManager:main') + Travis.Router.reopen didTransition: -> @_super.apply @, arguments diff --git a/assets/styles/app/_mixins/all.sass b/assets/styles/app/_mixins/all.sass index fe9eb854..b62bcfeb 100644 --- a/assets/styles/app/_mixins/all.sass +++ b/assets/styles/app/_mixins/all.sass @@ -1,4 +1,4 @@ -@import "app/compass" +@import "compass" @import "app/_mixins/colors" @import "app/_mixins/fonts" diff --git a/assets/styles/app/forms.scss b/assets/styles/app/forms.scss index af3d6c30..5b25d75f 100644 --- a/assets/styles/app/forms.scss +++ b/assets/styles/app/forms.scss @@ -1,4 +1,4 @@ -@import "app/compass"; +@import "compass"; .pro { form.subscription-form { diff --git a/assets/styles/dashboard/dashboard.scss b/assets/styles/dashboard/dashboard.scss new file mode 100644 index 00000000..df030d25 --- /dev/null +++ b/assets/styles/dashboard/dashboard.scss @@ -0,0 +1,3 @@ +h1 { + color: #A80000; +} diff --git a/public/index.html b/public/index.html index 673b0ae0..9b0035b2 100644 --- a/public/index.html +++ b/public/index.html @@ -23,7 +23,8 @@ - + + From 7650520beb53ab495b44f1a49f569097d088c785 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 11:25:52 +0100 Subject: [PATCH 110/313] Move pusher config to main config --- assets/scripts/app/initializers/config.coffee | 19 +- assets/scripts/app/routes/main.coffee | 5 +- assets/scripts/app/utils/pusher.coffee | 164 ++++++++---------- 3 files changed, 94 insertions(+), 94 deletions(-) diff --git a/assets/scripts/app/initializers/config.coffee b/assets/scripts/app/initializers/config.coffee index 8980bb9a..b2dbb2d0 100644 --- a/assets/scripts/app/initializers/config.coffee +++ b/assets/scripts/app/initializers/config.coffee @@ -10,12 +10,25 @@ loadConfig = -> # to allow more granular config later pro = $('meta[name="travis.pro"]').attr('value') == 'true' || enterprise + if config.pro + pusher = + channels: [] + channel_prefix: 'private-' + encrypted: true + key: '' + else + pusher = + channels: ['common'] + channel_prefix: '' + encrypted: false + return { syncingPageRedirectionTime: 5000 api_endpoint: $('meta[rel="travis.api_endpoint"]').attr('href') source_endpoint: $('meta[rel="travis.source_endpoint"]').attr('href') pusher_key: $('meta[name="travis.pusher_key"]').attr('value') pusher_host: $('meta[name="travis.pusher_host"]').attr('value') + pusher_path: $('meta[name="travis.pusher_path"]').attr('value') ga_code: $('meta[name="travis.ga_code"]').attr('value') code_climate: $('meta[name="travis.code_climate"]').attr('value') ssh_key_enabled: $('meta[name="travis.ssh_key_enabled"]').attr('value') == 'true' @@ -38,15 +51,19 @@ loadConfig = -> customer_io_site_id: customer_io_site_id intervals: { times: -1, updateTimes: 1000 } + pusher: pusher } initialize = (container, application) -> - application.register 'config:main', application.config, { instantiate: false } + config = application.config + application.register 'config:main', config, { instantiate: false } application.inject('controller', 'config', 'config:main') application.inject('route', 'config', 'config:main') application.inject('auth', 'config', 'config:main') + application.pusher.config = config + ConfigInitializer = name: 'config' initialize: initialize diff --git a/assets/scripts/app/routes/main.coffee b/assets/scripts/app/routes/main.coffee index d28941fe..180b7fe6 100644 --- a/assets/scripts/app/routes/main.coffee +++ b/assets/scripts/app/routes/main.coffee @@ -1,7 +1,6 @@ require 'routes/route' TravisRoute = Travis.Route -channels = Travis.Pusher.CHANNELS Route = TravisRoute.extend renderTemplate: -> @@ -18,7 +17,7 @@ Route = TravisRoute.extend activate: -> # subscribe to pusher only if we're at a main route - if channels - @get('pusher').subscribeAll(channels) + if @config.pusher.channels + @get('pusher').subscribeAll(@config.pusher.channels) Travis.MainRoute = Route diff --git a/assets/scripts/app/utils/pusher.coffee b/assets/scripts/app/utils/pusher.coffee index b10de488..4fd55f64 100644 --- a/assets/scripts/app/utils/pusher.coffee +++ b/assets/scripts/app/utils/pusher.coffee @@ -1,117 +1,101 @@ -Travis.Pusher = (config) -> +TravisPusher = (config) -> @init(config) this -if Travis.config.pro - $.extend Travis.Pusher, - CHANNELS: [] - CHANNEL_PREFIX: 'private-' - ENCRYPTED: true - KEY: '' -else - $.extend Travis.Pusher, - CHANNELS: ['common'] - CHANNEL_PREFIX: '' - ENCRYPTED: false +TravisPusher.prototype.active_channels = [] -$.extend Travis.Pusher.prototype, - active_channels: [] +TravisPusher.prototype.init = (config) -> + Pusher.warn = @warn.bind(this) + Pusher.host = config.host if config.host + @pusher = new Pusher(config.key, encrypted: @config.pusher.encrypted, disableStats: true) - init: (config) -> - Pusher.warn = @warn.bind(this) - Pusher.host = config.host if config.host - @pusher = new Pusher(config.key, encrypted: Travis.Pusher.ENCRYPTED, disableStats: true) + @callbacksToProcess = [] - @callbacksToProcess = [] + Visibility.change (e, state) => + @processSavedCallbacks() if state == 'visible' - Visibility.change (e, state) => - @processSavedCallbacks() if state == 'visible' + setInterval @processSavedCallbacks.bind(this), @processingIntervalWhenHidden - setInterval @processSavedCallbacks.bind(this), @processingIntervalWhenHidden +TravisPusher.prototype.subscribeAll = (channels) -> + @subscribe(channel) for channel in channels - subscribeAll: (channels) -> - @subscribe(channel) for channel in channels +TravisPusher.prototype.unsubscribeAll = (channels) -> + @unsubscribe(channel) for channel in channels - unsubscribeAll: (channels) -> - @unsubscribe(channel) for channel in channels +TravisPusher.prototype.subscribe = (channel) -> + return unless channel + channel = @prefix(channel) + console.log("subscribing to #{channel}") + unless @pusher?.channel(channel) + @pusher.subscribe(channel).bind_all((event, data) => @receive(event, data)) - subscribe: (channel) -> - return unless channel - channel = @prefix(channel) - console.log("subscribing to #{channel}") - unless @pusher?.channel(channel) - @pusher.subscribe(channel).bind_all((event, data) => @receive(event, data)) +TravisPusher.prototype.unsubscribe = (channel) -> + return unless channel + channel = @prefix(channel) + console.log("unsubscribing from #{channel}") + @pusher.unsubscribe(channel) if @pusher?.channel(channel) - unsubscribe: (channel) -> - return unless channel - channel = @prefix(channel) - console.log("unsubscribing from #{channel}") - @pusher.unsubscribe(channel) if @pusher?.channel(channel) +TravisPusher.prototype.prefix = (channel) -> + if channel.indexOf(@config.pusher.channel_prefix) != 0 + "#{@config.pusher.channel_prefix}#{channel}" + else + channel - prefix: (channel) -> - if channel.indexOf(Travis.Pusher.CHANNEL_PREFIX) != 0 - "#{Travis.Pusher.CHANNEL_PREFIX}#{channel}" - else - channel +# process pusher messages in batches every 5 minutes when the page is hidden +TravisPusher.prototype.processingIntervalWhenHidden = 1000 * 60 * 5 - # process pusher messages in batches every 5 minutes when the page is hidden - processingIntervalWhenHidden: 1000 * 60 * 5 +TravisPusher.prototype.receive = (event, data) -> + return if event.substr(0, 6) == 'pusher' + data = @normalize(event, data) if data.id - receive: (event, data) -> - return if event.substr(0, 6) == 'pusher' - data = @normalize(event, data) if data.id + @processWhenVisible => + # TODO remove job:requeued, once sf-restart-event has been merged + # TODO this also needs to clear logs on build:created if matrix jobs are already loaded + if event == 'job:created' || event == 'job:requeued' + if job = Travis.__container__.lookup('store:main').getById('job', data.job.id) + job.clearLog() - @processWhenVisible => - # TODO remove job:requeued, once sf-restart-event has been merged - # TODO this also needs to clear logs on build:created if matrix jobs are already loaded - if event == 'job:created' || event == 'job:requeued' - if job = Travis.__container__.lookup('store:main').getById('job', data.job.id) - job.clearLog() + Ember.run.next -> + Travis.receive(event, data) - Ember.run.next -> - Travis.receive(event, data) +TravisPusher.prototype.processSavedCallbacks = -> + while callback = @callbacksToProcess.shiftObject() + callback.call(this) - processSavedCallbacks: -> - while callback = @callbacksToProcess.shiftObject() - callback.call(this) +TravisPusher.prototype.processLater = (callback) -> + @callbacksToProcess.pushObject(callback) - processLater: (callback) -> - @callbacksToProcess.pushObject(callback) +TravisPusher.prototype.processWhenVisible = (callback) -> + if Visibility.hidden() && Visibility.isSupported() + @processLater(callback) + else + callback.call(this) - processWhenVisible: (callback) -> - if Visibility.hidden() && Visibility.isSupported() - @processLater(callback) - else - callback.call(this) +TravisPusher.prototype.normalize = (event, data) -> + switch event + when 'build:started', 'build:finished' + data + when 'job:created', 'job:started', 'job:requeued', 'job:finished', 'job:log', 'job:canceled', 'job:received' + data.queue = data.queue.replace('builds.', '') if data.queue + { job: data } + when 'worker:added', 'worker:updated', 'worker:removed' + { worker: data } + when 'annotation:created', 'annotation:updated' + { annotation: data } - normalize: (event, data) -> - switch event - when 'build:started', 'build:finished' - data - when 'job:created', 'job:started', 'job:requeued', 'job:finished', 'job:log', 'job:canceled', 'job:received' - data.queue = data.queue.replace('builds.', '') if data.queue - { job: data } - when 'worker:added', 'worker:updated', 'worker:removed' - { worker: data } - when 'annotation:created', 'annotation:updated' - { annotation: data } +TravisPusher.prototype.warn = (type, object) -> + console.warn(type, object.error) unless @ignoreWarning(type, object.error) - warn: (type, object) -> - console.warn(type, object.error) unless @ignoreWarning(type, object.error) +TravisPusher.prototype.ignoreWarning = (type, error) -> + code = error?.data?.code || 0 + message = error?.data?.message || '' + @ignoreCode(code) || @ignoreMessage(message) - ignoreWarning: (type, error) -> - code = error?.data?.code || 0 - message = error?.data?.message || '' - @ignoreCode(code) || @ignoreMessage(message) +TravisPusher.prototype.ignoreCode = (code) -> + code == 1006 - ignoreCode: (code) -> - code == 1006 - - ignoreMessage: (message) -> - message.indexOf('Existing subscription') == 0 or message.indexOf('No current subscription') == 0 - -pusher_host = $('meta[name="travis.pusher_host"]').attr('value') -pusher_path = $('meta[name="travis.pusher_path"]').attr('value') +TravisPusher.prototype.ignoreMessage = (message) -> + message.indexOf('Existing subscription') == 0 or message.indexOf('No current subscription') == 0 Pusher.SockJSTransport.isSupported = -> false if pusher_host != 'ws.pusherapp.com' From bdb427492f73a37268c4812e074da3edd0416bbb Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 11:53:28 +0100 Subject: [PATCH 111/313] Remove duplicate properties --- assets/scripts/app/models/commit.coffee | 2 -- assets/scripts/app/models/job.coffee | 4 ---- 2 files changed, 6 deletions(-) diff --git a/assets/scripts/app/models/commit.coffee b/assets/scripts/app/models/commit.coffee index 2f456486..664a1222 100644 --- a/assets/scripts/app/models/commit.coffee +++ b/assets/scripts/app/models/commit.coffee @@ -11,8 +11,6 @@ Commit = Model.extend authorEmail: DS.attr() committerName: DS.attr() committerEmail: DS.attr() - subject: DS.attr() - body: DS.attr() commitedAt: DS.attr() build: DS.belongsTo('build') diff --git a/assets/scripts/app/models/job.coffee b/assets/scripts/app/models/job.coffee index de553035..14e129da 100644 --- a/assets/scripts/app/models/job.coffee +++ b/assets/scripts/app/models/job.coffee @@ -124,10 +124,6 @@ Job = Model.extend DurationCalculations, @unsubscribe() if @get('state') == 'finished' && Travis.pusher ).observes('state') - isFinished: (-> - @get('state') in ['passed', 'failed', 'errored', 'canceled'] - ).property('state') - # TODO: such formattings should be done in controller, but in order # to use it there easily, I would have to refactor job and build # controllers From 6460c6692d199cb66e4b1da7b661d46a3d3bc78d Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 11:54:45 +0100 Subject: [PATCH 112/313] Move expandable-record-array to utils --- assets/scripts/app/models/repo.coffee | 2 +- .../{lib/travis => app/utils}/expandable-record-array.coffee | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename assets/scripts/{lib/travis => app/utils}/expandable-record-array.coffee (100%) diff --git a/assets/scripts/app/models/repo.coffee b/assets/scripts/app/models/repo.coffee index faa8029a..316fba78 100644 --- a/assets/scripts/app/models/repo.coffee +++ b/assets/scripts/app/models/repo.coffee @@ -1,4 +1,4 @@ -require 'travis/expandable-record-array' +require 'utils/expandable-record-array' require 'travis/model' Model = Travis.Model diff --git a/assets/scripts/lib/travis/expandable-record-array.coffee b/assets/scripts/app/utils/expandable-record-array.coffee similarity index 100% rename from assets/scripts/lib/travis/expandable-record-array.coffee rename to assets/scripts/app/utils/expandable-record-array.coffee From b0b1ef305b4e7db90291bcc84677bc84f23fb0f5 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 15:29:44 +0100 Subject: [PATCH 113/313] Change the way config is stored On ember-cli config is stored in config/environment.js file and it can be accessed at any time of app being booted. Till now we were using Travis.config which was making things hard, because we needed an application instance to get any config value. This commit moves config to config/environment.js and allows to access it at any point of loading the app. --- assets/scripts/app/app.coffee | 3 +- assets/scripts/app/controllers/repos.coffee | 2 +- assets/scripts/app/initializers/config.coffee | 64 +---------------- assets/scripts/app/models/ssh-key.coffee | 2 +- assets/scripts/app/router.coffee | 6 +- assets/scripts/app/utils/auth.coffee | 6 +- .../utils/computed-limit.js} | 4 +- assets/scripts/app/utils/limited-array.coffee | 4 +- assets/scripts/app/utils/pusher.coffee | 12 ++-- assets/scripts/config/environment.js | 70 +++++++++++++++++++ assets/scripts/lib/travis/ajax.coffee | 6 +- assets/scripts/travis.coffee | 5 +- 12 files changed, 103 insertions(+), 81 deletions(-) rename assets/scripts/{lib/ext/ember/computed.js => app/utils/computed-limit.js} (91%) create mode 100644 assets/scripts/config/environment.js diff --git a/assets/scripts/app/app.coffee b/assets/scripts/app/app.coffee index 2db70e8c..6d92f52f 100644 --- a/assets/scripts/app/app.coffee +++ b/assets/scripts/app/app.coffee @@ -7,7 +7,8 @@ App = Ember.Application.extend(Ember.Evented, #LOG_RESOLVER: true setup: -> - @pusher = new Travis.Pusher(key: Travis.config.pusher_key, host: Travis.config.pusher_host) if Travis.config.pusher_key + if @config.pusher.key + @pusher = new Travis.Pusher(@config.pusher) @tailing = new Travis.Tailing($(window), '#tail', '#log') @toTop = new Travis.ToTop($(window), '.to-top', '#log-container') diff --git a/assets/scripts/app/controllers/repos.coffee b/assets/scripts/app/controllers/repos.coffee index 67d8c547..12ed798f 100644 --- a/assets/scripts/app/controllers/repos.coffee +++ b/assets/scripts/app/controllers/repos.coffee @@ -1,4 +1,4 @@ -require 'travis/limited-array' +require 'utils/limited-array' Repo = Travis.Repo limit = Ember.computed.limit diff --git a/assets/scripts/app/initializers/config.coffee b/assets/scripts/app/initializers/config.coffee index b2dbb2d0..ec85bec0 100644 --- a/assets/scripts/app/initializers/config.coffee +++ b/assets/scripts/app/initializers/config.coffee @@ -1,76 +1,16 @@ -loadConfig = -> - pages_endpoint = $('meta[rel="travis.pages_endpoint"]').attr('href') - billing_endpoint = $('meta[rel="travis.billing_endpoint"]').attr('href') - customer_io_site_id = $('meta[name="travis.customer_io_site_id"]').attr('value') - setupCustomerio(customer_io_site_id) if customer_io_site_id +require 'config/environment' - enterprise = $('meta[name="travis.enterprise"]').attr('value') == 'true' - - # for now I set pro to true also for enterprise, but it should be changed - # to allow more granular config later - pro = $('meta[name="travis.pro"]').attr('value') == 'true' || enterprise - - if config.pro - pusher = - channels: [] - channel_prefix: 'private-' - encrypted: true - key: '' - else - pusher = - channels: ['common'] - channel_prefix: '' - encrypted: false - - return { - syncingPageRedirectionTime: 5000 - api_endpoint: $('meta[rel="travis.api_endpoint"]').attr('href') - source_endpoint: $('meta[rel="travis.source_endpoint"]').attr('href') - pusher_key: $('meta[name="travis.pusher_key"]').attr('value') - pusher_host: $('meta[name="travis.pusher_host"]').attr('value') - pusher_path: $('meta[name="travis.pusher_path"]').attr('value') - ga_code: $('meta[name="travis.ga_code"]').attr('value') - code_climate: $('meta[name="travis.code_climate"]').attr('value') - ssh_key_enabled: $('meta[name="travis.ssh_key_enabled"]').attr('value') == 'true' - code_climate_url: $('meta[name="travis.code_climate_url"]').attr('value') - caches_enabled: $('meta[name="travis.caches_enabled"]').attr('value') == 'true' - show_repos_hint: 'private' - avatar_default_url: 'https://travis-ci.org/images/ui/default-avatar.png' - pusher_log_fallback: $('meta[name="travis.pusher_log_fallback"]').attr('value') == 'true' - pro: pro - enterprise: enterprise - sidebar_support_box: pro && !enterprise - - pages_endpoint: pages_endpoint || billing_endpoint - billing_endpoint: billing_endpoint - - url_legal: "#{billing_endpoint}/pages/legal" - url_imprint: "#{billing_endpoint}/pages/imprint" - url_security: "#{billing_endpoint}/pages/security" - url_terms: "#{billing_endpoint}/pages/terms" - customer_io_site_id: customer_io_site_id - - intervals: { times: -1, updateTimes: 1000 } - pusher: pusher - } +config = ENV.config initialize = (container, application) -> - config = application.config application.register 'config:main', config, { instantiate: false } application.inject('controller', 'config', 'config:main') application.inject('route', 'config', 'config:main') - application.inject('auth', 'config', 'config:main') - - application.pusher.config = config ConfigInitializer = name: 'config' initialize: initialize Ember.onLoad 'Ember.Application', (Application) -> - Application.config loadConfig() - - Application.ajax.pro = Application.config.pro - Application.initializer ConfigInitializer diff --git a/assets/scripts/app/models/ssh-key.coffee b/assets/scripts/app/models/ssh-key.coffee index a0e5795e..d288aef7 100644 --- a/assets/scripts/app/models/ssh-key.coffee +++ b/assets/scripts/app/models/ssh-key.coffee @@ -1,4 +1,4 @@ -Travis.Model = Model +Model = Travis.Model SshKey = Model.extend value: DS.attr() diff --git a/assets/scripts/app/router.coffee b/assets/scripts/app/router.coffee index fb35cc5d..45716538 100644 --- a/assets/scripts/app/router.coffee +++ b/assets/scripts/app/router.coffee @@ -1,6 +1,8 @@ require 'travis/location' require 'routes/application' +config = ENV.config + Router = Ember.Router.extend location: 'history' @@ -32,14 +34,14 @@ Router.map -> @resource 'pullRequests', path: '/pull_requests' @resource 'branches', path: '/branches' @resource 'requests', path: '/requests' - @resource 'caches', path: '/caches' + @resource 'caches', path: '/caches' if config.endpoints.caches @resource 'request', path: '/requests/:request_id' @resource 'settings', -> @route 'index', path: '/' @resource 'env_vars', -> @route 'new' - @resource 'ssh_key' + @resource 'ssh_key' if config.endpoints.ssh_key @route 'first_sync' @route 'insufficient_oauth_permissions' diff --git a/assets/scripts/app/utils/auth.coffee b/assets/scripts/app/utils/auth.coffee index 84666d1a..ce559923 100644 --- a/assets/scripts/app/utils/auth.coffee +++ b/assets/scripts/app/utils/auth.coffee @@ -1,3 +1,5 @@ +config = ENV.config + Auth = Ember.Object.extend state: "signed-out" receivingEnd: "#{location.protocol}//#{location.host}" @@ -9,7 +11,7 @@ Auth = Ember.Object.extend Travis.sessionStorage.getItem('travis.token') endpoint: (-> - @config.api_endpoint + config.api_endpoint ).property(), signOut: -> @@ -50,7 +52,7 @@ Auth = Ember.Object.extend validateUser: (user) -> fieldsToValidate = ['id', 'login', 'token', 'correct_scopes'] - if @config.pro + if config.pro fieldsToValidate.push 'channels' fieldsToValidate.every( (field) => @validateHas(field, user) ) && user.correct_scopes diff --git a/assets/scripts/lib/ext/ember/computed.js b/assets/scripts/app/utils/computed-limit.js similarity index 91% rename from assets/scripts/lib/ext/ember/computed.js rename to assets/scripts/app/utils/computed-limit.js index 089f8fe1..57787c03 100644 --- a/assets/scripts/lib/ext/ember/computed.js +++ b/assets/scripts/app/utils/computed-limit.js @@ -1,4 +1,4 @@ -Ember.computed.limit = function(dependentKey, limitKey) { +limit = function(dependentKey, limitKey) { var options = { addedItem: function(array, item, changeMeta, instanceMeta) { var limit = Ember.get(this, limitKey); @@ -24,3 +24,5 @@ Ember.computed.limit = function(dependentKey, limitKey) { }; return Ember.arrayComputed(dependentKey, limitKey, options); }; + +Ember.computed.limit = limit; diff --git a/assets/scripts/app/utils/limited-array.coffee b/assets/scripts/app/utils/limited-array.coffee index ad86d5ba..1228e1df 100644 --- a/assets/scripts/app/utils/limited-array.coffee +++ b/assets/scripts/app/utils/limited-array.coffee @@ -1,7 +1,9 @@ +computedLimit = Ember.computed.limit + LimitedArray = Ember.ArrayProxy.extend limit: 10 isLoadedBinding: 'content.isLoaded' - arrangedContent: Ember.computed.limit('content', 'limit') + arrangedContent: computedLimit('content', 'limit') totalLength: (-> @get('content.length') diff --git a/assets/scripts/app/utils/pusher.coffee b/assets/scripts/app/utils/pusher.coffee index 4fd55f64..adfadaa0 100644 --- a/assets/scripts/app/utils/pusher.coffee +++ b/assets/scripts/app/utils/pusher.coffee @@ -1,3 +1,5 @@ +config = ENV.config + TravisPusher = (config) -> @init(config) this @@ -7,7 +9,7 @@ TravisPusher.prototype.active_channels = [] TravisPusher.prototype.init = (config) -> Pusher.warn = @warn.bind(this) Pusher.host = config.host if config.host - @pusher = new Pusher(config.key, encrypted: @config.pusher.encrypted, disableStats: true) + @pusher = new Pusher(config.key, encrypted: config.encrypted, disableStats: true) @callbacksToProcess = [] @@ -97,9 +99,9 @@ TravisPusher.prototype.ignoreCode = (code) -> TravisPusher.prototype.ignoreMessage = (message) -> message.indexOf('Existing subscription') == 0 or message.indexOf('No current subscription') == 0 -Pusher.SockJSTransport.isSupported = -> false if pusher_host != 'ws.pusherapp.com' +Pusher.SockJSTransport.isSupported = -> false if config.pusher.host != 'ws.pusherapp.com' -if Travis.config.pro +if config.pro Pusher.channel_auth_transport = 'bulk_ajax' Pusher.authorizers.bulk_ajax = (socketId, _callback) -> @@ -122,8 +124,8 @@ if Travis.config.pro Pusher.getDefaultStrategy = (config) -> [ [":def", "ws_options", { - hostUnencrypted: config.wsHost + ":" + config.wsPort + (pusher_path && "/#{pusher_path}" || ''), - hostEncrypted: config.wsHost + ":" + config.wssPort + (pusher_path && "/#{pusher_path}" || '') + hostUnencrypted: config.wsHost + ":" + config.wsPort + (config.pusher.path && "/#{config.pusher.path}" || ''), + hostEncrypted: config.wsHost + ":" + config.wssPort + (config.pusher.path && "/#{config.pusher.path}" || '') path: config.path }], [":def", "sockjs_options", { diff --git a/assets/scripts/config/environment.js b/assets/scripts/config/environment.js new file mode 100644 index 00000000..6cfa403e --- /dev/null +++ b/assets/scripts/config/environment.js @@ -0,0 +1,70 @@ +var billing_endpoint, customer_io_site_id, enterprise, pages_endpoint, pro, pusher, pusher_host, pusher_key, pusher_log_fallback, pusher_path; + +pages_endpoint = $('meta[rel="travis.pages_endpoint"]').attr('href'); +billing_endpoint = $('meta[rel="travis.billing_endpoint"]').attr('href'); +customer_io_site_id = $('meta[name="travis.customer_io_site_id"]').attr('value'); + +if (customer_io_site_id) { + setupCustomerio(customer_io_site_id); +} + +enterprise = $('meta[name="travis.enterprise"]').attr('value') === 'true'; +pro = $('meta[name="travis.pro"]').attr('value') === 'true' || enterprise; +pusher_key = $('meta[name="travis.pusher_key"]').attr('value'); +pusher_host = $('meta[name="travis.pusher_host"]').attr('value'); +pusher_path = $('meta[name="travis.pusher_path"]').attr('value'); +pusher_log_fallback = $('meta[name="travis.pusher_log_fallback"]').attr('value') === 'true'; + +if (pro) { + pusher = { + channels: [], + channel_prefix: 'private-', + encrypted: true + }; +} else { + pusher = { + channels: ['common'], + channel_prefix: '', + encrypted: false + }; +} + +pusher.key = pusher_key; +pusher.host = pusher_host; +pusher.path = pusher_path; +pusher.log_fallback = pusher_log_fallback; + +config = { + syncingPageRedirectionTime: 5000, + api_endpoint: $('meta[rel="travis.api_endpoint"]').attr('href'), + source_endpoint: $('meta[rel="travis.source_endpoint"]').attr('href'), + ga_code: $('meta[name="travis.ga_code"]').attr('value'), + code_climate: $('meta[name="travis.code_climate"]').attr('value'), + endpoints: { + ssh_key: $('meta[name="travis.ssh_key_enabled"]').attr('value') === 'true', + caches: $('meta[name="travis.caches_enabled"]').attr('value') === 'true' + }, + code_climate_url: $('meta[name="travis.code_climate_url"]').attr('value'), + show_repos_hint: 'private', + avatar_default_url: 'https://travis-ci.org/images/ui/default-avatar.png', + pro: pro, + enterprise: enterprise, + sidebar_support_box: pro && !enterprise, + pages_endpoint: pages_endpoint || billing_endpoint, + billing_endpoint: billing_endpoint, + url_legal: billing_endpoint + "/pages/legal", + url_imprint: billing_endpoint + "/pages/imprint", + url_security: billing_endpoint + "/pages/security", + url_terms: billing_endpoint + "/pages/terms", + customer_io_site_id: customer_io_site_id, + intervals: { + times: -1, + updateTimes: 1000 + }, + pusher: pusher +}; + +if(!window.ENV) { + window.ENV = {}; +} +window.ENV.config = config; diff --git a/assets/scripts/lib/travis/ajax.coffee b/assets/scripts/lib/travis/ajax.coffee index 8b5e2d8f..ddd97c7b 100644 --- a/assets/scripts/lib/travis/ajax.coffee +++ b/assets/scripts/lib/travis/ajax.coffee @@ -1,3 +1,5 @@ +config = ENV.config + jQuery.support.cors = true default_options = @@ -18,7 +20,7 @@ Travis.ajax = Em.Object.create @ajax(url, 'patch', data: data, success: callback) needsAuth: (method, url) -> - return true if Travis.ajax.pro + return true if config.pro return true if method != 'GET' publicEndpoint = @publicEndpoints.find (pattern) -> @@ -36,7 +38,7 @@ Travis.ajax = Em.Object.create method = method || "GET" method = method.toUpperCase() - endpoint = Travis.config.api_endpoint || '' + endpoint = config.api_endpoint || '' options = options || {} token = Travis.sessionStorage.getItem('travis.token') diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index bf364cb0..3d826312 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -1,6 +1,5 @@ -require 'ext/jquery' -require 'ext/ember/namespace' -require 'ext/ember/computed' +require 'config/environment' +require 'utils/computed-limit' require 'app' window.ENV ||= {} From a5c98c794c7661dcfb1ac702a680d306ae710412 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 15:34:32 +0100 Subject: [PATCH 114/313] Move Travis.Model to models --- assets/scripts/app/models/account.coffee | 2 +- assets/scripts/app/models/annotation.coffee | 2 +- assets/scripts/app/models/branch.coffee | 2 +- assets/scripts/app/models/broadcast.coffee | 2 +- assets/scripts/app/models/build.coffee | 2 +- assets/scripts/app/models/commit.coffee | 2 +- assets/scripts/app/models/env-var.coffee | 2 +- assets/scripts/app/models/hook.coffee | 2 +- assets/scripts/app/models/job.coffee | 2 +- assets/scripts/app/models/model.coffee | 3 +++ assets/scripts/app/models/repo.coffee | 2 +- assets/scripts/app/models/request.coffee | 2 +- assets/scripts/app/models/user.coffee | 2 +- assets/scripts/lib/travis/model.coffee | 8 -------- 14 files changed, 15 insertions(+), 20 deletions(-) create mode 100644 assets/scripts/app/models/model.coffee delete mode 100644 assets/scripts/lib/travis/model.coffee diff --git a/assets/scripts/app/models/account.coffee b/assets/scripts/app/models/account.coffee index 3af78de9..e09bd399 100644 --- a/assets/scripts/app/models/account.coffee +++ b/assets/scripts/app/models/account.coffee @@ -1,4 +1,4 @@ -require 'travis/model' +require 'models/model' Model = Travis.Model diff --git a/assets/scripts/app/models/annotation.coffee b/assets/scripts/app/models/annotation.coffee index 7a26e231..bcd5af56 100644 --- a/assets/scripts/app/models/annotation.coffee +++ b/assets/scripts/app/models/annotation.coffee @@ -1,4 +1,4 @@ -require 'travis/model' +require 'models/model' Model = Travis.Model diff --git a/assets/scripts/app/models/branch.coffee b/assets/scripts/app/models/branch.coffee index 1daabd36..7d3ad4e1 100644 --- a/assets/scripts/app/models/branch.coffee +++ b/assets/scripts/app/models/branch.coffee @@ -1,4 +1,4 @@ -require 'travis/model' +require 'models/model' Model = Travis.Model diff --git a/assets/scripts/app/models/broadcast.coffee b/assets/scripts/app/models/broadcast.coffee index 4f7e36bd..0502f953 100644 --- a/assets/scripts/app/models/broadcast.coffee +++ b/assets/scripts/app/models/broadcast.coffee @@ -1,4 +1,4 @@ -require 'travis/model' +require 'models/model' Model = Travis.Model diff --git a/assets/scripts/app/models/build.coffee b/assets/scripts/app/models/build.coffee index a0d4ffdc..b1eba873 100644 --- a/assets/scripts/app/models/build.coffee +++ b/assets/scripts/app/models/build.coffee @@ -1,4 +1,4 @@ -require 'travis/model' +require 'models/model' require 'utils/duration-calculations' require 'travis/ajax' diff --git a/assets/scripts/app/models/commit.coffee b/assets/scripts/app/models/commit.coffee index 664a1222..cbcdd209 100644 --- a/assets/scripts/app/models/commit.coffee +++ b/assets/scripts/app/models/commit.coffee @@ -1,4 +1,4 @@ -require 'travis/model' +require 'models/model' Model = Travis.Model diff --git a/assets/scripts/app/models/env-var.coffee b/assets/scripts/app/models/env-var.coffee index 10eeb270..e4b3c634 100644 --- a/assets/scripts/app/models/env-var.coffee +++ b/assets/scripts/app/models/env-var.coffee @@ -1,4 +1,4 @@ -require 'travis/model' +require 'models/model' Model = Travis.Model diff --git a/assets/scripts/app/models/hook.coffee b/assets/scripts/app/models/hook.coffee index fd6c03b1..5f1c1019 100644 --- a/assets/scripts/app/models/hook.coffee +++ b/assets/scripts/app/models/hook.coffee @@ -1,4 +1,4 @@ -require 'travis/model' +require 'models/model' Model = Travis.Model Repo = Travis.Repo diff --git a/assets/scripts/app/models/job.coffee b/assets/scripts/app/models/job.coffee index 14e129da..46284b1d 100644 --- a/assets/scripts/app/models/job.coffee +++ b/assets/scripts/app/models/job.coffee @@ -1,4 +1,4 @@ -require 'travis/model' +require 'models/model' require 'models/log' require 'travis/ajax' diff --git a/assets/scripts/app/models/model.coffee b/assets/scripts/app/models/model.coffee new file mode 100644 index 00000000..a8eadc0e --- /dev/null +++ b/assets/scripts/app/models/model.coffee @@ -0,0 +1,3 @@ +Model = DS.Model.extend() + +Travis.Model = Model diff --git a/assets/scripts/app/models/repo.coffee b/assets/scripts/app/models/repo.coffee index 316fba78..7721734c 100644 --- a/assets/scripts/app/models/repo.coffee +++ b/assets/scripts/app/models/repo.coffee @@ -1,5 +1,5 @@ require 'utils/expandable-record-array' -require 'travis/model' +require 'models/model' Model = Travis.Model ExpandableRecordArray = Travis.ExpandableRecordArray diff --git a/assets/scripts/app/models/request.coffee b/assets/scripts/app/models/request.coffee index 4ad37ecb..396c335a 100644 --- a/assets/scripts/app/models/request.coffee +++ b/assets/scripts/app/models/request.coffee @@ -1,4 +1,4 @@ -require 'travis/model' +require 'models/model' Model = Travis.Model diff --git a/assets/scripts/app/models/user.coffee b/assets/scripts/app/models/user.coffee index 0b30c1cf..8456fcf6 100644 --- a/assets/scripts/app/models/user.coffee +++ b/assets/scripts/app/models/user.coffee @@ -1,5 +1,5 @@ require 'travis/ajax' -require 'travis/model' +require 'models/model' Model = Travis.Model Ajax = Travis.ajax diff --git a/assets/scripts/lib/travis/model.coffee b/assets/scripts/lib/travis/model.coffee deleted file mode 100644 index c60797bc..00000000 --- a/assets/scripts/lib/travis/model.coffee +++ /dev/null @@ -1,8 +0,0 @@ -get = Ember.get -set = Ember.set - -Array.prototype.diff = (a) -> - this.filter (i) -> !(a.indexOf(i) > -1) - - -@Travis.Model = DS.Model.extend() From 882f6d7673c28df7828c6f9035b9dc16bd6382f2 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 15:35:45 +0100 Subject: [PATCH 115/313] ext/ember/namespace is not used anymore, remove it --- assets/scripts/lib/ext/ember/namespace.js | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 assets/scripts/lib/ext/ember/namespace.js diff --git a/assets/scripts/lib/ext/ember/namespace.js b/assets/scripts/lib/ext/ember/namespace.js deleted file mode 100644 index 52f4d0e3..00000000 --- a/assets/scripts/lib/ext/ember/namespace.js +++ /dev/null @@ -1,3 +0,0 @@ -Em.Namespace.reopen = Em.Namespace.reopenClass - - From 7422327e0ed4f971235b84f8ecde2c554d02de7f Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 15:37:39 +0100 Subject: [PATCH 116/313] Remove adapters for ember model --- assets/scripts/lib/travis/adapter.coffee | 101 ------------------ .../lib/travis/adapters/env-vars.coffee | 21 ---- .../lib/travis/adapters/ssh-key.coffee | 10 -- 3 files changed, 132 deletions(-) delete mode 100644 assets/scripts/lib/travis/adapter.coffee delete mode 100644 assets/scripts/lib/travis/adapters/env-vars.coffee delete mode 100644 assets/scripts/lib/travis/adapters/ssh-key.coffee diff --git a/assets/scripts/lib/travis/adapter.coffee b/assets/scripts/lib/travis/adapter.coffee deleted file mode 100644 index 42ce5eca..00000000 --- a/assets/scripts/lib/travis/adapter.coffee +++ /dev/null @@ -1,101 +0,0 @@ -get = Ember.get - -Travis.Adapter = Ember.RESTAdapter.extend - ajax: (url, params, method) -> - Travis.ajax.ajax(url, method || 'get', data: params) - - findMany: (klass, records, ids) -> - url = @buildURL(klass) - - self = this - @ajax(url, ids: ids).then (data) -> - self.didFindMany(klass, records, data) - - didFindMany: (klass, records, data) -> - collectionKey = Ember.get(klass, 'collectionKey') - dataToLoad = if collectionKey then data[collectionKey] else data - - @sideload(klass, data) - records.load(klass, dataToLoad) - @addToRecordArrays(records.get('content')) - - buildURL: (klass, id, record) -> - @_super.apply(this, arguments).replace(/\.json$/, '') - - didFind: (record, id, data) -> - @sideload(record.constructor, data) - @_super(record, id, data) - @addToRecordArrays(record) - - didFindAll: (klass, records, data) -> - @sideload(klass, data) - @_super(klass, records, data) - @addToRecordArrays(records.get('content')) - - didFindQuery: (klass, records, params, data) -> - @sideload(klass, data) - @_super(klass, records, params, data) - @addToRecordArrays(records.get('content')) - - didCreateRecord: (record, data) -> - @sideload(record.constructor, data) - @_super(record, data) - @addToRecordArrays(record) - - didSaveRecord: (record, data) -> - @sideload(record.constructor, data) - @_super(record, data) - @addToRecordArrays(record) - - didDeleteRecord: (record, data) -> - @sideload(record.constructor, data) - @_super(record, data) - @addToRecordArrays(record) - - addToRecordArrays: (records) -> - records = [records] unless Ember.isArray(records) - for record in records - record.constructor.addToRecordArrays(record) - - sideload: (klass, data) -> - for name, records of data - records = [records] unless Ember.isArray(records) - - # we need to skip records of type, which is loaded by adapter already - if (type = Ember.get(Travis, 'mappings')[name]) && type != klass - for record in records - record = type.findFromCacheOrLoad(record) - @addToRecordArrays(record) - - find: (record, id) -> - url = @buildURL(record.constructor, id, record) - self = this - @ajax(url).then (data) -> - self.didFind record, id, data - record - - createRecord: (record) -> - url = @buildURL(record.constructor, undefined, record) - self = this - @ajax(url, record.toJSON(), "POST").then (data) -> - self.didCreateRecord record, data - record - - deleteRecord: (record) -> - primaryKey = get(record.constructor, "primaryKey") - url = @buildURL(record.constructor, get(record, primaryKey), record) - self = this - @ajax(url, record.toJSON(), "DELETE").then (data) -> # TODO: Some APIs may or may not return data - self.didDeleteRecord record, data - return - - saveRecord: (record) -> - primaryKey = get(record.constructor, 'primaryKey') - url = this.buildURL(record.constructor, get(record, primaryKey), record) - self = this - - return this.ajax(url, record.toJSON(), "PUT").then (data) -> - self.didSaveRecord(record, data) - return record - - diff --git a/assets/scripts/lib/travis/adapters/env-vars.coffee b/assets/scripts/lib/travis/adapters/env-vars.coffee deleted file mode 100644 index 36dba2c2..00000000 --- a/assets/scripts/lib/travis/adapters/env-vars.coffee +++ /dev/null @@ -1,21 +0,0 @@ -require 'travis/adapter' -get = Ember.get - -Travis.EnvVarsAdapter = Travis.Adapter.extend - buildURL: (klass, id, record) -> - url = @_super.apply this, arguments - if record && (repo_id = get(record, 'repository_id') || get(record, 'repo.id')) - url = "#{url}?repository_id=#{repo_id}" - - url - - saveRecord: (record) -> - primaryKey = get(record.constructor, 'primaryKey') - url = this.buildURL(record.constructor, get(record, primaryKey), record) - self = this - - return this.ajax(url, record.toJSON(), "PATCH").then (data) -> - self.didSaveRecord(record, data) - return record - - diff --git a/assets/scripts/lib/travis/adapters/ssh-key.coffee b/assets/scripts/lib/travis/adapters/ssh-key.coffee deleted file mode 100644 index 11a683b2..00000000 --- a/assets/scripts/lib/travis/adapters/ssh-key.coffee +++ /dev/null @@ -1,10 +0,0 @@ -Travis.SshKeyAdapter = Travis.Adapter.extend - buildURL: (klass, id, record) -> - url = @_super.apply this, arguments - - createRecord: (record) -> - url = @buildURL(record.constructor, record.get('id'), record) - self = this - @ajax(url, record.toJSON(), "PATCH").then (data) -> - self.didCreateRecord record, data - record From 316b43144d2ffd5c7ea345e34e000ecf5f61b6e3 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 15:38:08 +0100 Subject: [PATCH 117/313] Move ajax from lib to utils --- assets/scripts/app/models/build.coffee | 2 +- assets/scripts/app/models/job.coffee | 2 +- assets/scripts/app/models/user.coffee | 2 +- assets/scripts/app/routes/caches.coffee | 2 +- assets/scripts/app/routes/ssh-key.coffee | 2 +- assets/scripts/{lib/travis => app/utils}/ajax.coffee | 0 6 files changed, 5 insertions(+), 5 deletions(-) rename assets/scripts/{lib/travis => app/utils}/ajax.coffee (100%) diff --git a/assets/scripts/app/models/build.coffee b/assets/scripts/app/models/build.coffee index b1eba873..f4202a7b 100644 --- a/assets/scripts/app/models/build.coffee +++ b/assets/scripts/app/models/build.coffee @@ -1,6 +1,6 @@ require 'models/model' require 'utils/duration-calculations' -require 'travis/ajax' +require 'utils/ajax' compact = Travis.Helpers.compact configKeys = Travis.Helpers.configKeys diff --git a/assets/scripts/app/models/job.coffee b/assets/scripts/app/models/job.coffee index 46284b1d..92db2f69 100644 --- a/assets/scripts/app/models/job.coffee +++ b/assets/scripts/app/models/job.coffee @@ -1,6 +1,6 @@ require 'models/model' require 'models/log' -require 'travis/ajax' +require 'utils/ajax' Model = Travis.Model DurationCalculations = Travis.DurationCalculations diff --git a/assets/scripts/app/models/user.coffee b/assets/scripts/app/models/user.coffee index 8456fcf6..02eca2ba 100644 --- a/assets/scripts/app/models/user.coffee +++ b/assets/scripts/app/models/user.coffee @@ -1,4 +1,4 @@ -require 'travis/ajax' +require 'utils/ajax' require 'models/model' Model = Travis.Model diff --git a/assets/scripts/app/routes/caches.coffee b/assets/scripts/app/routes/caches.coffee index d478d3f3..1f4c3ddc 100644 --- a/assets/scripts/app/routes/caches.coffee +++ b/assets/scripts/app/routes/caches.coffee @@ -1,6 +1,6 @@ require 'routes/route' require 'models/request' -require 'travis/ajax' +require 'utils/ajax' Request = Travis.Request Ajax = Travis.ajax diff --git a/assets/scripts/app/routes/ssh-key.coffee b/assets/scripts/app/routes/ssh-key.coffee index 2d3fa61e..42d9b47f 100644 --- a/assets/scripts/app/routes/ssh-key.coffee +++ b/assets/scripts/app/routes/ssh-key.coffee @@ -1,6 +1,6 @@ require 'routes/route' require 'models/ssh-key' -require 'travis/ajax' +require 'utils/ajax' SshKey = Travis.SshKey Ajax = Travis.ajax diff --git a/assets/scripts/lib/travis/ajax.coffee b/assets/scripts/app/utils/ajax.coffee similarity index 100% rename from assets/scripts/lib/travis/ajax.coffee rename to assets/scripts/app/utils/ajax.coffee From 949431b7dfcea1812b58f35efbc544f7a723708e Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 15:42:26 +0100 Subject: [PATCH 118/313] Move remaining files from lib/travis to utils --- .../app/controllers/env-var-new.coffee | 2 +- assets/scripts/app/controllers/env-var.coffee | 2 +- assets/scripts/app/controllers/ssh-key.coffee | 2 +- assets/scripts/app/models/log.coffee | 2 +- assets/scripts/app/router.coffee | 2 +- .../utils}/lines-selector.coffee | 0 .../{lib/travis => app/utils}/location.coffee | 0 .../travis => app/utils}/log-chunks.coffee | 0 .../travis => app/utils}/log-folder.coffee | 0 assets/scripts/app/views/log.coffee | 4 +- assets/scripts/lib/travis/chunk-buffer.coffee | 96 ----------- .../scripts/lib/travis/instrumentation.coffee | 8 - assets/scripts/lib/travis/ordered-log.coffee | 153 ------------------ 13 files changed, 7 insertions(+), 264 deletions(-) rename assets/scripts/{lib/travis => app/utils}/lines-selector.coffee (100%) rename assets/scripts/{lib/travis => app/utils}/location.coffee (100%) rename assets/scripts/{lib/travis => app/utils}/log-chunks.coffee (100%) rename assets/scripts/{lib/travis => app/utils}/log-folder.coffee (100%) delete mode 100644 assets/scripts/lib/travis/chunk-buffer.coffee delete mode 100644 assets/scripts/lib/travis/instrumentation.coffee delete mode 100644 assets/scripts/lib/travis/ordered-log.coffee diff --git a/assets/scripts/app/controllers/env-var-new.coffee b/assets/scripts/app/controllers/env-var-new.coffee index 6b511d6e..ff1bceee 100644 --- a/assets/scripts/app/controllers/env-var-new.coffee +++ b/assets/scripts/app/controllers/env-var-new.coffee @@ -1,4 +1,4 @@ -require 'travis/validations' +require 'utils/validations' Validations = Travis.Validations EnvVar = Travis.EnvVar diff --git a/assets/scripts/app/controllers/env-var.coffee b/assets/scripts/app/controllers/env-var.coffee index 1618bd83..5eb76365 100644 --- a/assets/scripts/app/controllers/env-var.coffee +++ b/assets/scripts/app/controllers/env-var.coffee @@ -1,4 +1,4 @@ -require 'travis/validations' +require 'utils/validations' Validations = Travis.Validations diff --git a/assets/scripts/app/controllers/ssh-key.coffee b/assets/scripts/app/controllers/ssh-key.coffee index f02ff0e3..83076178 100644 --- a/assets/scripts/app/controllers/ssh-key.coffee +++ b/assets/scripts/app/controllers/ssh-key.coffee @@ -1,4 +1,4 @@ -require 'travis/validations' +require 'utils/validations' Validations = Travis.Validations diff --git a/assets/scripts/app/models/log.coffee b/assets/scripts/app/models/log.coffee index 97b0b713..d57dd5ba 100644 --- a/assets/scripts/app/models/log.coffee +++ b/assets/scripts/app/models/log.coffee @@ -1,4 +1,4 @@ -require 'travis/log-chunks' +require 'utils/log-chunks' Ajax = Travis.ajax diff --git a/assets/scripts/app/router.coffee b/assets/scripts/app/router.coffee index 45716538..bd77d34c 100644 --- a/assets/scripts/app/router.coffee +++ b/assets/scripts/app/router.coffee @@ -1,4 +1,4 @@ -require 'travis/location' +require 'utils/location' require 'routes/application' config = ENV.config diff --git a/assets/scripts/lib/travis/lines-selector.coffee b/assets/scripts/app/utils/lines-selector.coffee similarity index 100% rename from assets/scripts/lib/travis/lines-selector.coffee rename to assets/scripts/app/utils/lines-selector.coffee diff --git a/assets/scripts/lib/travis/location.coffee b/assets/scripts/app/utils/location.coffee similarity index 100% rename from assets/scripts/lib/travis/location.coffee rename to assets/scripts/app/utils/location.coffee diff --git a/assets/scripts/lib/travis/log-chunks.coffee b/assets/scripts/app/utils/log-chunks.coffee similarity index 100% rename from assets/scripts/lib/travis/log-chunks.coffee rename to assets/scripts/app/utils/log-chunks.coffee diff --git a/assets/scripts/lib/travis/log-folder.coffee b/assets/scripts/app/utils/log-folder.coffee similarity index 100% rename from assets/scripts/lib/travis/log-folder.coffee rename to assets/scripts/app/utils/log-folder.coffee diff --git a/assets/scripts/app/views/log.coffee b/assets/scripts/app/views/log.coffee index 00a127fa..6264d53e 100644 --- a/assets/scripts/app/views/log.coffee +++ b/assets/scripts/app/views/log.coffee @@ -1,6 +1,6 @@ require 'log' -require 'travis/lines-selector' -require 'travis/log-folder' +require 'utils/lines-selector' +require 'utils/log-folder' Log.DEBUG = false Log.LIMIT = 10000 diff --git a/assets/scripts/lib/travis/chunk-buffer.coffee b/assets/scripts/lib/travis/chunk-buffer.coffee deleted file mode 100644 index e49a90f0..00000000 --- a/assets/scripts/lib/travis/chunk-buffer.coffee +++ /dev/null @@ -1,96 +0,0 @@ -get = Ember.get - -Travis.ChunkBuffer = Em.ArrayProxy.extend - timeout: 5000 - checkTimeoutFrequency: 5000 - start: 1 - next: 1 - - init: -> - @_super.apply this, arguments - - @lastInsert = 0 - - @set('next', @get('start')) - - @checkTimeout() - - if @get('content.length') - @get('queue.content').pushObjects @get('content').toArray() - - arrangedContent: (-> - [] - ).property('content') - - addObject: (obj) -> - @get('content').pushObject(obj) - - removeObject: (obj) -> - @get('content').removeObject(obj) - - replaceContent: (idx, amt, objects) -> - @get('content').replace(idx, amt, objects) - - queue: (-> - Em.ArrayProxy.extend(Em.SortableMixin, { - content: [] - sortProperties: ['number'] - sortAscending: true - }).create() - ).property() - - contentArrayDidChange: (array, index, removedCount, addedCount) -> - @_super.apply this, arguments - - if addedCount - queue = @get('queue') - addedObjects = array.slice(index, index + addedCount) - console.log 'Added log parts with numbers:', addedObjects.map( (element) -> get(element, 'number') )+'', 'current', @get('next') - queue.pushObjects addedObjects - @check() - - check: -> - queue = @get('queue') - next = @get('next') - - arrangedContent = @get('arrangedContent') - toPush = [] - - while queue.get('firstObject.number') <= next - element = queue.shiftObject() - if get(element, 'number') == next - @finalize() if get(element, 'final') - toPush.pushObject get(element, 'content') - next += 1 - - if toPush.length - arrangedContent.pushObjects toPush - @inserted() - - @set('next', next) - - inserted: -> - now = @now() - @lastInsert = now - - finalize: -> - clearTimeout @get('runLaterId') - - checkTimeout: -> - now = @now() - if now - @lastInsert > @get('timeout') - @giveUpOnMissingParts() - @set 'runLaterId', setTimeout((=> @checkTimeout()), @get('checkTimeoutFrequency')) - - willDestroy: -> - @finalize() - @_super.apply this, arguments - - now: -> - (new Date()).getTime() - - giveUpOnMissingParts: -> - if number = @get('queue.firstObject.number') - console.log 'Giving up on missing parts in the buffer, switching to:', number - @set('next', number) - @check() diff --git a/assets/scripts/lib/travis/instrumentation.coffee b/assets/scripts/lib/travis/instrumentation.coffee deleted file mode 100644 index 1e9c9b17..00000000 --- a/assets/scripts/lib/travis/instrumentation.coffee +++ /dev/null @@ -1,8 +0,0 @@ -Travis.Instrumentation = { - subscribe: (event) -> - Em.subscribe event, - before:(name, timestamp, payload) -> - timestamp - after: (name, timestamp, payload, start_timestamp) -> - console.log(name, payload, timestamp - start_timestamp) -} diff --git a/assets/scripts/lib/travis/ordered-log.coffee b/assets/scripts/lib/travis/ordered-log.coffee deleted file mode 100644 index f2127204..00000000 --- a/assets/scripts/lib/travis/ordered-log.coffee +++ /dev/null @@ -1,153 +0,0 @@ -# TODO: revisit those patterns -FOLDS = [ - Em.Object.create(name: 'schema', startPattern: /^\$ (?:bundle exec )?rake( db:create)? db:schema:load/, endPattern: /^(<\/span>)?\$/) - Em.Object.create(name: 'migrate', startPattern: /^\$ (?:bundle exec )?rake( db:create)? db:migrate/, endPattern: /^(<\/span>)?\$/) - Em.Object.create(name: 'bundle', startPattern: /^\$ bundle install/, endPattern: /^(<\/span>)?\$/) -] - -@Travis.OrderedLog = Em.Object.extend - linesLimit: 5000 - init: -> - @set 'folds', [] - @set 'line', 1 - @set 'lineNumber', 1 - @initial = true - - for fold in FOLDS - @addFold fold - - append: (lines) -> - return unless lines - return if @get('lineNumber') > @get('linesLimit') - - log = @join lines - log = @escape log - log = @deansi log - lines = @split log - - target = @get 'target' - index = 0 - currentFold = @currentFold - - result = [] - - for line in lines - if line == '\r' - @set 'replace', true - else if line == '\n' - @set 'newline', true - index += 1 - else - if currentFold && ( @isFoldEnding(currentFold, line) ) - # end of the fold, send fold to target - if result.length > 0 - result.slice(-1)[0].foldEnd = true - target.appendLog result - - @currentFold = currentFold = null - @set 'foldContinuation', false - result = [] - - if !currentFold && ( currentFold = @foldByStart(line) ) - # beginning new fold, send current lines to target - if result.length > 0 - target.appendLog result - - result = [] - start = index - - payload = { content: line } - - if currentFold - payload.fold = currentFold.get('name') - - if @get 'foldContinuation' - payload.foldContinuation = true - - payload.number = @get('lineNumber') + index - - if @get 'replace' - @set 'replace', false - payload.replace = true - else if @get 'newline' - @set 'newline', false - else if !@initial - payload.append = true - - @initial = false - - if payload.foldContinuation && payload.content.match(/Done. Build script exited|Your build has been stopped/) - # script ended, but fold is still closed, which most probably means - # error, end the fold and open it. - # TODO: we need log marks to make it easier - payload.foldContinuation = null - payload.openFold = payload.fold - payload.fold = null - - result.pushObject payload - - if currentFold - @set 'foldContinuation', true - - if @get('lineNumber') + index >= @get('linesLimit') - result.pushObject logWasCut: true - break - - if result.length > 0 - if currentFold - @currentFold = currentFold - - target.appendLog result - - nextLineNumber = @get('lineNumber') + index - @set 'lineNumber', nextLineNumber - - join: (lines) -> - if typeof lines == 'string' - lines - else - lines.toArray().join '' - - split: (log) -> - log = log.replace /\r\n/g, '\n' - lines = log.split(/(\n)/) - - if lines.slice(-1)[0] == '' - lines.popObject() - - result = [] - for line in lines - result.pushObjects line.split(/(\r)/) - - result - - escape: (log) -> - Handlebars.Utils.escapeExpression log - - deansi: (log) -> - log = log.replace(/\r\r/g, '\r') - .replace(/\033\[K\r/g, '\r') - .replace(/\[2K/g, '') - .replace(/\033\(B/g, '') - .replace(/\033\[\d+G/g, '') - - ansi = ansiparse(log) - - text = '' - ansi.forEach (part) -> - classes = [] - part.foreground and classes.push(part.foreground) - part.background and classes.push('bg-' + part.background) - part.bold and classes.push('bold') - part.italic and classes.push('italic') - text += (if classes.length then ('' + part.text + '') else part.text) - text.replace /\033/g, '' - - addFold: (fold) -> - @get('folds').pushObject fold - - foldByStart: (line) -> - @get('folds').find (fold) -> line.match(fold.get('startPattern')) - - isFoldEnding: (fold, line) -> - line.match(fold.get('endPattern')) From d01fa740ea3a71adea1376e204d616a8e931d288 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 15:45:17 +0100 Subject: [PATCH 119/313] Change remaining requires for lib/travis/ --- assets/scripts/travis.coffee | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index 3d826312..0b2b1b30 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -19,7 +19,7 @@ if charm_key = $('meta[name="travis.charm_key"]').attr('value') $('head').append $('') -require 'travis/ajax' +require 'utils/ajax' require 'utils/urls' require 'utils/helpers' @@ -217,6 +217,4 @@ require 'views/dashboard/loading' require 'components/travis-switch' -require 'travis/instrumentation' - Travis.setup() From 031cc0124d1a4570109bc1e99781283f15e4b54a Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 15:46:27 +0100 Subject: [PATCH 120/313] Event model and view are not used anymore, remove them --- assets/scripts/app/views/events.coffee | 8 -------- assets/scripts/travis.coffee | 2 -- 2 files changed, 10 deletions(-) delete mode 100644 assets/scripts/app/views/events.coffee diff --git a/assets/scripts/app/views/events.coffee b/assets/scripts/app/views/events.coffee deleted file mode 100644 index df223b08..00000000 --- a/assets/scripts/app/views/events.coffee +++ /dev/null @@ -1,8 +0,0 @@ -@Travis.reopen - EventsView: Travis.View.extend - templateName: 'events/list' - eventsBinding: 'controller.events' - - EventsItemView: Travis.View.extend - tagName: 'tr' - diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index 0b2b1b30..43bda1ea 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -170,7 +170,6 @@ require 'models/broadcast' require 'models/branch' require 'models/build' require 'models/commit' -require 'models/event' require 'models/hook' require 'models/job' require 'models/log' @@ -187,7 +186,6 @@ require 'views/accounts' require 'views/annotation' require 'views/application' require 'views/build' -require 'views/events' require 'views/flash' require 'views/job' require 'views/jobs' From 0a048d1f008cc36cbab8d9a131f516535d82819a Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:07:28 +0100 Subject: [PATCH 121/313] Move things from App.setup() to initializer --- assets/scripts/app/app.coffee | 21 +++++++------------ .../app/initializers/google-analytics.coffee | 6 ++++-- .../scripts/app/initializers/services.coffee | 21 +++++++++++++++++++ assets/scripts/app/utils/pusher.coffee | 2 ++ assets/scripts/travis.coffee | 3 --- 5 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 assets/scripts/app/initializers/services.coffee diff --git a/assets/scripts/app/app.coffee b/assets/scripts/app/app.coffee index 6d92f52f..8c634f31 100644 --- a/assets/scripts/app/app.coffee +++ b/assets/scripts/app/app.coffee @@ -1,3 +1,5 @@ +config = ENV.config + App = Ember.Application.extend(Ember.Evented, LOG_TRANSITIONS: true LOG_TRANSITIONS_INTERNAL: true @@ -6,18 +8,6 @@ App = Ember.Application.extend(Ember.Evented, LOG_VIEW_LOOKUPS: true #LOG_RESOLVER: true - setup: -> - if @config.pusher.key - @pusher = new Travis.Pusher(@config.pusher) - @tailing = new Travis.Tailing($(window), '#tail', '#log') - @toTop = new Travis.ToTop($(window), '.to-top', '#log-container') - - @on 'user:signed_in', (user) -> - Travis.onUserUpdate(user) - - @on 'user:synced', (user) -> - Travis.onUserUpdate(user) - lookup: -> @__container__.lookup.apply @__container__, arguments @@ -84,9 +74,14 @@ App = Ember.Application.extend(Ember.Evented, Em.run.later (-> element.remove()), 10 ready: -> - @slider = new Travis.Slider(@storage) location.href = location.href.replace('#!/', '') if location.hash.slice(0, 2) == '#!' + @on 'user:signed_in', (user) -> + Travis.onUserUpdate(user) + + @on 'user:synced', (user) -> + Travis.onUserUpdate(user) + currentDate: -> new Date() diff --git a/assets/scripts/app/initializers/google-analytics.coffee b/assets/scripts/app/initializers/google-analytics.coffee index ad8b6e6e..01aa569f 100644 --- a/assets/scripts/app/initializers/google-analytics.coffee +++ b/assets/scripts/app/initializers/google-analytics.coffee @@ -1,7 +1,9 @@ +config = ENV.config + initialize = (container) -> - if Travis.config.ga_code + if config.ga_code window._gaq = [] - _gaq.push(['_setAccount', Travis.config.ga_code]) + _gaq.push(['_setAccount', config.ga_code]) ga = document.createElement('script') ga.type = 'text/javascript' diff --git a/assets/scripts/app/initializers/services.coffee b/assets/scripts/app/initializers/services.coffee new file mode 100644 index 00000000..ef6f2663 --- /dev/null +++ b/assets/scripts/app/initializers/services.coffee @@ -0,0 +1,21 @@ +config = ENV.config +Slider = Travis.Slider +Pusher = Travis.Pusher +Tailing = Travis.Tailing +ToTop = Travis.ToTop + +initialize = (container, application) -> + application.slider = new Slider(application.storage) + + if config.pusher.key + application.pusher = new Pusher(config.pusher) + + application.tailing = new Tailing($(window), '#tail', '#log') + application.toTop = new ToTop($(window), '.to-top', '#log-container') + +Initializer = + name: 'services' + initialize: initialize + +Ember.onLoad 'Ember.Application', (Application) -> + Application.initializer Initializer diff --git a/assets/scripts/app/utils/pusher.coffee b/assets/scripts/app/utils/pusher.coffee index adfadaa0..55866404 100644 --- a/assets/scripts/app/utils/pusher.coffee +++ b/assets/scripts/app/utils/pusher.coffee @@ -166,3 +166,5 @@ if config.pro ] ] ] + +Travis.Pusher = TravisPusher diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index 43bda1ea..df7d32c8 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -180,7 +180,6 @@ require 'models/user' require 'models/env-var' require 'models/ssh-key' -require 'ext/ember/namespace' require 'views/view' require 'views/accounts' require 'views/annotation' @@ -214,5 +213,3 @@ require 'views/application/loading' require 'views/dashboard/loading' require 'components/travis-switch' - -Travis.setup() From 6fb1bfaaaf7056d21b70490a71561a55e64faf71 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:07:39 +0100 Subject: [PATCH 122/313] Actually require initializers --- assets/scripts/travis.coffee | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index df7d32c8..83bcc1fa 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -19,6 +19,14 @@ if charm_key = $('meta[name="travis.charm_key"]').attr('value') $('head').append $('') +require 'initializers/auth' +require 'initializers/config' +require 'initializers/google-analytics' +require 'initializers/pusher' +require 'initializers/services' +require 'initializers/storage' +require 'initializers/stylesheets-manager' + require 'utils/ajax' require 'utils/urls' From 165d072d793a828ce73c98bf0a57692c56b16e26 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:15:13 +0100 Subject: [PATCH 123/313] Use ENV.config instead of Travis.config --- .../scripts/app/adapters/application.coffee | 6 ++--- assets/scripts/app/app.coffee | 2 +- assets/scripts/app/models/hook.coffee | 7 ++--- assets/scripts/app/models/log.coffee | 5 ++-- assets/scripts/app/models/user.coffee | 3 ++- assets/scripts/app/router.coffee | 2 +- assets/scripts/app/routes/route.coffee | 4 ++- assets/scripts/app/utils/helpers.coffee | 2 +- assets/scripts/app/utils/urls.coffee | 26 ++++++++++--------- assets/scripts/app/views/log.coffee | 4 ++- assets/scripts/app/views/repo-actions.coffee | 4 ++- assets/scripts/app/views/repo.coffee | 3 ++- 12 files changed, 40 insertions(+), 28 deletions(-) diff --git a/assets/scripts/app/adapters/application.coffee b/assets/scripts/app/adapters/application.coffee index 426b742e..3792cc30 100644 --- a/assets/scripts/app/adapters/application.coffee +++ b/assets/scripts/app/adapters/application.coffee @@ -1,7 +1,7 @@ +config = ENV.config + Adapter = DS.ActiveModelAdapter.extend - host: (-> - Travis.config.api_endpoint - ).property() + host: config.api_endpoint ajaxOptions: (url, type, options) -> hash = @_super(url, type, options) diff --git a/assets/scripts/app/app.coffee b/assets/scripts/app/app.coffee index 8c634f31..f3559c3b 100644 --- a/assets/scripts/app/app.coffee +++ b/assets/scripts/app/app.coffee @@ -86,7 +86,7 @@ App = Ember.Application.extend(Ember.Evented, new Date() onUserUpdate: (user) -> - if Travis.config.pro + if config.pro @identifyCustomer(user) @subscribePusher(user) @setupCharm(user) diff --git a/assets/scripts/app/models/hook.coffee b/assets/scripts/app/models/hook.coffee index 5f1c1019..9abd4bb0 100644 --- a/assets/scripts/app/models/hook.coffee +++ b/assets/scripts/app/models/hook.coffee @@ -1,7 +1,8 @@ require 'models/model' +config = ENV.config + Model = Travis.Model -Repo = Travis.Repo Hook = Model.extend name: DS.attr() @@ -20,11 +21,11 @@ Hook = Model.extend ).property('ownerName', 'name') urlGithub: (-> - "#{Travis.config.source_endpoint}/#{@get('slug')}" + "#{config.source_endpoint}/#{@get('slug')}" ).property() urlGithubAdmin: (-> - "#{Travis.config.source_endpoint}/#{@get('slug')}/settings/hooks#travis_minibucket" + "#{config.source_endpoint}/#{@get('slug')}/settings/hooks#travis_minibucket" ).property() toggle: -> diff --git a/assets/scripts/app/models/log.coffee b/assets/scripts/app/models/log.coffee index d57dd5ba..25c17ac4 100644 --- a/assets/scripts/app/models/log.coffee +++ b/assets/scripts/app/models/log.coffee @@ -1,6 +1,7 @@ require 'utils/log-chunks' Ajax = Travis.ajax +config = ENV.config Request = Ember.Object.extend HEADERS: @@ -13,7 +14,7 @@ Request = Ember.Object.extend success: (body, status, xhr) => Ember.run(this, -> @handle(body, status, xhr)) handle: (body, status, xhr) -> - if Travis.config.pro + if config.pro @log.set('token', xhr.getResponseHeader('X-Log-Access-Token')) if xhr.status == 204 @@ -58,7 +59,7 @@ Log = Ember.Object.extend @append part parts: (-> - #if Travis.config.pusher_log_fallback + #if config.pusher_log_fallback # Travis.LogChunks.create(content: [], missingPartsCallback: => @fetchMissingParts.apply(this, arguments)) #else Ember.ArrayProxy.create(content: []) diff --git a/assets/scripts/app/models/user.coffee b/assets/scripts/app/models/user.coffee index 02eca2ba..e8f211c9 100644 --- a/assets/scripts/app/models/user.coffee +++ b/assets/scripts/app/models/user.coffee @@ -4,6 +4,7 @@ require 'models/model' Model = Travis.Model Ajax = Travis.ajax Account = Travis.Account +config = ENV.config User = Model.extend name: DS.attr() @@ -25,7 +26,7 @@ User = Model.extend ).observes('isSyncing') urlGithub: (-> - "#{Travis.config.source_endpoint}/#{@get('login')}" + "#{config.source_endpoint}/#{@get('login')}" ).property() _rawPermissions: (-> diff --git a/assets/scripts/app/router.coffee b/assets/scripts/app/router.coffee index bd77d34c..91305879 100644 --- a/assets/scripts/app/router.coffee +++ b/assets/scripts/app/router.coffee @@ -13,7 +13,7 @@ Router = Ember.Router.extend didTransition: -> @_super.apply @, arguments - if Travis.config.ga_code + if config.ga_code _gaq.push ['_trackPageview', location.pathname] Router.map -> diff --git a/assets/scripts/app/routes/route.coffee b/assets/scripts/app/routes/route.coffee index 318bd68e..c67da07f 100644 --- a/assets/scripts/app/routes/route.coffee +++ b/assets/scripts/app/routes/route.coffee @@ -1,3 +1,5 @@ +config = ENV.config + Route = Ember.Route.extend beforeModel: (transition) -> @auth.autoSignIn() unless @signedIn() @@ -13,7 +15,7 @@ Route = Ember.Route.extend needsAuth: (-> # on pro, we need to auth on every route - Travis.config.pro + config.pro ).property() Travis.Route = Route diff --git a/assets/scripts/app/utils/helpers.coffee b/assets/scripts/app/utils/helpers.coffee index 70eefc20..52bd0c50 100644 --- a/assets/scripts/app/utils/helpers.coffee +++ b/assets/scripts/app/utils/helpers.coffee @@ -1,7 +1,7 @@ require 'config/emoij' config_keys_map = Travis.CONFIG_KEYS_MAP -config = Travis.config +config = ENV.config githubCommitUrl = Travis.Urls.githubCommit timeago = $.timeago intersect = $.intersect diff --git a/assets/scripts/app/utils/urls.coffee b/assets/scripts/app/utils/urls.coffee index 8169f6a6..57811a1d 100644 --- a/assets/scripts/app/utils/urls.coffee +++ b/assets/scripts/app/utils/urls.coffee @@ -1,43 +1,45 @@ +config = ENV.config + plainTextLog = (id) -> - "#{Travis.config.api_endpoint}/jobs/#{id}/log.txt?deansi=true" + "#{config.api_endpoint}/jobs/#{id}/log.txt?deansi=true" githubPullRequest = (slug, pullRequestNumber) -> - "#{Travis.config.source_endpoint}/#{slug}/pull/#{pullRequestNumber}" + "#{config.source_endpoint}/#{slug}/pull/#{pullRequestNumber}" githubCommit = (slug, sha) -> - "#{Travis.config.source_endpoint}/#{slug}/commit/#{sha}" + "#{config.source_endpoint}/#{slug}/commit/#{sha}" githubRepo = (slug) -> - "#{Travis.config.source_endpoint}/#{slug}" + "#{config.source_endpoint}/#{slug}" githubWatchers = (slug) -> - "#{Travis.config.source_endpoint}/#{slug}/watchers" + "#{config.source_endpoint}/#{slug}/watchers" githubNetwork = (slug) -> - "#{Travis.config.source_endpoint}/#{slug}/network" + "#{config.source_endpoint}/#{slug}/network" githubAdmin = (slug) -> - "#{Travis.config.source_endpoint}/#{slug}/settings/hooks#travis_minibucket" + "#{config.source_endpoint}/#{slug}/settings/hooks#travis_minibucket" statusImage = (slug, branch) -> - if Travis.config.pro + if config.pro token = Travis.__container__.lookup('controller:currentUser').get('token') "#{location.protocol}//#{location.host}/#{slug}.svg?token=#{token}" + if branch then "&branch=#{branch}" else '' else "#{location.protocol}//#{location.host}/#{slug}.svg" + if branch then "?branch=#{encodeURIComponent(branch)}" else '' ccXml = (slug) -> - if Travis.config.pro + if config.pro token = Travis.__container__.lookup('controller:currentUser').get('token') - "##{Travis.config.api_endpoint}/repos/#{slug}/cc.xml?token=#{token}" + "##{config.api_endpoint}/repos/#{slug}/cc.xml?token=#{token}" else - "#{Travis.config.api_endpoint}/repos/#{slug}/cc.xml" + "#{config.api_endpoint}/repos/#{slug}/cc.xml" email = (email) -> "mailto:#{email}" gravatarImage = (email, size) -> - "https://www.gravatar.com/avatar/#{md5(email)}?s=#{size}&d=#{encodeURIComponent(Travis.config.avatar_default_url)}" + "https://www.gravatar.com/avatar/#{md5(email)}?s=#{size}&d=#{encodeURIComponent(config.avatar_default_url)}" Travis.Urls = { plainTextLog: plainTextLog, diff --git a/assets/scripts/app/views/log.coffee b/assets/scripts/app/views/log.coffee index 6264d53e..b03616f9 100644 --- a/assets/scripts/app/views/log.coffee +++ b/assets/scripts/app/views/log.coffee @@ -5,6 +5,8 @@ require 'utils/log-folder' Log.DEBUG = false Log.LIMIT = 10000 +config = ENV.config + Travis.reopen LogView: Travis.View.extend templateName: 'jobs/log' @@ -106,7 +108,7 @@ Travis.reopen plainTextLogUrl: (-> if id = @get('log.job.id') url = Travis.Urls.plainTextLog(id) - if Travis.config.pro + if config.pro url += "&access_token=#{@get('job.log.token')}" url ).property('job.log.id', 'job.log.token') diff --git a/assets/scripts/app/views/repo-actions.coffee b/assets/scripts/app/views/repo-actions.coffee index fdf782d5..3d8a5b58 100644 --- a/assets/scripts/app/views/repo-actions.coffee +++ b/assets/scripts/app/views/repo-actions.coffee @@ -1,3 +1,5 @@ +config = ENV.config + View = Travis.View.extend templateName: 'repos/show/actions' @@ -116,7 +118,7 @@ View = Travis.View.extend plainTextLogUrl: (-> if id = @get('jobIdForLog') url = Travis.Urls.plainTextLog(id) - if Travis.config.pro + if config.pro token = @get('job.log.token') || @get('build.jobs.firstObject.log.token') url += "&access_token=#{token}" url diff --git a/assets/scripts/app/views/repo.coffee b/assets/scripts/app/views/repo.coffee index 8f9fd259..5b8f0c48 100644 --- a/assets/scripts/app/views/repo.coffee +++ b/assets/scripts/app/views/repo.coffee @@ -1,5 +1,6 @@ statusImage = Travis.Urls.statusImage StatusImagesView = Travis.StatusImagesView +config = ENV.config View = Travis.View.extend reposBinding: 'controllers.repos' @@ -28,7 +29,7 @@ View = Travis.View.extend ReposEmptyView: Travis.View.extend template: (-> - if Travis.config.pro + if config.pro 'pro/repos/show/empty' else '' From c8be0c91e56941059ad598c07ea9c4434d06ab18 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:16:32 +0100 Subject: [PATCH 124/313] Move instantiating pusher to pusher initializer --- assets/scripts/app/initializers/pusher.coffee | 5 +++++ assets/scripts/app/initializers/services.coffee | 3 --- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/assets/scripts/app/initializers/pusher.coffee b/assets/scripts/app/initializers/pusher.coffee index fbcab799..c9cfc453 100644 --- a/assets/scripts/app/initializers/pusher.coffee +++ b/assets/scripts/app/initializers/pusher.coffee @@ -1,4 +1,9 @@ +config = ENV.config + initialize = (container, application) -> + if config.pusher.key + application.pusher = new Pusher(config.pusher) + application.register 'pusher:main', application.pusher, { instantiate: false } application.inject('route', 'pusher', 'pusher:main') diff --git a/assets/scripts/app/initializers/services.coffee b/assets/scripts/app/initializers/services.coffee index ef6f2663..64cf2f2a 100644 --- a/assets/scripts/app/initializers/services.coffee +++ b/assets/scripts/app/initializers/services.coffee @@ -7,9 +7,6 @@ ToTop = Travis.ToTop initialize = (container, application) -> application.slider = new Slider(application.storage) - if config.pusher.key - application.pusher = new Pusher(config.pusher) - application.tailing = new Tailing($(window), '#tail', '#log') application.toTop = new ToTop($(window), '.to-top', '#log-container') From fedacace0e977d35acb2b16efcb48f3d802180ea Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:17:55 +0100 Subject: [PATCH 125/313] Load initializers last --- assets/scripts/travis.coffee | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index 83bcc1fa..f50adb3c 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -19,14 +19,6 @@ if charm_key = $('meta[name="travis.charm_key"]').attr('value') $('head').append $('') -require 'initializers/auth' -require 'initializers/config' -require 'initializers/google-analytics' -require 'initializers/pusher' -require 'initializers/services' -require 'initializers/storage' -require 'initializers/stylesheets-manager' - require 'utils/ajax' require 'utils/urls' @@ -221,3 +213,11 @@ require 'views/application/loading' require 'views/dashboard/loading' require 'components/travis-switch' + +require 'initializers/auth' +require 'initializers/config' +require 'initializers/google-analytics' +require 'initializers/pusher' +require 'initializers/services' +require 'initializers/storage' +require 'initializers/stylesheets-manager' From a302f7f2739a679bae29b3b1afee74962e9d2911 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:22:32 +0100 Subject: [PATCH 126/313] Inject store to auth --- assets/scripts/app/initializers/auth.coffee | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/assets/scripts/app/initializers/auth.coffee b/assets/scripts/app/initializers/auth.coffee index 6f0c8b77..8956785c 100644 --- a/assets/scripts/app/initializers/auth.coffee +++ b/assets/scripts/app/initializers/auth.coffee @@ -5,9 +5,7 @@ initialize = (container, app) -> app.inject('controller', 'auth', 'auth:main') app.inject('application', 'auth', 'auth:main') - Auth.store = container.lookup('store:main') - Auth.config = container.lookup('config:main') - + app.inject('auth', 'store', 'store:main') AuthInitializer = name: 'auth' From 6948a3f746ae9fda0add87e61f252d487feb487f Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:22:54 +0100 Subject: [PATCH 127/313] Run storage initializer before services --- assets/scripts/app/initializers/storage.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/scripts/app/initializers/storage.coffee b/assets/scripts/app/initializers/storage.coffee index 90e1237e..b7a544c8 100644 --- a/assets/scripts/app/initializers/storage.coffee +++ b/assets/scripts/app/initializers/storage.coffee @@ -49,6 +49,7 @@ initialize = (container, application) -> StorageInitializer = name: 'storage' + before: 'services' initialize: initialize Ember.onLoad 'Ember.Application', (Application) -> From 42f9559d3365f307181e02d674cdf3e09dbe59c1 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:23:20 +0100 Subject: [PATCH 128/313] Actually run stylesheets-manager initializer --- assets/scripts/app/initializers/stylesheets-manager.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/scripts/app/initializers/stylesheets-manager.coffee b/assets/scripts/app/initializers/stylesheets-manager.coffee index 74dc10d5..42326b0a 100644 --- a/assets/scripts/app/initializers/stylesheets-manager.coffee +++ b/assets/scripts/app/initializers/stylesheets-manager.coffee @@ -13,3 +13,6 @@ initialize = (container, application) -> StylesheetsManagerInitializer = name: 'inject-stylesheets-manager' initialize: initialize + +Ember.onLoad 'Ember.Application', (Application) -> + Application.initializer StylesheetsManagerInitializer From dcd0b9d352c1862a98512033f9d8a9d734918275 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:34:49 +0100 Subject: [PATCH 129/313] Bring back requiring templates --- assets/scripts/travis.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index f50adb3c..dbcb8ead 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -221,3 +221,5 @@ require 'initializers/pusher' require 'initializers/services' require 'initializers/storage' require 'initializers/stylesheets-manager' + +require 'templates' From bfdb9cd47bf517ccca5eb919085e8f6a328e8c9f Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:44:02 +0100 Subject: [PATCH 130/313] Fix some more requires --- assets/scripts/app/controllers/flash.coffee | 2 ++ assets/scripts/app/initializers/pusher.coffee | 3 +++ 2 files changed, 5 insertions(+) diff --git a/assets/scripts/app/controllers/flash.coffee b/assets/scripts/app/controllers/flash.coffee index 7f192c68..3c2075d9 100644 --- a/assets/scripts/app/controllers/flash.coffee +++ b/assets/scripts/app/controllers/flash.coffee @@ -1,3 +1,5 @@ +require 'utils/limited-array' + LimitedArray = Travis.LimitedArray Broadcast = Travis.Broadcast diff --git a/assets/scripts/app/initializers/pusher.coffee b/assets/scripts/app/initializers/pusher.coffee index c9cfc453..bb32bc27 100644 --- a/assets/scripts/app/initializers/pusher.coffee +++ b/assets/scripts/app/initializers/pusher.coffee @@ -1,4 +1,7 @@ +require 'utils/pusher' + config = ENV.config +Pusher = Travis.Pusher initialize = (container, application) -> if config.pusher.key From 64804aae08c18402d3380327eb4a3eaf10a691ab Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:44:12 +0100 Subject: [PATCH 131/313] formatDuration was renamed to format-duration --- assets/scripts/app/templates/build.hbs | 2 +- assets/scripts/app/templates/builds.hbs | 2 +- assets/scripts/app/templates/dashboard/repositories.hbs | 2 +- assets/scripts/app/templates/job.hbs | 2 +- assets/scripts/app/templates/jobs.hbs | 2 +- assets/scripts/app/templates/repos.hbs | 2 +- assets/scripts/app/utils/pusher.coffee | 4 ++-- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/assets/scripts/app/templates/build.hbs b/assets/scripts/app/templates/build.hbs index 52b3b269..cd4e23d7 100644 --- a/assets/scripts/app/templates/build.hbs +++ b/assets/scripts/app/templates/build.hbs @@ -10,7 +10,7 @@
- {{#if build.isFinished}}ran{{else}}running{{/if}} for {{formatDuration build.duration}} + {{#if build.isFinished}}ran{{else}}running{{/if}} for {{format-duration build.duration}}
diff --git a/assets/scripts/app/templates/builds.hbs b/assets/scripts/app/templates/builds.hbs index 9aee7b62..7978bf25 100644 --- a/assets/scripts/app/templates/builds.hbs +++ b/assets/scripts/app/templates/builds.hbs @@ -50,7 +50,7 @@ {{/if}} - {{formatDuration build.duration}} + {{format-duration build.duration}} {{format-time build.finishedAt}} diff --git a/assets/scripts/app/templates/dashboard/repositories.hbs b/assets/scripts/app/templates/dashboard/repositories.hbs index 0ba4449f..b5b57bfc 100644 --- a/assets/scripts/app/templates/dashboard/repositories.hbs +++ b/assets/scripts/app/templates/dashboard/repositories.hbs @@ -44,7 +44,7 @@

{{repo.owner.login}}

{{#link-to "repo" repo.owner.login repo.name}}{{repo.name}}{{/link-to}}

-
{{formatDuration repo.last_build.duration}}
+
{{format-duration repo.last_build.duration}}
{{format-time repo.last_build.finished_at}}

{{#link-to "build" repo.owner.login repo.name repo.last_build.id}} diff --git a/assets/scripts/app/templates/job.hbs b/assets/scripts/app/templates/job.hbs index 5fd34a27..7c7ef0d8 100644 --- a/assets/scripts/app/templates/job.hbs +++ b/assets/scripts/app/templates/job.hbs @@ -11,7 +11,7 @@

- {{#if job.isFinished}}ran{{else}}running{{/if}} for {{formatDuration job.duration}} + {{#if job.isFinished}}ran{{else}}running{{/if}} for {{format-duration job.duration}}
diff --git a/assets/scripts/app/templates/jobs.hbs b/assets/scripts/app/templates/jobs.hbs index c2c0374a..adc08d93 100644 --- a/assets/scripts/app/templates/jobs.hbs +++ b/assets/scripts/app/templates/jobs.hbs @@ -30,7 +30,7 @@ {{/if}} - {{formatDuration duration}} + {{format-duration duration}} {{format-time finishedAt}} diff --git a/assets/scripts/app/templates/repos.hbs b/assets/scripts/app/templates/repos.hbs index ebb9930f..5634f533 100644 --- a/assets/scripts/app/templates/repos.hbs +++ b/assets/scripts/app/templates/repos.hbs @@ -25,7 +25,7 @@

Duration: - {{formatDuration repo.lastBuildDuration}} + {{format-duration repo.lastBuildDuration}}

diff --git a/assets/scripts/app/utils/pusher.coffee b/assets/scripts/app/utils/pusher.coffee index 55866404..c124bcae 100644 --- a/assets/scripts/app/utils/pusher.coffee +++ b/assets/scripts/app/utils/pusher.coffee @@ -38,8 +38,8 @@ TravisPusher.prototype.unsubscribe = (channel) -> @pusher.unsubscribe(channel) if @pusher?.channel(channel) TravisPusher.prototype.prefix = (channel) -> - if channel.indexOf(@config.pusher.channel_prefix) != 0 - "#{@config.pusher.channel_prefix}#{channel}" + if channel.indexOf(config.pusher.channel_prefix) != 0 + "#{config.pusher.channel_prefix}#{channel}" else channel From 52232f1b828928b6d291d47bd4945cc15f79fc3e Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 30 Jan 2015 17:44:59 +0100 Subject: [PATCH 132/313] Remove ember-model --- assets/scripts/vendor/ember-model.js | 1704 -------------------------- 1 file changed, 1704 deletions(-) delete mode 100644 assets/scripts/vendor/ember-model.js diff --git a/assets/scripts/vendor/ember-model.js b/assets/scripts/vendor/ember-model.js deleted file mode 100644 index b075f8a0..00000000 --- a/assets/scripts/vendor/ember-model.js +++ /dev/null @@ -1,1704 +0,0 @@ -(function() { - -var VERSION = '0.0.10'; - -if (Ember.libraries) { - Ember.libraries.register('Ember Model', VERSION); -} - - -})(); - -(function() { - -function mustImplement(message) { - var fn = function() { - var className = this.constructor.toString(); - - throw new Error(message.replace('{{className}}', className)); - }; - fn.isUnimplemented = true; - return fn; -} - -Ember.Adapter = Ember.Object.extend({ - find: mustImplement('{{className}} must implement find'), - findQuery: mustImplement('{{className}} must implement findQuery'), - findMany: mustImplement('{{className}} must implement findMany'), - findAll: mustImplement('{{className}} must implement findAll'), - createRecord: mustImplement('{{className}} must implement createRecord'), - saveRecord: mustImplement('{{className}} must implement saveRecord'), - deleteRecord: mustImplement('{{className}} must implement deleteRecord'), - - load: function(record, id, data) { - record.load(id, data); - } -}); - - -})(); - -(function() { - -var get = Ember.get; - -Ember.FixtureAdapter = Ember.Adapter.extend({ - _findData: function(klass, id) { - var fixtures = klass.FIXTURES, - idAsString = id.toString(), - primaryKey = get(klass, 'primaryKey'), - data = Ember.A(fixtures).find(function(el) { return (el[primaryKey]).toString() === idAsString; }); - - return data; - }, - - find: function(record, id) { - var data = this._findData(record.constructor, id); - - return new Ember.RSVP.Promise(function(resolve, reject) { - Ember.run.later(this, function() { - Ember.run(record, record.load, id, data); - resolve(record); - }, 0); - }); - }, - - findMany: function(klass, records, ids) { - var fixtures = klass.FIXTURES, - requestedData = []; - - for (var i = 0, l = ids.length; i < l; i++) { - requestedData.push(this._findData(klass, ids[i])); - } - - return new Ember.RSVP.Promise(function(resolve, reject) { - Ember.run.later(this, function() { - Ember.run(records, records.load, klass, requestedData); - resolve(records); - }, 0); - }); - }, - - findAll: function(klass, records) { - var fixtures = klass.FIXTURES; - - return new Ember.RSVP.Promise(function(resolve, reject) { - Ember.run.later(this, function() { - Ember.run(records, records.load, klass, fixtures); - resolve(records); - }, 0); - }); - }, - - createRecord: function(record) { - var klass = record.constructor, - fixtures = klass.FIXTURES; - - return new Ember.RSVP.Promise(function(resolve, reject) { - Ember.run.later(this, function() { - fixtures.push(klass.findFromCacheOrLoad(record.toJSON())); - record.didCreateRecord(); - resolve(record); - }, 0); - }); - }, - - saveRecord: function(record) { - return new Ember.RSVP.Promise(function(resolve, reject) { - Ember.run.later(this, function() { - record.didSaveRecord(); - resolve(record); - }, 0); - }); - }, - - deleteRecord: function(record) { - return new Ember.RSVP.Promise(function(resolve, reject) { - Ember.run.later(this, function() { - record.didDeleteRecord(); - resolve(record); - }, 0); - }); - } -}); - - -})(); - -(function() { - -var get = Ember.get, - set = Ember.set; - -Ember.RecordArray = Ember.ArrayProxy.extend(Ember.Evented, { - isLoaded: false, - isLoading: Ember.computed.not('isLoaded'), - - load: function(klass, data) { - set(this, 'content', this.materializeData(klass, data)); - this.notifyLoaded(); - }, - - loadForFindMany: function(klass) { - var content = get(this, '_ids').map(function(id) { return klass.cachedRecordForId(id); }); - set(this, 'content', Ember.A(content)); - this.notifyLoaded(); - }, - - notifyLoaded: function() { - set(this, 'isLoaded', true); - this.trigger('didLoad'); - }, - - materializeData: function(klass, data) { - return Ember.A(data.map(function(el) { - return klass.findFromCacheOrLoad(el); // FIXME - })); - }, - - reload: function() { - var modelClass = this.get('modelClass'), - self = this, - promises; - - set(this, 'isLoaded', false); - if (modelClass._findAllRecordArray === this) { - return modelClass.adapter.findAll(modelClass, this); - } else if (this._query) { - return modelClass.adapter.findQuery(modelClass, this, this._query); - } else { - promises = this.map(function(record) { - return record.reload(); - }); - return Ember.RSVP.all(promises).then(function(data) { - self.notifyLoaded(); - }); - } - } -}); - - -})(); - -(function() { - -var get = Ember.get; - -Ember.FilteredRecordArray = Ember.RecordArray.extend({ - init: function() { - if (!get(this, 'modelClass')) { - throw new Error('FilteredRecordArrays must be created with a modelClass'); - } - if (!get(this, 'filterFunction')) { - throw new Error('FilteredRecordArrays must be created with a filterFunction'); - } - if (!get(this, 'filterProperties')) { - throw new Error('FilteredRecordArrays must be created with filterProperties'); - } - - this._recordsCache = Ember.A([]); - - var modelClass = get(this, 'modelClass'); - modelClass.registerRecordArray(this); - - this.registerObservers(); - this.updateFilter(); - - this._super(); - }, - - updateFilter: function() { - var self = this, - results = []; - get(this, 'modelClass').forEachCachedRecord(function(record) { - if (self.filterFunction(record)) { - results.push(record); - } - }); - this.set('content', Ember.A(results)); - }, - - updateFilterForRecord: function(record) { - var results = get(this, 'content'), - filterMatches = this.filterFunction(record); - if (filterMatches && !results.contains(record)) { - results.pushObject(record); - } else if(!filterMatches) { - results.removeObject(record); - } - }, - - registerObservers: function() { - var self = this; - get(this, 'modelClass').forEachCachedRecord(function(record) { - self.registerObserversOnRecord(record); - }); - }, - - recordIsObserved: function(record) { - return this._recordsCache.contains(record); - }, - - registerObserversOnRecord: function(record) { - var self = this, - filterProperties = get(this, 'filterProperties'); - - this._recordsCache.pushObject(record); - - for (var i = 0, l = get(filterProperties, 'length'); i < l; i++) { - record.addObserver(filterProperties[i], self, 'updateFilterForRecord'); - } - } -}); - - -})(); - -(function() { - -var get = Ember.get, set = Ember.set; - -Ember.ManyArray = Ember.RecordArray.extend({ - _records: null, - originalContent: [], - - isDirty: function() { - var originalContent = get(this, 'originalContent'), - originalContentLength = get(originalContent, 'length'), - content = get(this, 'content'), - contentLength = get(content, 'length'); - - if (originalContentLength !== contentLength) { return true; } - - var isDirty = false; - - for (var i = 0, l = contentLength; i < l; i++) { - if (!originalContent.contains(content[i])) { - isDirty = true; - break; - } - } - - return isDirty; - }.property('content.[]', 'originalContent'), - - objectAtContent: function(idx) { - var content = get(this, 'content'); - - if (!content.length) { return; } - - return this.materializeRecord(idx); - }, - - save: function() { - // TODO: loop over dirty records only - return Ember.RSVP.all(this.map(function(record) { - return record.save(); - })); - }, - - replaceContent: function(index, removed, added) { - added = Ember.EnumerableUtils.map(added, function(record) { - return record._reference; - }, this); - - this._super(index, removed, added); - }, - - _contentWillChange: function() { - var content = get(this, 'content'); - if (content) { - content.removeArrayObserver(this); - this._setupOriginalContent(content); - } - }.observesBefore('content'), - - _contentDidChange: function() { - var content = get(this, 'content'); - if (content) { - content.addArrayObserver(this); - this.arrayDidChange(content, 0, 0, get(content, 'length')); - } - }.observes('content'), - - arrayWillChange: function(item, idx, removedCnt, addedCnt) {}, - - arrayDidChange: function(item, idx, removedCnt, addedCnt) { - var parent = get(this, 'parent'), relationshipKey = get(this, 'relationshipKey'), - isDirty = get(this, 'isDirty'); - - if (isDirty) { - parent._relationshipBecameDirty(relationshipKey); - } else { - parent._relationshipBecameClean(relationshipKey); - } - }, - - _setupOriginalContent: function(content) { - content = content || get(this, 'content'); - if (content) { - set(this, 'originalContent', content.slice()); - } - }, - - init: function() { - this._super(); - this._setupOriginalContent(); - this._contentDidChange(); - } -}); - -Ember.HasManyArray = Ember.ManyArray.extend({ - materializeRecord: function(idx) { - var klass = get(this, 'modelClass'), - content = get(this, 'content'), - reference = content.objectAt(idx), - record; - - if (reference.record) { - record = reference.record; - } else { - record = klass.find(reference.id); - } - - return record; - }, - - toJSON: function() { - var ids = [], content = this.get('content'); - - content.forEach(function(reference) { - if (reference.id) { - ids.push(reference.id); - } - }); - - return ids; - } -}); - -Ember.EmbeddedHasManyArray = Ember.ManyArray.extend({ - create: function(attrs) { - var klass = get(this, 'modelClass'), - record = klass.create(attrs); - - this.pushObject(record); - - return record; // FIXME: inject parent's id - }, - - materializeRecord: function(idx) { - var klass = get(this, 'modelClass'), - primaryKey = get(klass, 'primaryKey'), - content = get(this, 'content'), - reference = content.objectAt(idx), - attrs = reference.data; - - if (reference.record) { - return reference.record; - } else { - var record = klass.create({ _reference: reference }); - reference.record = record; - if (attrs) { - record.load(attrs[primaryKey], attrs); - } - return record; - } - }, - - toJSON: function() { - return this.map(function(record) { - return record.toJSON(); - }); - } -}); - - -})(); - -(function() { - -var get = Ember.get, - set = Ember.set, - setProperties = Ember.setProperties, - meta = Ember.meta, - underscore = Ember.String.underscore; - -function contains(array, element) { - for (var i = 0, l = array.length; i < l; i++) { - if (array[i] === element) { return true; } - } - return false; -} - -function concatUnique(toArray, fromArray) { - var e; - for (var i = 0, l = fromArray.length; i < l; i++) { - e = fromArray[i]; - if (!contains(toArray, e)) { toArray.push(e); } - } - return toArray; -} - -function hasCachedValue(object, key) { - var objectMeta = meta(object, false); - if (objectMeta) { - return key in objectMeta.cache; - } -} - -Ember.run.queues.push('data'); - -Ember.Model = Ember.Object.extend(Ember.Evented, { - isLoaded: true, - isLoading: Ember.computed.not('isLoaded'), - isNew: true, - isDeleted: false, - _dirtyAttributes: null, - - /** - Called when attribute is accessed. - - @method getAttr - @param key {String} key which is being accessed - @param value {Object} value, which will be returned from getter by default - */ - getAttr: function(key, value) { - return value; - }, - - isDirty: function() { - var dirtyAttributes = get(this, '_dirtyAttributes'); - return dirtyAttributes && dirtyAttributes.length !== 0 || false; - }.property('_dirtyAttributes.length'), - - _relationshipBecameDirty: function(name) { - var dirtyAttributes = get(this, '_dirtyAttributes'); - if (!dirtyAttributes.contains(name)) { dirtyAttributes.pushObject(name); } - }, - - _relationshipBecameClean: function(name) { - var dirtyAttributes = get(this, '_dirtyAttributes'); - dirtyAttributes.removeObject(name); - }, - - dataKey: function(key) { - var camelizeKeys = get(this.constructor, 'camelizeKeys'); - var meta = this.constructor.metaForProperty(key); - if (meta.options && meta.options.key) { - return camelizeKeys ? underscore(meta.options.key) : meta.options.key; - } - return camelizeKeys ? underscore(key) : key; - }, - - init: function() { - this._createReference(); - if (!this._dirtyAttributes) { - set(this, '_dirtyAttributes', []); - } - this._super(); - }, - - _createReference: function() { - var reference = this._reference, - id = this.getPrimaryKey(); - - if (!reference) { - reference = this.constructor._getOrCreateReferenceForId(id); - reference.record = this; - this._reference = reference; - } else if (reference.id !== id) { - reference.id = id; - this.constructor._cacheReference(reference); - } - - if (!reference.id) { - reference.id = id; - } - - return reference; - }, - - getPrimaryKey: function() { - return get(this, get(this.constructor, 'primaryKey')); - }, - - load: function(id, hash) { - var data = {}; - data[get(this.constructor, 'primaryKey')] = id; - set(this, '_data', Ember.merge(data, hash)); - - // eagerly load embedded data - var relationships = this.constructor._relationships || [], meta = Ember.meta(this), relationshipKey, relationship, relationshipMeta, relationshipData, relationshipType; - for (var i = 0, l = relationships.length; i < l; i++) { - relationshipKey = relationships[i]; - relationship = meta.descs[relationshipKey]; - relationshipMeta = relationship.meta(); - - if (relationshipMeta.options.embedded) { - relationshipType = relationshipMeta.type; - if (typeof relationshipType === "string") { - relationshipType = Ember.get(Ember.lookup, relationshipType); - } - - relationshipData = data[relationshipKey]; - if (relationshipData) { - relationshipType.load(relationshipData); - } - } - } - - set(this, 'isLoaded', true); - set(this, 'isNew', false); - this._createReference(); - this.trigger('didLoad'); - }, - - didDefineProperty: function(proto, key, value) { - if (value instanceof Ember.Descriptor) { - var meta = value.meta(); - var klass = proto.constructor; - - if (meta.isAttribute) { - if (!klass._attributes) { klass._attributes = []; } - klass._attributes.push(key); - } else if (meta.isRelationship) { - if (!klass._relationships) { klass._relationships = []; } - klass._relationships.push(key); - meta.relationshipKey = key; - } - } - }, - - serializeHasMany: function(key, meta) { - return this.get(key).toJSON(); - }, - - serializeBelongsTo: function(key, meta) { - if (meta.options.embedded) { - var record = this.get(key); - return record ? record.toJSON() : null; - } else { - var primaryKey = get(meta.getType(), 'primaryKey'); - return this.get(key + '.' + primaryKey); - } - }, - - toJSON: function() { - var key, meta, - json = {}, - attributes = this.constructor.getAttributes(), - relationships = this.constructor.getRelationships(), - properties = attributes ? this.getProperties(attributes) : {}, - rootKey = get(this.constructor, 'rootKey'); - - for (key in properties) { - meta = this.constructor.metaForProperty(key); - if (meta.type && meta.type.serialize) { - json[this.dataKey(key)] = meta.type.serialize(properties[key]); - } else if (meta.type && Ember.Model.dataTypes[meta.type]) { - json[this.dataKey(key)] = Ember.Model.dataTypes[meta.type].serialize(properties[key]); - } else { - json[this.dataKey(key)] = properties[key]; - } - } - - if (relationships) { - var data, relationshipKey; - - for(var i = 0; i < relationships.length; i++) { - key = relationships[i]; - meta = this.constructor.metaForProperty(key); - relationshipKey = meta.options.key || key; - - if (meta.kind === 'belongsTo') { - data = this.serializeBelongsTo(key, meta); - } else { - data = this.serializeHasMany(key, meta); - } - - json[relationshipKey] = data; - - } - } - - if (rootKey) { - var jsonRoot = {}; - jsonRoot[rootKey] = json; - return jsonRoot; - } else { - return json; - } - }, - - save: function() { - var adapter = this.constructor.adapter; - set(this, 'isSaving', true); - if (get(this, 'isNew')) { - return adapter.createRecord(this); - } else if (get(this, 'isDirty')) { - return adapter.saveRecord(this); - } else { // noop, return a resolved promise - var self = this, - promise = new Ember.RSVP.Promise(function(resolve, reject) { - resolve(self); - }); - set(this, 'isSaving', false); - return promise; - } - }, - - reload: function() { - this.getWithDefault('_dirtyAttributes', []).clear(); - return this.constructor.reload(this.get(get(this.constructor, 'primaryKey'))); - }, - - revert: function() { - this.getWithDefault('_dirtyAttributes', []).clear(); - this.notifyPropertyChange('_data'); - }, - - didCreateRecord: function() { - var primaryKey = get(this.constructor, 'primaryKey'), - id = get(this, primaryKey); - - set(this, 'isNew', false); - - set(this, '_dirtyAttributes', []); - this.constructor.addToRecordArrays(this); - this.trigger('didCreateRecord'); - this.didSaveRecord(); - }, - - didSaveRecord: function() { - set(this, 'isSaving', false); - this.trigger('didSaveRecord'); - if (this.get('isDirty')) { this._copyDirtyAttributesToData(); } - }, - - deleteRecord: function() { - return this.constructor.adapter.deleteRecord(this); - }, - - didDeleteRecord: function() { - this.constructor.removeFromRecordArrays(this); - set(this, 'isDeleted', true); - this.trigger('didDeleteRecord'); - }, - - _copyDirtyAttributesToData: function() { - if (!this._dirtyAttributes) { return; } - var dirtyAttributes = this._dirtyAttributes, - data = get(this, '_data'), - key; - - if (!data) { - data = {}; - set(this, '_data', data); - } - for (var i = 0, l = dirtyAttributes.length; i < l; i++) { - // TODO: merge Object.create'd object into prototype - key = dirtyAttributes[i]; - data[this.dataKey(key)] = this.cacheFor(key); - } - set(this, '_dirtyAttributes', []); - }, - - dataDidChange: Ember.observer(function() { - this._reloadHasManys(); - }, '_data'), - - _registerHasManyArray: function(array) { - if (!this._hasManyArrays) { this._hasManyArrays = Ember.A([]); } - - this._hasManyArrays.pushObject(array); - }, - - _reloadHasManys: function() { - if (!this._hasManyArrays) { return; } - var i, j; - for (i = 0; i < this._hasManyArrays.length; i++) { - var array = this._hasManyArrays[i], - hasManyContent = this._getHasManyContent(get(array, 'key'), get(array, 'modelClass'), get(array, 'embedded')); - for (j = 0; j < array.get('length'); j++) { - if (array.objectAt(j).get('isNew')) { - hasManyContent.addObject(array.objectAt(j)._reference); - } - } - set(array, 'content', hasManyContent); - } - }, - - _getHasManyContent: function(key, type, embedded) { - var content = get(this, '_data.' + key); - - if (content) { - var mapFunction, primaryKey, reference; - if (embedded) { - primaryKey = get(type, 'primaryKey'); - mapFunction = function(attrs) { - reference = type._getOrCreateReferenceForId(attrs[primaryKey]); - reference.data = attrs; - return reference; - }; - } else { - mapFunction = function(id) { return type._getOrCreateReferenceForId(id); }; - } - content = Ember.EnumerableUtils.map(content, mapFunction); - } - - return Ember.A(content || []); - } -}); - -Ember.Model.reopenClass({ - primaryKey: 'id', - - adapter: Ember.Adapter.create(), - - _clientIdCounter: 1, - - getAttributes: function() { - this.proto(); // force class "compilation" if it hasn't been done. - var attributes = this._attributes || []; - if (typeof this.superclass.getAttributes === 'function') { - attributes = this.superclass.getAttributes().concat(attributes); - } - return attributes; - }, - - getRelationships: function() { - this.proto(); // force class "compilation" if it hasn't been done. - var relationships = this._relationships || []; - if (typeof this.superclass.getRelationships === 'function') { - relationships = this.superclass.getRelationships().concat(relationships); - } - return relationships; - }, - - fetch: function(id) { - if (!arguments.length) { - return this._findFetchAll(true); - } else if (Ember.isArray(id)) { - return this._findFetchMany(id, true); - } else if (typeof id === 'object') { - return this._findFetchQuery(id, true); - } else { - return this._findFetchById(id, true); - } - }, - - find: function(id) { - if (!arguments.length) { - return this._findFetchAll(false); - } else if (Ember.isArray(id)) { - return this._findFetchMany(id, false); - } else if (typeof id === 'object') { - return this._findFetchQuery(id, false); - } else { - return this._findFetchById(id, false); - } - }, - - findQuery: function(params) { - return this._findFetchQuery(params, false); - }, - - fetchQuery: function(params) { - return this._findFetchQuery(params, true); - }, - - _findFetchQuery: function(params, isFetch) { - var records = Ember.RecordArray.create({modelClass: this, _query: params}); - - var promise = this.adapter.findQuery(this, records, params); - - return isFetch ? promise : records; - }, - - findMany: function(ids) { - return this._findFetchMany(ids, false); - }, - - fetchMany: function(ids) { - return this._findFetchMany(ids, true); - }, - - _findFetchMany: function(ids, isFetch) { - Ember.assert("findFetchMany requires an array", Ember.isArray(ids)); - - var records = Ember.RecordArray.create({_ids: ids, modelClass: this}), - deferred; - - if (!this.recordArrays) { this.recordArrays = []; } - this.recordArrays.push(records); - - if (this._currentBatchIds) { - concatUnique(this._currentBatchIds, ids); - this._currentBatchRecordArrays.push(records); - } else { - this._currentBatchIds = concatUnique([], ids); - this._currentBatchRecordArrays = [records]; - } - - if (isFetch) { - deferred = Ember.Deferred.create(); - Ember.set(deferred, 'resolveWith', records); - - if (!this._currentBatchDeferreds) { this._currentBatchDeferreds = []; } - this._currentBatchDeferreds.push(deferred); - } - - Ember.run.scheduleOnce('data', this, this._executeBatch); - - return isFetch ? deferred : records; - }, - - findAll: function() { - return this._findFetchAll(false); - }, - - fetchAll: function() { - return this._findFetchAll(true); - }, - - _findFetchAll: function(isFetch) { - var self = this; - - if (this._findAllRecordArray) { - if (isFetch) { - return new Ember.RSVP.Promise(function(resolve) { - resolve(self._findAllRecordArray); - }); - } else { - return this._findAllRecordArray; - } - } - - var records = this._findAllRecordArray = Ember.RecordArray.create({modelClass: this}); - - var promise = this.adapter.findAll(this, records); - - // Remove the cached record array if the promise is rejected - if (promise.then) { - promise.then(null, function() { - self._findAllRecordArray = null; - return Ember.RSVP.reject.apply(null, arguments); - }); - } - - return isFetch ? promise : records; - }, - - findById: function(id) { - return this._findFetchById(id, false); - }, - - fetchById: function(id) { - return this._findFetchById(id, true); - }, - - _findFetchById: function(id, isFetch) { - var record = this.cachedRecordForId(id), - isLoaded = get(record, 'isLoaded'), - adapter = get(this, 'adapter'), - deferredOrPromise; - - if (isLoaded) { - if (isFetch) { - return new Ember.RSVP.Promise(function(resolve, reject) { - resolve(record); - }); - } else { - return record; - } - } - - deferredOrPromise = this._fetchById(record, id); - - return isFetch ? deferredOrPromise : record; - }, - - _currentBatchIds: null, - _currentBatchRecordArrays: null, - _currentBatchDeferreds: null, - - reload: function(id) { - var record = this.cachedRecordForId(id); - record.set('isLoaded', false); - return this._fetchById(record, id); - }, - - _fetchById: function(record, id) { - var adapter = get(this, 'adapter'), - deferred; - - if (adapter.findMany && !adapter.findMany.isUnimplemented) { - if (this._currentBatchIds) { - if (!contains(this._currentBatchIds, id)) { this._currentBatchIds.push(id); } - } else { - this._currentBatchIds = [id]; - this._currentBatchRecordArrays = []; - } - - deferred = Ember.Deferred.create(); - - //Attached the record to the deferred so we can resolove it later. - Ember.set(deferred, 'resolveWith', record); - - if (!this._currentBatchDeferreds) { this._currentBatchDeferreds = []; } - this._currentBatchDeferreds.push(deferred); - - Ember.run.scheduleOnce('data', this, this._executeBatch); - - return deferred; - } else { - return adapter.find(record, id); - } - }, - - _executeBatch: function() { - var batchIds = this._currentBatchIds, - batchRecordArrays = this._currentBatchRecordArrays || [], - batchDeferreds = this._currentBatchDeferreds, - self = this, - requestIds = [], - promise, - i; - - this._currentBatchIds = null; - this._currentBatchRecordArrays = null; - this._currentBatchDeferreds = null; - - for (i = 0; i < batchIds.length; i++) { - if (!this.cachedRecordForId(batchIds[i]).get('isLoaded')) { - requestIds.push(batchIds[i]); - } - } - - if (batchIds.length === 1) { - promise = get(this, 'adapter').find(this.cachedRecordForId(batchIds[0]), batchIds[0]); - } else { - var recordArray = Ember.RecordArray.create({_ids: batchIds}); - if (requestIds.length === 0) { - promise = new Ember.RSVP.Promise(function(resolve, reject) { resolve(recordArray); }); - recordArray.notifyLoaded(); - } else { - promise = get(this, 'adapter').findMany(this, recordArray, requestIds); - } - } - - promise.then(function() { - for (var i = 0, l = batchRecordArrays.length; i < l; i++) { - batchRecordArrays[i].loadForFindMany(self); - } - - if (batchDeferreds) { - for (i = 0, l = batchDeferreds.length; i < l; i++) { - var resolveWith = Ember.get(batchDeferreds[i], 'resolveWith'); - batchDeferreds[i].resolve(resolveWith); - } - } - }).then(null, function(errorXHR) { - if (batchDeferreds) { - for (var i = 0, l = batchDeferreds.length; i < l; i++) { - batchDeferreds[i].reject(errorXHR); - } - } - }); - }, - - getCachedReferenceRecord: function(id){ - var ref = this._getReferenceById(id); - if(ref) return ref.record; - return undefined; - }, - - cachedRecordForId: function(id) { - var record = this.getCachedReferenceRecord(id); - - if (!record) { - var primaryKey = get(this, 'primaryKey'), - attrs = {isLoaded: false}; - attrs[primaryKey] = id; - record = this.create(attrs); - var sideloadedData = this.sideloadedData && this.sideloadedData[id]; - if (sideloadedData) { - record.load(id, sideloadedData); - } - } - - return record; - }, - - addToRecordArrays: function(record) { - if (this._findAllRecordArray && !this._findAllRecordArray.contains(record)) { - this._findAllRecordArray.pushObject(record); - } - if (this.recordArrays) { - this.recordArrays.forEach(function(recordArray) { - if (recordArray instanceof Ember.FilteredRecordArray) { - if(!recordArray.recordIsObserved(record)) { - recordArray.registerObserversOnRecord(record); - recordArray.updateFilterForRecord(record); - } - } else if(!recordArray.contains(record)) { - recordArray.pushObject(record); - } - }); - } - }, - - unload: function (record) { - this.removeFromRecordArrays(record); - var primaryKey = record.get(get(this, 'primaryKey')); - this.removeFromCache(primaryKey); - }, - - clearCache: function () { - this.sideloadedData = undefined; - this._referenceCache = undefined; - }, - - removeFromCache: function (key) { - if (this.sideloadedData && this.sideloadedData[key]) { - delete this.sideloadedData[key]; - } - if(this._referenceCache && this._referenceCache[key]) { - delete this._referenceCache[key]; - } - }, - - removeFromRecordArrays: function(record) { - if (this._findAllRecordArray) { - this._findAllRecordArray.removeObject(record); - } - if (this.recordArrays) { - this.recordArrays.forEach(function(recordArray) { - recordArray.removeObject(record); - }); - } - }, - - // FIXME - findFromCacheOrLoad: function(data) { - var record; - if (!data[get(this, 'primaryKey')]) { - record = this.create({isLoaded: false}); - } else { - record = this.cachedRecordForId(data[get(this, 'primaryKey')]); - } - // set(record, 'data', data); - record.load(data[get(this, 'primaryKey')], data); - return record; - }, - - registerRecordArray: function(recordArray) { - if (!this.recordArrays) { this.recordArrays = []; } - this.recordArrays.push(recordArray); - }, - - unregisterRecordArray: function(recordArray) { - if (!this.recordArrays) { return; } - Ember.A(this.recordArrays).removeObject(recordArray); - }, - - forEachCachedRecord: function(callback) { - if (!this._referenceCache) { this._referenceCache = {}; } - var ids = Object.keys(this._referenceCache); - ids.map(function(id) { - return this._getReferenceById(id).record; - }, this).forEach(callback); - }, - - load: function(hashes) { - if (Ember.typeOf(hashes) !== 'array') { hashes = [hashes]; } - - if (!this.sideloadedData) { this.sideloadedData = {}; } - - for (var i = 0, l = hashes.length; i < l; i++) { - var hash = hashes[i], - primaryKey = hash[get(this, 'primaryKey')], - record = this.getCachedReferenceRecord(primaryKey); - - if (record) { - record.load(primaryKey, hash); - } else { - this.sideloadedData[primaryKey] = hash; - } - } - }, - - _getReferenceById: function(id) { - if (!this._referenceCache) { this._referenceCache = {}; } - return this._referenceCache[id]; - }, - - _getOrCreateReferenceForId: function(id) { - var reference = this._getReferenceById(id); - - if (!reference) { - reference = this._createReference(id); - } - - return reference; - }, - - _createReference: function(id) { - if (!this._referenceCache) { this._referenceCache = {}; } - - Ember.assert('The id ' + id + ' has alread been used with another record of type ' + this.toString() + '.', !id || !this._referenceCache[id]); - - var reference = { - id: id, - clientId: this._clientIdCounter++ - }; - - this._cacheReference(reference); - - return reference; - }, - - _cacheReference: function(reference) { - // if we're creating an item, this process will be done - // later, once the object has been persisted. - if (reference.id) { - this._referenceCache[reference.id] = reference; - } - } -}); - - -})(); - -(function() { - -var get = Ember.get; - -Ember.hasMany = function(type, options) { - options = options || {}; - - var meta = { type: type, isRelationship: true, options: options, kind: 'hasMany' }, - key = options.key; - - return Ember.computed(function() { - if (typeof type === "string") { - type = Ember.get(Ember.lookup, type); - } - - return this.getHasMany(key, type, meta); - }).property().meta(meta); -}; - -Ember.Model.reopen({ - getHasMany: function(key, type, meta) { - var embedded = meta.options.embedded, - collectionClass = embedded ? Ember.EmbeddedHasManyArray : Ember.HasManyArray; - - var collection = collectionClass.create({ - parent: this, - modelClass: type, - content: this._getHasManyContent(key, type, embedded), - embedded: embedded, - key: key, - relationshipKey: meta.relationshipKey - }); - - this._registerHasManyArray(collection); - - return collection; - } -}); - - -})(); - -(function() { - -var get = Ember.get, - set = Ember.set; - -function getType() { - if (typeof this.type === "string") { - this.type = Ember.get(Ember.lookup, this.type); - } - return this.type; -} - -Ember.belongsTo = function(type, options) { - options = options || {}; - - var meta = { type: type, isRelationship: true, options: options, kind: 'belongsTo', getType: getType }, - relationshipKey = options.key; - - return Ember.computed(function(key, value, oldValue) { - type = meta.getType(); - - var dirtyAttributes = get(this, '_dirtyAttributes'), - createdDirtyAttributes = false; - - if (!dirtyAttributes) { - dirtyAttributes = []; - createdDirtyAttributes = true; - } - - if (arguments.length > 1) { - if (value) { - Ember.assert(Ember.String.fmt('Attempted to set property of type: %@ with a value of type: %@', - [value.constructor, type]), - value instanceof type); - - if (oldValue !== value) { - dirtyAttributes.pushObject(key); - } else { - dirtyAttributes.removeObject(key); - } - - if (createdDirtyAttributes) { - set(this, '_dirtyAttributes', dirtyAttributes); - } - } - return value === undefined ? null : value; - } else { - return this.getBelongsTo(relationshipKey, type, meta); - } - }).property('_data').meta(meta); -}; - -Ember.Model.reopen({ - getBelongsTo: function(key, type, meta) { - var idOrAttrs = get(this, '_data.' + key), - record; - - if (Ember.isNone(idOrAttrs)) { - return null; - } - - if (meta.options.embedded) { - var primaryKey = get(type, 'primaryKey'), - id = idOrAttrs[primaryKey]; - record = type.create({ isLoaded: false, id: id }); - record.load(id, idOrAttrs); - } else { - record = type.find(idOrAttrs); - } - - return record; - } -}); - - -})(); - -(function() { - -var get = Ember.get, - set = Ember.set, - meta = Ember.meta; - -Ember.Model.dataTypes = {}; - -Ember.Model.dataTypes[Date] = { - deserialize: function(string) { - if (!string) { return null; } - return new Date(string); - }, - serialize: function (date) { - if (!date) { return null; } - return date.toISOString(); - }, - isEqual: function(obj1, obj2) { - if (obj1 instanceof Date) { obj1 = this.serialize(obj1); } - if (obj2 instanceof Date) { obj2 = this.serialize(obj2); } - return obj1 === obj2; - } -}; - -Ember.Model.dataTypes[Number] = { - deserialize: function(string) { - if (!string && string !== 0) { return null; } - return Number(string); - }, - serialize: function (number) { - if (!number && number !== 0) { return null; } - return Number(number); - } -}; - -function deserialize(value, type) { - if (type && type.deserialize) { - return type.deserialize(value); - } else if (type && Ember.Model.dataTypes[type]) { - return Ember.Model.dataTypes[type].deserialize(value); - } else { - return value; - } -} - -function serialize(value, type) { - if (type && type.serialize) { - return type.serialize(value); - } else if (type && Ember.Model.dataTypes[type]) { - return Ember.Model.dataTypes[type].serialize(value); - } else { - return value; - } -} - -Ember.attr = function(type, options) { - return Ember.computed(function(key, value) { - var data = get(this, '_data'), - dataKey = this.dataKey(key), - dataValue = data && get(data, dataKey), - beingCreated = meta(this).proto === this, - dirtyAttributes = get(this, '_dirtyAttributes'), - createdDirtyAttributes = false; - - if (!dirtyAttributes) { - dirtyAttributes = []; - createdDirtyAttributes = true; - } - - if (arguments.length === 2) { - if (beingCreated) { - if (!data) { - data = {}; - set(this, '_data', data); - } - dataValue = data[dataKey] = value; - } - - if (dataValue !== serialize(value, type)) { - dirtyAttributes.pushObject(key); - } else { - dirtyAttributes.removeObject(key); - } - - if (createdDirtyAttributes) { - set(this, '_dirtyAttributes', dirtyAttributes); - } - - return value; - } - - return this.getAttr(key, deserialize(dataValue, type)); - }).property('_data').meta({isAttribute: true, type: type, options: options}); -}; - - -})(); - -(function() { - -var get = Ember.get; - -Ember.RESTAdapter = Ember.Adapter.extend({ - find: function(record, id) { - var url = this.buildURL(record.constructor, id), - self = this; - - return this.ajax(url).then(function(data) { - self.didFind(record, id, data); - return record; - }); - }, - - didFind: function(record, id, data) { - var rootKey = get(record.constructor, 'rootKey'), - dataToLoad = rootKey ? data[rootKey] : data; - - record.load(id, dataToLoad); - }, - - findAll: function(klass, records) { - var url = this.buildURL(klass), - self = this; - - return this.ajax(url).then(function(data) { - self.didFindAll(klass, records, data); - return records; - }); - }, - - didFindAll: function(klass, records, data) { - var collectionKey = get(klass, 'collectionKey'), - dataToLoad = collectionKey ? data[collectionKey] : data; - - records.load(klass, dataToLoad); - }, - - findQuery: function(klass, records, params) { - var url = this.buildURL(klass), - self = this; - - return this.ajax(url, params).then(function(data) { - self.didFindQuery(klass, records, params, data); - return records; - }); - }, - - didFindQuery: function(klass, records, params, data) { - var collectionKey = get(klass, 'collectionKey'), - dataToLoad = collectionKey ? data[collectionKey] : data; - - records.load(klass, dataToLoad); - }, - - createRecord: function(record) { - var url = this.buildURL(record.constructor), - self = this; - - return this.ajax(url, record.toJSON(), "POST").then(function(data) { - self.didCreateRecord(record, data); - return record; - }); - }, - - didCreateRecord: function(record, data) { - var rootKey = get(record.constructor, 'rootKey'), - primaryKey = get(record.constructor, 'primaryKey'), - dataToLoad = rootKey ? data[rootKey] : data; - record.load(dataToLoad[primaryKey], dataToLoad); - record.didCreateRecord(); - }, - - saveRecord: function(record) { - var primaryKey = get(record.constructor, 'primaryKey'), - url = this.buildURL(record.constructor, get(record, primaryKey)), - self = this; - - return this.ajax(url, record.toJSON(), "PUT").then(function(data) { // TODO: Some APIs may or may not return data - self.didSaveRecord(record, data); - return record; - }); - }, - - didSaveRecord: function(record, data) { - record.didSaveRecord(); - }, - - deleteRecord: function(record) { - var primaryKey = get(record.constructor, 'primaryKey'), - url = this.buildURL(record.constructor, get(record, primaryKey)), - self = this; - - return this.ajax(url, record.toJSON(), "DELETE").then(function(data) { // TODO: Some APIs may or may not return data - self.didDeleteRecord(record, data); - }); - }, - - didDeleteRecord: function(record, data) { - record.didDeleteRecord(); - }, - - ajax: function(url, params, method, settings) { - return this._ajax(url, params, (method || "GET"), settings); - }, - - buildURL: function(klass, id) { - var urlRoot = get(klass, 'url'); - if (!urlRoot) { throw new Error('Ember.RESTAdapter requires a `url` property to be specified'); } - - if (!Ember.isEmpty(id)) { - return urlRoot + "/" + id + ".json"; - } else { - return urlRoot + ".json"; - } - }, - - ajaxSettings: function(url, method) { - return { - url: url, - type: method, - dataType: "json" - }; - }, - - _ajax: function(url, params, method, settings) { - if (!settings) { - settings = this.ajaxSettings(url, method); - } - - return new Ember.RSVP.Promise(function(resolve, reject) { - if (params) { - if (method === "GET") { - settings.data = params; - } else { - settings.contentType = "application/json; charset=utf-8"; - settings.data = JSON.stringify(params); - } - } - - settings.success = function(json) { - Ember.run(null, resolve, json); - }; - - settings.error = function(jqXHR, textStatus, errorThrown) { - // https://github.com/ebryn/ember-model/issues/202 - if (jqXHR) { - jqXHR.then = null; - } - - Ember.run(null, reject, jqXHR); - }; - - - Ember.$.ajax(settings); - }); - } -}); - - -})(); - -(function() { - -var get = Ember.get; - -Ember.LoadPromise = Ember.Object.extend(Ember.DeferredMixin, { - init: function() { - this._super.apply(this, arguments); - - var target = get(this, 'target'); - - if (get(target, 'isLoaded') && !get(target, 'isNew')) { - this.resolve(target); - } else { - target.one('didLoad', this, function() { - this.resolve(target); - }); - } - } -}); - -Ember.loadPromise = function(target) { - if (Ember.isNone(target)) { - return null; - } else if (target.then) { - return target; - } else { - return Ember.LoadPromise.create({target: target}); - } -}; - - -})(); - -(function() { - -// This is a debug adapter for the Ember Extension, don't let the fact this is called an "adapter" confuse you. -// Most copied from: https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/debug/debug_adapter.js - -if (!Ember.DataAdapter) { return; } - -var get = Ember.get, capitalize = Ember.String.capitalize, underscore = Ember.String.underscore; - -var DebugAdapter = Ember.DataAdapter.extend({ - getFilters: function() { - return [ - { name: 'isNew', desc: 'New' }, - { name: 'isModified', desc: 'Modified' }, - { name: 'isClean', desc: 'Clean' } - ]; - }, - - detect: function(klass) { - return klass !== Ember.Model && Ember.Model.detect(klass); - }, - - columnsForType: function(type) { - var columns = [], count = 0, self = this; - Ember.A(get(type.proto(), 'attributes')).forEach(function(name, meta) { - if (count++ > self.attributeLimit) { return false; } - var desc = capitalize(underscore(name).replace('_', ' ')); - columns.push({ name: name, desc: desc }); - }); - return columns; - }, - - getRecords: function(type) { - var records = []; - type.forEachCachedRecord(function(record) { records.push(record); }); - return records; - }, - - getRecordColumnValues: function(record) { - var self = this, count = 0, - columnValues = { id: get(record, 'id') }; - - record.get('attributes').forEach(function(key) { - if (count++ > self.attributeLimit) { - return false; - } - var value = get(record, key); - columnValues[key] = value; - }); - return columnValues; - }, - - getRecordKeywords: function(record) { - var keywords = [], keys = Ember.A(['id']); - record.get('attributes').forEach(function(key) { - keys.push(key); - }); - keys.forEach(function(key) { - keywords.push(get(record, key)); - }); - return keywords; - }, - - getRecordFilterValues: function(record) { - return { - isNew: record.get('isNew'), - isModified: record.get('isDirty') && !record.get('isNew'), - isClean: !record.get('isDirty') - }; - }, - - getRecordColor: function(record) { - var color = 'black'; - if (record.get('isNew')) { - color = 'green'; - } else if (record.get('isDirty')) { - color = 'blue'; - } - return color; - }, - - observeRecord: function(record, recordUpdated) { - var releaseMethods = Ember.A(), self = this, - keysToObserve = Ember.A(['id', 'isNew', 'isDirty']); - - record.get('attributes').forEach(function(key) { - keysToObserve.push(key); - }); - - keysToObserve.forEach(function(key) { - var handler = function() { - recordUpdated(self.wrapRecord(record)); - }; - Ember.addObserver(record, key, handler); - releaseMethods.push(function() { - Ember.removeObserver(record, key, handler); - }); - }); - - var release = function() { - releaseMethods.forEach(function(fn) { fn(); } ); - }; - - return release; - } -}); - -Ember.onLoad('Ember.Application', function(Application) { - Application.initializer({ - name: "dataAdapter", - - initialize: function(container, application) { - application.register('dataAdapter:main', DebugAdapter); - } - }); -}); - -})(); From df605a8600698b68fe583f3b533475a27d809f9a Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 09:48:12 +0100 Subject: [PATCH 133/313] Pusher is not needed in services initializer --- assets/scripts/app/initializers/services.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/scripts/app/initializers/services.coffee b/assets/scripts/app/initializers/services.coffee index 64cf2f2a..a4d7369e 100644 --- a/assets/scripts/app/initializers/services.coffee +++ b/assets/scripts/app/initializers/services.coffee @@ -1,6 +1,5 @@ config = ENV.config Slider = Travis.Slider -Pusher = Travis.Pusher Tailing = Travis.Tailing ToTop = Travis.ToTop From 2e644d04151019ac7d5a58a7de01c9540807428f Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 09:48:37 +0100 Subject: [PATCH 134/313] Rename Travis.Route's file to basic That way it will be picked up by Ember.js as a default route in ember-cli --- assets/scripts/app/routes/{route.coffee => basic.coffee} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename assets/scripts/app/routes/{route.coffee => basic.coffee} (100%) diff --git a/assets/scripts/app/routes/route.coffee b/assets/scripts/app/routes/basic.coffee similarity index 100% rename from assets/scripts/app/routes/route.coffee rename to assets/scripts/app/routes/basic.coffee From 1a6c09e62400d495c2a0ed94f801e83740323322 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 10:17:29 +0100 Subject: [PATCH 135/313] Don't inject pusher instance if it wasn't created --- assets/scripts/app/initializers/pusher.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/scripts/app/initializers/pusher.coffee b/assets/scripts/app/initializers/pusher.coffee index bb32bc27..2a8808d2 100644 --- a/assets/scripts/app/initializers/pusher.coffee +++ b/assets/scripts/app/initializers/pusher.coffee @@ -7,11 +7,11 @@ initialize = (container, application) -> if config.pusher.key application.pusher = new Pusher(config.pusher) - application.register 'pusher:main', application.pusher, { instantiate: false } + application.register 'pusher:main', application.pusher, { instantiate: false } - application.inject('route', 'pusher', 'pusher:main') + application.inject('route', 'pusher', 'pusher:main') - application.pusher.store = container.lookup('store:main') + application.pusher.store = container.lookup('store:main') PusherInitializer = From 64323fe4d9a080389ffd44a2223272cbd5c6f65d Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 10:17:50 +0100 Subject: [PATCH 136/313] Travis.ajax ember-cli compat --- assets/scripts/app/utils/ajax.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/scripts/app/utils/ajax.coffee b/assets/scripts/app/utils/ajax.coffee index ddd97c7b..90328963 100644 --- a/assets/scripts/app/utils/ajax.coffee +++ b/assets/scripts/app/utils/ajax.coffee @@ -6,7 +6,7 @@ default_options = accepts: json: 'application/json; version=2' -Travis.ajax = Em.Object.create +ajax = Em.Object.create publicEndpoints: [/\/repos\/?.*/, /\/builds\/?.*/, /\/jobs\/?.*/] privateEndpoints: [/\/repos\/\d+\/caches/] @@ -150,3 +150,5 @@ Travis.ajax = Em.Object.create xhr.send(data) return promise + +Travis.ajax = ajax From cd1d4a80ce3e3937d67c3d62d867fb5e0bd370b4 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 10:25:53 +0100 Subject: [PATCH 137/313] Fix Slider, ToTop and Tailing for ember-cli --- assets/scripts/app/utils/slider.coffee | 2 +- assets/scripts/app/utils/tailing.coffee | 37 ++----------------------- assets/scripts/app/utils/to-top.coffee | 34 +++++++++++++++++++++++ 3 files changed, 38 insertions(+), 35 deletions(-) create mode 100644 assets/scripts/app/utils/to-top.coffee diff --git a/assets/scripts/app/utils/slider.coffee b/assets/scripts/app/utils/slider.coffee index 46b789f0..6db9eb2c 100644 --- a/assets/scripts/app/utils/slider.coffee +++ b/assets/scripts/app/utils/slider.coffee @@ -17,6 +17,6 @@ Slider.prototype.toggle = -> # TODO gotta force redraws here :/ element = $('') $('#top .profile').append(element) - Em.run.later (-> element.remove()), 10 + Ember.run.later (-> element.remove()), 10 Travis.Slider = Slider diff --git a/assets/scripts/app/utils/tailing.coffee b/assets/scripts/app/utils/tailing.coffee index 39f10452..6162b169 100644 --- a/assets/scripts/app/utils/tailing.coffee +++ b/assets/scripts/app/utils/tailing.coffee @@ -1,37 +1,4 @@ -class Travis.ToTop - # NOTE: I could have probably extract fixed positioning from - # Tailing, but then I would need to parametrize positionElement - # function to make it flexible to handle both cases. In that - # situation I prefer a bit less DRY code over simplicity of - # the calculations. - constructor: (@window, @element_selector, @container_selector) -> - @position = @window.scrollTop() - @window.scroll( $.throttle( 200, @onScroll.bind(this) ) ) - this - - element: -> - $(@element_selector) - container: -> - $(@container_selector) - - onScroll: -> - @positionElement() - - positionElement: -> - element = @element() - container = @container() - return if element.length is 0 - containerHeight = container.outerHeight() - windowHeight = @window.height() - offset = container.offset().top + containerHeight - (@window.scrollTop() + windowHeight) - max = containerHeight - windowHeight - offset = max if offset > max - if offset > 0 - element.css(bottom: offset + 4) - else - element.css(bottom: 2) - -class @Travis.Tailing +class Tailing options: timeout: 200 @@ -93,3 +60,5 @@ class @Travis.Tailing tail.css(top: offset - 2) else tail.css(top: 0) + +Travis.Tailing = Tailing diff --git a/assets/scripts/app/utils/to-top.coffee b/assets/scripts/app/utils/to-top.coffee new file mode 100644 index 00000000..57f9fdf1 --- /dev/null +++ b/assets/scripts/app/utils/to-top.coffee @@ -0,0 +1,34 @@ +class ToTop + # NOTE: I could have probably extract fixed positioning from + # Tailing, but then I would need to parametrize positionElement + # function to make it flexible to handle both cases. In that + # situation I prefer a bit less DRY code over simplicity of + # the calculations. + constructor: (@window, @element_selector, @container_selector) -> + @position = @window.scrollTop() + @window.scroll( $.throttle( 200, @onScroll.bind(this) ) ) + this + + element: -> + $(@element_selector) + container: -> + $(@container_selector) + + onScroll: -> + @positionElement() + + positionElement: -> + element = @element() + container = @container() + return if element.length is 0 + containerHeight = container.outerHeight() + windowHeight = @window.height() + offset = container.offset().top + containerHeight - (@window.scrollTop() + windowHeight) + max = containerHeight - windowHeight + offset = max if offset > max + if offset > 0 + element.css(bottom: offset + 4) + else + element.css(bottom: 2) + +Travis.ToTop = ToTop From c8211520f25f3526d8c1cd57c286771742b120f7 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 10:31:15 +0100 Subject: [PATCH 138/313] Use Ember.run.throttle instead of $.throttle --- assets/scripts/app/utils/tailing.coffee | 2 +- assets/scripts/app/utils/to-top.coffee | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/scripts/app/utils/tailing.coffee b/assets/scripts/app/utils/tailing.coffee index 6162b169..31b88285 100644 --- a/assets/scripts/app/utils/tailing.coffee +++ b/assets/scripts/app/utils/tailing.coffee @@ -9,7 +9,7 @@ class Tailing constructor: (@window, @tail_selector, @log_selector) -> @position = @window.scrollTop() - @window.scroll( $.throttle( 200, @onScroll.bind(this) ) ) + @window.scroll( Ember.run.throttle(this, @onScroll, [], 200, false) ) this run: -> diff --git a/assets/scripts/app/utils/to-top.coffee b/assets/scripts/app/utils/to-top.coffee index 57f9fdf1..ae6b17e3 100644 --- a/assets/scripts/app/utils/to-top.coffee +++ b/assets/scripts/app/utils/to-top.coffee @@ -6,7 +6,7 @@ class ToTop # the calculations. constructor: (@window, @element_selector, @container_selector) -> @position = @window.scrollTop() - @window.scroll( $.throttle( 200, @onScroll.bind(this) ) ) + @window.scroll( Ember.run.throttle(this, @onScroll, [], 200, false) ) this element: -> From 98892425bbc680b8cdba152a4890f220623caa45 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 10:45:00 +0100 Subject: [PATCH 139/313] Use ENV.config instead of injected config --- assets/scripts/app/routes/main.coffee | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/assets/scripts/app/routes/main.coffee b/assets/scripts/app/routes/main.coffee index 180b7fe6..6471a86a 100644 --- a/assets/scripts/app/routes/main.coffee +++ b/assets/scripts/app/routes/main.coffee @@ -1,6 +1,7 @@ require 'routes/route' TravisRoute = Travis.Route +config = ENV.config Route = TravisRoute.extend renderTemplate: -> @@ -17,7 +18,7 @@ Route = TravisRoute.extend activate: -> # subscribe to pusher only if we're at a main route - if @config.pusher.channels - @get('pusher').subscribeAll(@config.pusher.channels) + if config.pusher.channels + @get('pusher').subscribeAll(config.pusher.channels) Travis.MainRoute = Route From 17df511c6a32f7480e745ee0e3e8b212e1b203fd Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 10:45:17 +0100 Subject: [PATCH 140/313] Rename computedLimit to limit in limited-array --- assets/scripts/app/utils/limited-array.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/scripts/app/utils/limited-array.coffee b/assets/scripts/app/utils/limited-array.coffee index 1228e1df..08d9b41d 100644 --- a/assets/scripts/app/utils/limited-array.coffee +++ b/assets/scripts/app/utils/limited-array.coffee @@ -1,9 +1,9 @@ -computedLimit = Ember.computed.limit +limit = Ember.computed.limit LimitedArray = Ember.ArrayProxy.extend limit: 10 isLoadedBinding: 'content.isLoaded' - arrangedContent: computedLimit('content', 'limit') + arrangedContent: limit('content', 'limit') totalLength: (-> @get('content.length') From f47b893cb883d225dce1abfd8be93da3f4aceb7e Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 11:46:35 +0100 Subject: [PATCH 141/313] Rename Travis.Route to Travis.BasicRoute and Travis.View to Travis.BasicView --- assets/scripts/app/routes/abstract-builds.coffee | 4 ++-- assets/scripts/app/routes/account.coffee | 4 ++-- assets/scripts/app/routes/accounts.coffee | 4 ++-- assets/scripts/app/routes/accounts/index.coffee | 4 ++-- assets/scripts/app/routes/accounts/info.coffee | 4 ++-- assets/scripts/app/routes/application.coffee | 4 ++-- assets/scripts/app/routes/auth.coffee | 4 ++-- assets/scripts/app/routes/basic.coffee | 2 +- assets/scripts/app/routes/branches.coffee | 2 +- assets/scripts/app/routes/build.coffee | 4 ++-- assets/scripts/app/routes/builds.coffee | 2 +- assets/scripts/app/routes/caches.coffee | 4 ++-- assets/scripts/app/routes/dashboard.coffee | 4 ++-- assets/scripts/app/routes/dashboard/repositories.coffee | 4 ++-- assets/scripts/app/routes/env-vars.coffee | 4 ++-- assets/scripts/app/routes/first-sync.coffee | 2 +- assets/scripts/app/routes/getting-started.coffee | 4 ++-- .../app/routes/insufficient-oauth-permissions.coffee | 2 +- assets/scripts/app/routes/job.coffee | 4 ++-- assets/scripts/app/routes/main-tab.coffee | 4 ++-- assets/scripts/app/routes/main.coffee | 4 ++-- assets/scripts/app/routes/main/index.coffee | 4 ++-- assets/scripts/app/routes/main/my-repositories.coffee | 4 ++-- assets/scripts/app/routes/main/recent.coffee | 2 +- assets/scripts/app/routes/main/repositories.coffee | 2 +- assets/scripts/app/routes/main/search.coffee | 2 +- assets/scripts/app/routes/not-found.coffee | 4 ++-- assets/scripts/app/routes/profile.coffee | 4 ++-- assets/scripts/app/routes/pull-requests.coffee | 2 +- assets/scripts/app/routes/repo.coffee | 4 ++-- assets/scripts/app/routes/repo/index.coffee | 4 ++-- assets/scripts/app/routes/request.coffee | 4 ++-- assets/scripts/app/routes/requests.coffee | 4 ++-- assets/scripts/app/routes/settings.coffee | 4 ++-- assets/scripts/app/routes/settings/index.coffee | 4 ++-- assets/scripts/app/routes/simple-layout.coffee | 4 ++-- assets/scripts/app/routes/ssh-key.coffee | 4 ++-- assets/scripts/app/views/accounts.coffee | 4 ++-- assets/scripts/app/views/annotation.coffee | 2 +- assets/scripts/app/views/annotations.coffee | 2 +- assets/scripts/app/views/application.coffee | 2 +- assets/scripts/app/views/application/loading.coffee | 4 ++-- assets/scripts/app/views/{view.coffee => basic.coffee} | 6 +++--- assets/scripts/app/views/build.coffee | 2 +- assets/scripts/app/views/dashboard.coffee | 4 ++-- assets/scripts/app/views/first-sync.coffee | 2 +- assets/scripts/app/views/flash.coffee | 4 ++-- .../app/views/insufficient-oauth-permissions.coffee | 2 +- assets/scripts/app/views/jobs-item.coffee | 2 +- assets/scripts/app/views/left.coffee | 2 +- assets/scripts/app/views/log.coffee | 2 +- assets/scripts/app/views/main.coffee | 2 +- assets/scripts/app/views/profile.coffee | 8 ++++---- assets/scripts/app/views/repo-actions.coffee | 2 +- assets/scripts/app/views/repo-show-tabs.coffee | 2 +- assets/scripts/app/views/repo-show-tools.coffee | 2 +- assets/scripts/app/views/repo.coffee | 6 +++--- assets/scripts/app/views/repos-list-tabs.coffee | 2 +- assets/scripts/app/views/repos-list.coffee | 2 +- assets/scripts/app/views/signin.coffee | 2 +- assets/scripts/app/views/stats.coffee | 2 +- assets/scripts/app/views/top.coffee | 2 +- assets/scripts/travis.coffee | 5 +++-- 63 files changed, 104 insertions(+), 103 deletions(-) rename assets/scripts/app/views/{view.coffee => basic.coffee} (77%) diff --git a/assets/scripts/app/routes/abstract-builds.coffee b/assets/scripts/app/routes/abstract-builds.coffee index 8be8dcc2..a6e289d9 100644 --- a/assets/scripts/app/routes/abstract-builds.coffee +++ b/assets/scripts/app/routes/abstract-builds.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend renderTemplate: -> diff --git a/assets/scripts/app/routes/account.coffee b/assets/scripts/app/routes/account.coffee index 6d57970a..bd0ea80d 100644 --- a/assets/scripts/app/routes/account.coffee +++ b/assets/scripts/app/routes/account.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend setupController: (controller, account) -> diff --git a/assets/scripts/app/routes/accounts.coffee b/assets/scripts/app/routes/accounts.coffee index 55f24d7a..7a24adcb 100644 --- a/assets/scripts/app/routes/accounts.coffee +++ b/assets/scripts/app/routes/accounts.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend model: -> diff --git a/assets/scripts/app/routes/accounts/index.coffee b/assets/scripts/app/routes/accounts/index.coffee index 2cff27a1..18da917d 100644 --- a/assets/scripts/app/routes/accounts/index.coffee +++ b/assets/scripts/app/routes/accounts/index.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend redirect: -> diff --git a/assets/scripts/app/routes/accounts/info.coffee b/assets/scripts/app/routes/accounts/info.coffee index 5ae60a67..f10ab33e 100644 --- a/assets/scripts/app/routes/accounts/info.coffee +++ b/assets/scripts/app/routes/accounts/info.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend setupController: -> diff --git a/assets/scripts/app/routes/application.coffee b/assets/scripts/app/routes/application.coffee index 6674e6f5..d594f846 100644 --- a/assets/scripts/app/routes/application.coffee +++ b/assets/scripts/app/routes/application.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend needsAuth: false diff --git a/assets/scripts/app/routes/auth.coffee b/assets/scripts/app/routes/auth.coffee index c3193a6f..3d231243 100644 --- a/assets/scripts/app/routes/auth.coffee +++ b/assets/scripts/app/routes/auth.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend needsAuth: false diff --git a/assets/scripts/app/routes/basic.coffee b/assets/scripts/app/routes/basic.coffee index c67da07f..318896f2 100644 --- a/assets/scripts/app/routes/basic.coffee +++ b/assets/scripts/app/routes/basic.coffee @@ -18,4 +18,4 @@ Route = Ember.Route.extend config.pro ).property() -Travis.Route = Route +Travis.BasicRoute = Route diff --git a/assets/scripts/app/routes/branches.coffee b/assets/scripts/app/routes/branches.coffee index b7059dbb..9fbb2915 100644 --- a/assets/scripts/app/routes/branches.coffee +++ b/assets/scripts/app/routes/branches.coffee @@ -1,4 +1,4 @@ -require 'routes/route' +require 'routes/basic' AbstractBuildsRoute = Travis.AbstractBuildsRoute diff --git a/assets/scripts/app/routes/build.coffee b/assets/scripts/app/routes/build.coffee index b709676b..d428b47d 100644 --- a/assets/scripts/app/routes/build.coffee +++ b/assets/scripts/app/routes/build.coffee @@ -1,7 +1,7 @@ -require 'routes/route' +require 'routes/basic' require 'models/build' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend serialize: (model, params) -> diff --git a/assets/scripts/app/routes/builds.coffee b/assets/scripts/app/routes/builds.coffee index 140145b6..ec159cb9 100644 --- a/assets/scripts/app/routes/builds.coffee +++ b/assets/scripts/app/routes/builds.coffee @@ -1,4 +1,4 @@ -require 'routes/route' +require 'routes/basic' AbstractBuildsRoute = Travis.AbstractBuildsRoute diff --git a/assets/scripts/app/routes/caches.coffee b/assets/scripts/app/routes/caches.coffee index 1f4c3ddc..5337baa2 100644 --- a/assets/scripts/app/routes/caches.coffee +++ b/assets/scripts/app/routes/caches.coffee @@ -1,10 +1,10 @@ -require 'routes/route' +require 'routes/basic' require 'models/request' require 'utils/ajax' Request = Travis.Request Ajax = Travis.ajax -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend needsAuth: true diff --git a/assets/scripts/app/routes/dashboard.coffee b/assets/scripts/app/routes/dashboard.coffee index 8190e2c9..6df3ccce 100644 --- a/assets/scripts/app/routes/dashboard.coffee +++ b/assets/scripts/app/routes/dashboard.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend needsAuth: true diff --git a/assets/scripts/app/routes/dashboard/repositories.coffee b/assets/scripts/app/routes/dashboard/repositories.coffee index 20732f44..5ae0d3a5 100644 --- a/assets/scripts/app/routes/dashboard/repositories.coffee +++ b/assets/scripts/app/routes/dashboard/repositories.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend queryParams: diff --git a/assets/scripts/app/routes/env-vars.coffee b/assets/scripts/app/routes/env-vars.coffee index 9f49908b..5bf782f3 100644 --- a/assets/scripts/app/routes/env-vars.coffee +++ b/assets/scripts/app/routes/env-vars.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend model: (params) -> diff --git a/assets/scripts/app/routes/first-sync.coffee b/assets/scripts/app/routes/first-sync.coffee index 88327de2..0ce66725 100644 --- a/assets/scripts/app/routes/first-sync.coffee +++ b/assets/scripts/app/routes/first-sync.coffee @@ -1,4 +1,4 @@ -require 'routes/route' +require 'routes/basic' require 'routes/simple-layout' require 'models/repo' diff --git a/assets/scripts/app/routes/getting-started.coffee b/assets/scripts/app/routes/getting-started.coffee index 49022ca8..8037b668 100644 --- a/assets/scripts/app/routes/getting-started.coffee +++ b/assets/scripts/app/routes/getting-started.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend() diff --git a/assets/scripts/app/routes/insufficient-oauth-permissions.coffee b/assets/scripts/app/routes/insufficient-oauth-permissions.coffee index a1338f23..d509cc0d 100644 --- a/assets/scripts/app/routes/insufficient-oauth-permissions.coffee +++ b/assets/scripts/app/routes/insufficient-oauth-permissions.coffee @@ -1,4 +1,4 @@ -require 'routes/route' +require 'routes/basic' require 'routes/simple-layout' SimpleLayoutRoute = Travis.SimpleLayoutRoute diff --git a/assets/scripts/app/routes/job.coffee b/assets/scripts/app/routes/job.coffee index d76975d0..9edceed0 100644 --- a/assets/scripts/app/routes/job.coffee +++ b/assets/scripts/app/routes/job.coffee @@ -1,7 +1,7 @@ -require 'routes/route' +require 'routes/basic' require 'models/job' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend serialize: (model, params) -> diff --git a/assets/scripts/app/routes/main-tab.coffee b/assets/scripts/app/routes/main-tab.coffee index 28c4872f..9f2c0d2a 100644 --- a/assets/scripts/app/routes/main-tab.coffee +++ b/assets/scripts/app/routes/main-tab.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend renderTemplate: -> diff --git a/assets/scripts/app/routes/main.coffee b/assets/scripts/app/routes/main.coffee index 6471a86a..c61d7956 100644 --- a/assets/scripts/app/routes/main.coffee +++ b/assets/scripts/app/routes/main.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute config = ENV.config Route = TravisRoute.extend diff --git a/assets/scripts/app/routes/main/index.coffee b/assets/scripts/app/routes/main/index.coffee index d1cc2ced..0b5e69ba 100644 --- a/assets/scripts/app/routes/main/index.coffee +++ b/assets/scripts/app/routes/main/index.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend redirect: -> diff --git a/assets/scripts/app/routes/main/my-repositories.coffee b/assets/scripts/app/routes/main/my-repositories.coffee index 29250a73..8f5b4ac3 100644 --- a/assets/scripts/app/routes/main/my-repositories.coffee +++ b/assets/scripts/app/routes/main/my-repositories.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend redirect: -> diff --git a/assets/scripts/app/routes/main/recent.coffee b/assets/scripts/app/routes/main/recent.coffee index 3a8fe7f6..b14fc8d1 100644 --- a/assets/scripts/app/routes/main/recent.coffee +++ b/assets/scripts/app/routes/main/recent.coffee @@ -1,4 +1,4 @@ -require 'routes/route' +require 'routes/basic' require 'routes/main-tab' MainTabRoute = Travis.MainTabRoute diff --git a/assets/scripts/app/routes/main/repositories.coffee b/assets/scripts/app/routes/main/repositories.coffee index 20d90a3f..5546f360 100644 --- a/assets/scripts/app/routes/main/repositories.coffee +++ b/assets/scripts/app/routes/main/repositories.coffee @@ -1,4 +1,4 @@ -require 'routes/route' +require 'routes/basic' require 'routes/main-tab' MainTabRoute = Travis.MainTabRoute diff --git a/assets/scripts/app/routes/main/search.coffee b/assets/scripts/app/routes/main/search.coffee index 0daf6298..9ec2bc6b 100644 --- a/assets/scripts/app/routes/main/search.coffee +++ b/assets/scripts/app/routes/main/search.coffee @@ -1,4 +1,4 @@ -require 'routes/route' +require 'routes/basic' require 'routes/main-tab' MainTabRoute = Travis.MainTabRoute diff --git a/assets/scripts/app/routes/not-found.coffee b/assets/scripts/app/routes/not-found.coffee index 49feb919..f81a2e5c 100644 --- a/assets/scripts/app/routes/not-found.coffee +++ b/assets/scripts/app/routes/not-found.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend renderTemplate: -> diff --git a/assets/scripts/app/routes/profile.coffee b/assets/scripts/app/routes/profile.coffee index be14a502..23e88170 100644 --- a/assets/scripts/app/routes/profile.coffee +++ b/assets/scripts/app/routes/profile.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend needsAuth: true diff --git a/assets/scripts/app/routes/pull-requests.coffee b/assets/scripts/app/routes/pull-requests.coffee index cf908fbf..9c979dc7 100644 --- a/assets/scripts/app/routes/pull-requests.coffee +++ b/assets/scripts/app/routes/pull-requests.coffee @@ -1,4 +1,4 @@ -require 'routes/route' +require 'routes/basic' AbstractBuildsRoute = Travis.AbstractBuildsRoute diff --git a/assets/scripts/app/routes/repo.coffee b/assets/scripts/app/routes/repo.coffee index 699b022f..b8e26400 100644 --- a/assets/scripts/app/routes/repo.coffee +++ b/assets/scripts/app/routes/repo.coffee @@ -1,8 +1,8 @@ -require 'routes/route' +require 'routes/basic' require 'models/repo' Repo = Travis.Repo -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend renderTemplate: -> diff --git a/assets/scripts/app/routes/repo/index.coffee b/assets/scripts/app/routes/repo/index.coffee index 3d8257b3..c8770ee7 100644 --- a/assets/scripts/app/routes/repo/index.coffee +++ b/assets/scripts/app/routes/repo/index.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend setupController: (controller, model) -> diff --git a/assets/scripts/app/routes/request.coffee b/assets/scripts/app/routes/request.coffee index 540303a9..d9b0a5f6 100644 --- a/assets/scripts/app/routes/request.coffee +++ b/assets/scripts/app/routes/request.coffee @@ -1,7 +1,7 @@ -require 'routes/route' +require 'routes/basic' require 'models/request' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend setupController: -> diff --git a/assets/scripts/app/routes/requests.coffee b/assets/scripts/app/routes/requests.coffee index 2b41e053..195d61c4 100644 --- a/assets/scripts/app/routes/requests.coffee +++ b/assets/scripts/app/routes/requests.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend needsAuth: true diff --git a/assets/scripts/app/routes/settings.coffee b/assets/scripts/app/routes/settings.coffee index 17513bb5..5318fe2d 100644 --- a/assets/scripts/app/routes/settings.coffee +++ b/assets/scripts/app/routes/settings.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend needsAuth: true diff --git a/assets/scripts/app/routes/settings/index.coffee b/assets/scripts/app/routes/settings/index.coffee index bcee0222..dad7b55a 100644 --- a/assets/scripts/app/routes/settings/index.coffee +++ b/assets/scripts/app/routes/settings/index.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend model: -> diff --git a/assets/scripts/app/routes/simple-layout.coffee b/assets/scripts/app/routes/simple-layout.coffee index dcb806a7..8cf24c90 100644 --- a/assets/scripts/app/routes/simple-layout.coffee +++ b/assets/scripts/app/routes/simple-layout.coffee @@ -1,6 +1,6 @@ -require 'routes/route' +require 'routes/basic' -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend setupController: -> diff --git a/assets/scripts/app/routes/ssh-key.coffee b/assets/scripts/app/routes/ssh-key.coffee index 42d9b47f..a1005137 100644 --- a/assets/scripts/app/routes/ssh-key.coffee +++ b/assets/scripts/app/routes/ssh-key.coffee @@ -1,10 +1,10 @@ -require 'routes/route' +require 'routes/basic' require 'models/ssh-key' require 'utils/ajax' SshKey = Travis.SshKey Ajax = Travis.ajax -TravisRoute = Travis.Route +TravisRoute = Travis.BasicRoute Route = TravisRoute.extend model: (params) -> diff --git a/assets/scripts/app/views/accounts.coffee b/assets/scripts/app/views/accounts.coffee index 3713eaf4..5d479445 100644 --- a/assets/scripts/app/views/accounts.coffee +++ b/assets/scripts/app/views/accounts.coffee @@ -1,5 +1,5 @@ @Travis.reopen - ProfileAccountsView: Travis.View.extend + ProfileAccountsView: Travis.BasicView.extend tabBinding: 'controller.tab' templateName: 'profile/accounts' classAccounts: (-> @@ -14,7 +14,7 @@ emptyView: Ember.View.extend template: Ember.Handlebars.compile('

Loading
') - itemViewClass: Travis.View.extend + itemViewClass: Travis.BasicView.extend accountBinding: 'content' typeBinding: 'content.type' selectedBinding: 'account.selected' diff --git a/assets/scripts/app/views/annotation.coffee b/assets/scripts/app/views/annotation.coffee index 712f10a0..b3afe483 100644 --- a/assets/scripts/app/views/annotation.coffee +++ b/assets/scripts/app/views/annotation.coffee @@ -1,4 +1,4 @@ Travis.reopen - AnnotationsView: Travis.View.extend + AnnotationsView: Travis.BasicView.extend templateName: 'annotations/list' diff --git a/assets/scripts/app/views/annotations.coffee b/assets/scripts/app/views/annotations.coffee index 556ee80f..ac8376a0 100644 --- a/assets/scripts/app/views/annotations.coffee +++ b/assets/scripts/app/views/annotations.coffee @@ -1,2 +1,2 @@ Travis.reopen - AnnotationsView: Travis.View.extend + AnnotationsView: Travis.BasicView.extend diff --git a/assets/scripts/app/views/application.coffee b/assets/scripts/app/views/application.coffee index 4fda64be..fd595908 100644 --- a/assets/scripts/app/views/application.coffee +++ b/assets/scripts/app/views/application.coffee @@ -1,5 +1,5 @@ Travis.reopen - ApplicationView: Travis.View.extend + ApplicationView: Travis.BasicView.extend classNames: ['application'] click: (event) -> # TODO: this solves the case of closing menus and popups, diff --git a/assets/scripts/app/views/application/loading.coffee b/assets/scripts/app/views/application/loading.coffee index e88ea100..1d75faac 100644 --- a/assets/scripts/app/views/application/loading.coffee +++ b/assets/scripts/app/views/application/loading.coffee @@ -1,6 +1,6 @@ -require 'views/view' +require 'views/basic' -TravisView = Travis.View +TravisView = Travis.BasicView View = TravisView.extend() diff --git a/assets/scripts/app/views/view.coffee b/assets/scripts/app/views/basic.coffee similarity index 77% rename from assets/scripts/app/views/view.coffee rename to assets/scripts/app/views/basic.coffee index 4ae0ec60..2404a0ce 100644 --- a/assets/scripts/app/views/view.coffee +++ b/assets/scripts/app/views/basic.coffee @@ -10,10 +10,10 @@ View = Ember.View.extend popupClose: -> $('.popup').removeClass('display') popupCloseAll: -> - if view = Travis.View.currentPopupView + if view = Ember.View.currentPopupView view.destroy() - Travis.View.currentPopupView = null + Ember.View.currentPopupView = null $('.popup').removeClass('display') -Travis.View = View +Travis.BasicView = View diff --git a/assets/scripts/app/views/build.coffee b/assets/scripts/app/views/build.coffee index 89bd39cf..1ef531c9 100644 --- a/assets/scripts/app/views/build.coffee +++ b/assets/scripts/app/views/build.coffee @@ -1,6 +1,6 @@ colorForState = Travis.Helpers.colorForState -View = Travis.View.extend +View = Travis.BasicView.extend classNameBindings: ['color', 'loading'] buildBinding: 'controller.build' loadingBinding: 'controller.loading' diff --git a/assets/scripts/app/views/dashboard.coffee b/assets/scripts/app/views/dashboard.coffee index 186415df..3cc467af 100644 --- a/assets/scripts/app/views/dashboard.coffee +++ b/assets/scripts/app/views/dashboard.coffee @@ -1,6 +1,6 @@ -require 'views/view' +require 'views/basic' -TravisView = Travis.View +TravisView = Travis.BasicView View = TravisView.extend layoutName: 'layouts/dashboard' diff --git a/assets/scripts/app/views/first-sync.coffee b/assets/scripts/app/views/first-sync.coffee index eb5a266a..88c61a0f 100644 --- a/assets/scripts/app/views/first-sync.coffee +++ b/assets/scripts/app/views/first-sync.coffee @@ -1,4 +1,4 @@ -View = Travis.View.extend +View = Travis.BasicView.extend layoutName: 'layouts/simple' Travis.FirstSyncView = View diff --git a/assets/scripts/app/views/flash.coffee b/assets/scripts/app/views/flash.coffee index 3901b187..b1fe7451 100644 --- a/assets/scripts/app/views/flash.coffee +++ b/assets/scripts/app/views/flash.coffee @@ -1,10 +1,10 @@ @Travis.reopen - FlashView: Travis.View.extend + FlashView: Travis.BasicView.extend classNames: ['flash'] tagName: 'ul' templateName: 'layouts/flash' - FlashItemView: Travis.View.extend + FlashItemView: Travis.BasicView.extend tagName: 'li' classNameBindings: ['type'] diff --git a/assets/scripts/app/views/insufficient-oauth-permissions.coffee b/assets/scripts/app/views/insufficient-oauth-permissions.coffee index d7943de2..9036a417 100644 --- a/assets/scripts/app/views/insufficient-oauth-permissions.coffee +++ b/assets/scripts/app/views/insufficient-oauth-permissions.coffee @@ -1,4 +1,4 @@ -View = Travis.View.extend +View = Travis.BasicView.extend layoutName: 'layouts/simple' Travis.InsufficientOauthPermissionsView = View diff --git a/assets/scripts/app/views/jobs-item.coffee b/assets/scripts/app/views/jobs-item.coffee index 59ae69b4..77fff83d 100644 --- a/assets/scripts/app/views/jobs-item.coffee +++ b/assets/scripts/app/views/jobs-item.coffee @@ -1,4 +1,4 @@ -View = Travis.View.extend +View = Travis.BasicView.extend tagName: 'tr' classNameBindings: ['color'] repoBinding: 'context.repo' diff --git a/assets/scripts/app/views/left.coffee b/assets/scripts/app/views/left.coffee index f79cf82a..02c9eba9 100644 --- a/assets/scripts/app/views/left.coffee +++ b/assets/scripts/app/views/left.coffee @@ -1,5 +1,5 @@ @Travis.reopen - ReposView: Travis.View.extend + ReposView: Travis.BasicView.extend templateName: 'repos/list' tabBinding: 'controller.tab' diff --git a/assets/scripts/app/views/log.coffee b/assets/scripts/app/views/log.coffee index b03616f9..c0241462 100644 --- a/assets/scripts/app/views/log.coffee +++ b/assets/scripts/app/views/log.coffee @@ -8,7 +8,7 @@ Log.LIMIT = 10000 config = ENV.config Travis.reopen - LogView: Travis.View.extend + LogView: Travis.BasicView.extend templateName: 'jobs/log' logBinding: 'job.log' diff --git a/assets/scripts/app/views/main.coffee b/assets/scripts/app/views/main.coffee index 895f4686..19b6bf91 100644 --- a/assets/scripts/app/views/main.coffee +++ b/assets/scripts/app/views/main.coffee @@ -1,4 +1,4 @@ -View = Travis.View.extend +View = Travis.BasicView.extend layoutName: 'layouts/home' classNames: ['main'] diff --git a/assets/scripts/app/views/profile.coffee b/assets/scripts/app/views/profile.coffee index fc1c66b6..dadf0518 100644 --- a/assets/scripts/app/views/profile.coffee +++ b/assets/scripts/app/views/profile.coffee @@ -1,5 +1,5 @@ Travis.reopen - ProfileView: Travis.View.extend + ProfileView: Travis.BasicView.extend templateName: 'profile/show' layoutName: 'layouts/profile' classNames: ['profile-view'] @@ -11,7 +11,7 @@ Travis.reopen @get('account.name') || @get('account.login') ).property('account.name', 'account.login') - ProfileTabsView: Travis.View.extend + ProfileTabsView: Travis.BasicView.extend templateName: 'profile/tabs' tabBinding: 'controller.tab' @@ -30,7 +30,7 @@ Travis.reopen @get('controller.account.login') == @get('controller.user.login') ).property('controller.account.login', 'controller.user.login') - HooksView: Travis.View.extend + HooksView: Travis.BasicView.extend templateName: 'profile/tabs/hooks' userBinding: 'controller.user' @@ -38,7 +38,7 @@ Travis.reopen Travis.Urls.githubAdmin(@get('hook.slug')) ).property('hook.slug') - AccountsInfoView: Travis.View.extend + AccountsInfoView: Travis.BasicView.extend templateName: 'profile/tabs/user' userBinding: 'controller.user' diff --git a/assets/scripts/app/views/repo-actions.coffee b/assets/scripts/app/views/repo-actions.coffee index 3d8a5b58..2dd9db61 100644 --- a/assets/scripts/app/views/repo-actions.coffee +++ b/assets/scripts/app/views/repo-actions.coffee @@ -1,6 +1,6 @@ config = ENV.config -View = Travis.View.extend +View = Travis.BasicView.extend templateName: 'repos/show/actions' repoBinding: 'controller.repo' diff --git a/assets/scripts/app/views/repo-show-tabs.coffee b/assets/scripts/app/views/repo-show-tabs.coffee index cd6fa149..b5502e4c 100644 --- a/assets/scripts/app/views/repo-show-tabs.coffee +++ b/assets/scripts/app/views/repo-show-tabs.coffee @@ -1,4 +1,4 @@ -View = Travis.View.extend +View = Travis.BasicView.extend templateName: 'repos/show/tabs' tabBinding: 'controller.tab' diff --git a/assets/scripts/app/views/repo-show-tools.coffee b/assets/scripts/app/views/repo-show-tools.coffee index 3b5e7833..05698c3f 100644 --- a/assets/scripts/app/views/repo-show-tools.coffee +++ b/assets/scripts/app/views/repo-show-tools.coffee @@ -1,4 +1,4 @@ -View = Travis.View.extend +View = Travis.BasicView.extend templateName: 'repos/show/tools' repoBinding: 'controller.repo' diff --git a/assets/scripts/app/views/repo.coffee b/assets/scripts/app/views/repo.coffee index 5b8f0c48..9f8c309d 100644 --- a/assets/scripts/app/views/repo.coffee +++ b/assets/scripts/app/views/repo.coffee @@ -2,7 +2,7 @@ statusImage = Travis.Urls.statusImage StatusImagesView = Travis.StatusImagesView config = ENV.config -View = Travis.View.extend +View = Travis.BasicView.extend reposBinding: 'controllers.repos' repoBinding: 'controller.repo' buildBinding: 'controller.build' @@ -23,11 +23,11 @@ View = Travis.View.extend statusImages: () -> @popupCloseAll() view = StatusImagesView.create(toolsView: this) - Travis.View.currentPopupView = view + Travis.BasicView.currentPopupView = view view.appendTo($('body')) return false - ReposEmptyView: Travis.View.extend + ReposEmptyView: Travis.BasicView.extend template: (-> if config.pro 'pro/repos/show/empty' diff --git a/assets/scripts/app/views/repos-list-tabs.coffee b/assets/scripts/app/views/repos-list-tabs.coffee index 7df35729..271ea79f 100644 --- a/assets/scripts/app/views/repos-list-tabs.coffee +++ b/assets/scripts/app/views/repos-list-tabs.coffee @@ -1,4 +1,4 @@ -View = Travis.View.extend +View = Travis.BasicView.extend templateName: 'repos/list/tabs' tabBinding: 'controller.tab' currentUserBinding: 'controller.currentUser.id' diff --git a/assets/scripts/app/views/repos-list.coffee b/assets/scripts/app/views/repos-list.coffee index d4fc21a0..4d38d6ba 100644 --- a/assets/scripts/app/views/repos-list.coffee +++ b/assets/scripts/app/views/repos-list.coffee @@ -7,7 +7,7 @@ View = Em.CollectionView.extend emptyView: Ember.View.extend template: Ember.Handlebars.compile('
Loading
') - itemViewClass: Travis.View.extend + itemViewClass: Travis.BasicView.extend repoBinding: 'content' classNames: ['repo'] classNameBindings: ['color', 'selected'] diff --git a/assets/scripts/app/views/signin.coffee b/assets/scripts/app/views/signin.coffee index 1dc06001..3365fcfa 100644 --- a/assets/scripts/app/views/signin.coffee +++ b/assets/scripts/app/views/signin.coffee @@ -1,3 +1,3 @@ @Travis.reopen - SigninView: Travis.View.extend + SigninView: Travis.BasicView.extend templateName: 'auth/signin' diff --git a/assets/scripts/app/views/stats.coffee b/assets/scripts/app/views/stats.coffee index da7e1498..7043e232 100644 --- a/assets/scripts/app/views/stats.coffee +++ b/assets/scripts/app/views/stats.coffee @@ -1,5 +1,5 @@ @Travis.reopen - StatsView: Travis.View.extend + StatsView: Travis.BasicView.extend templateName: 'stats/show' didInsertElement: -> # @renderChart(config) for name, config of @CHARTS diff --git a/assets/scripts/app/views/top.coffee b/assets/scripts/app/views/top.coffee index c1cf09d8..7ddcb7ce 100644 --- a/assets/scripts/app/views/top.coffee +++ b/assets/scripts/app/views/top.coffee @@ -1,5 +1,5 @@ @Travis.reopen - TopView: Travis.View.extend + TopView: Travis.BasicView.extend tabBinding: 'controller.tab' # hrm. how to parametrize bind-attr? diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index dbcb8ead..b93118c7 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -27,6 +27,7 @@ require 'utils/status-image-formats' require 'utils/pusher' require 'utils/slider' require 'utils/tailing' +require 'utils/to-top' require 'mixins/github-url-properties' require 'utils/keys-map' @@ -75,7 +76,7 @@ require 'routes/repo/index' require 'routes/repo' require 'routes/request' require 'routes/requests' -require 'routes/route' +require 'routes/basic' require 'routes/settings/index' require 'routes/settings' require 'routes/simple-layout' @@ -180,7 +181,7 @@ require 'models/user' require 'models/env-var' require 'models/ssh-key' -require 'views/view' +require 'views/basic' require 'views/accounts' require 'views/annotation' require 'views/application' From 051562540c4663da51bf86a96155ae842b94cc06 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 11:56:12 +0100 Subject: [PATCH 142/313] Get back to using $.throttle --- assets/scripts/app/utils/tailing.coffee | 2 +- assets/scripts/app/utils/to-top.coffee | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/scripts/app/utils/tailing.coffee b/assets/scripts/app/utils/tailing.coffee index 31b88285..6162b169 100644 --- a/assets/scripts/app/utils/tailing.coffee +++ b/assets/scripts/app/utils/tailing.coffee @@ -9,7 +9,7 @@ class Tailing constructor: (@window, @tail_selector, @log_selector) -> @position = @window.scrollTop() - @window.scroll( Ember.run.throttle(this, @onScroll, [], 200, false) ) + @window.scroll( $.throttle( 200, @onScroll.bind(this) ) ) this run: -> diff --git a/assets/scripts/app/utils/to-top.coffee b/assets/scripts/app/utils/to-top.coffee index ae6b17e3..57f9fdf1 100644 --- a/assets/scripts/app/utils/to-top.coffee +++ b/assets/scripts/app/utils/to-top.coffee @@ -6,7 +6,7 @@ class ToTop # the calculations. constructor: (@window, @element_selector, @container_selector) -> @position = @window.scrollTop() - @window.scroll( Ember.run.throttle(this, @onScroll, [], 200, false) ) + @window.scroll( $.throttle( 200, @onScroll.bind(this) ) ) this element: -> From bf33ffce41e83829b7c0336f0f1097e71b056059 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 11:56:43 +0100 Subject: [PATCH 143/313] Move some helpers from ext/jquery to utils/helpers --- assets/scripts/app/utils/helpers.coffee | 24 ++++++++++++++++++++++-- assets/scripts/travis.coffee | 1 + 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/assets/scripts/app/utils/helpers.coffee b/assets/scripts/app/utils/helpers.coffee index 52bd0c50..77905163 100644 --- a/assets/scripts/app/utils/helpers.coffee +++ b/assets/scripts/app/utils/helpers.coffee @@ -4,8 +4,6 @@ config_keys_map = Travis.CONFIG_KEYS_MAP config = ENV.config githubCommitUrl = Travis.Urls.githubCommit timeago = $.timeago -intersect = $.intersect -only = $.only mapObject = $.map colors = { @@ -16,6 +14,28 @@ colors = { canceled: 'gray' } +mapObject = (elems, callback, arg) -> + value = undefined + key = undefined + ret = [] + i = 0 + for key of elems + value = callback(elems[key], key, arg) + ret[ret.length] = value if value? + ret.concat.apply [], ret + +only = (object) -> + keys = Array::slice.apply(arguments) + object = (if (typeof keys[0] is 'object') then keys.shift() else this) + result = {} + for key of object + result[key] = object[key] unless keys.indexOf(key) is -1 + result + +intersect = (array, other) -> + array.filter (element) -> + other.indexOf(element) != -1 + compact = (object) -> result = {} (result[key] = value unless Ember.isEmpty(value)) for key, value of object || {} diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index b93118c7..c16a518f 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -21,6 +21,7 @@ if charm_key = $('meta[name="travis.charm_key"]').attr('value') require 'utils/ajax' +require 'utils/keys-map' require 'utils/urls' require 'utils/helpers' require 'utils/status-image-formats' From a431f80f3acf38c6e7b44e07fc3e2e1c5a06dfd1 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 12:07:18 +0100 Subject: [PATCH 144/313] Use String.camelize instead of $.camelize --- assets/scripts/app/controllers/profile.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/scripts/app/controllers/profile.coffee b/assets/scripts/app/controllers/profile.coffee index 5b1b4184..f8c9bdcc 100644 --- a/assets/scripts/app/controllers/profile.coffee +++ b/assets/scripts/app/controllers/profile.coffee @@ -6,7 +6,7 @@ Controller = Ember.Controller.extend accountBinding: 'controllers.account' activate: (action, params) -> - this["view#{$.camelize(action)}"]() + this["view_#{action}".camelize()]() viewHooks: -> @connectTab('hooks') From 3f3781459d696a5d166e667f3d5213a6113d3e62 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 12:07:32 +0100 Subject: [PATCH 145/313] Export BasicView also as Travis.View --- assets/scripts/app/views/basic.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/scripts/app/views/basic.coffee b/assets/scripts/app/views/basic.coffee index 2404a0ce..abbee406 100644 --- a/assets/scripts/app/views/basic.coffee +++ b/assets/scripts/app/views/basic.coffee @@ -17,3 +17,4 @@ View = Ember.View.extend $('.popup').removeClass('display') Travis.BasicView = View +Travis.View = View From 5fd821d59ee3e84d3f6d554e3242982cfa5a1a91 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 12:16:31 +0100 Subject: [PATCH 146/313] More ember-cli compat in views --- assets/scripts/app/transforms/object.coffee | 4 +- .../scripts/app/utils/lines-selector.coffee | 4 +- assets/scripts/app/utils/log-chunks.coffee | 4 +- assets/scripts/app/utils/log-folder.coffee | 4 +- assets/scripts/app/vendor/log.js | 1075 +++++++++++++++++ assets/scripts/app/views/accounts-info.coffee | 11 + assets/scripts/app/views/accounts-list.coffee | 30 + assets/scripts/app/views/accounts.coffee | 34 - assets/scripts/app/views/annotation.coffee | 8 +- assets/scripts/app/views/annotations.coffee | 5 +- assets/scripts/app/views/application.coffee | 32 +- assets/scripts/app/views/build.coffee | 15 +- assets/scripts/app/views/dashboard.coffee | 4 +- assets/scripts/app/views/first-sync.coffee | 4 +- assets/scripts/app/views/flash-item.coffee | 15 + assets/scripts/app/views/flash.coffee | 21 +- assets/scripts/app/views/hooks.coffee | 12 + assets/scripts/app/views/jobs-item.coffee | 7 +- assets/scripts/app/views/left.coffee | 20 - assets/scripts/app/views/log.coffee | 164 +-- assets/scripts/app/views/pre.coffee | 113 ++ .../scripts/app/views/profile-accounts.coffee | 11 + assets/scripts/app/views/profile-tabs.coffee | 22 + assets/scripts/app/views/profile.coffee | 56 +- assets/scripts/app/views/repo.coffee | 7 +- assets/scripts/app/views/repos-list.coffee | 2 +- assets/scripts/app/views/signin.coffee | 9 +- assets/scripts/app/views/stats.coffee | 73 -- .../app/views/status-image-input.coffee | 4 +- assets/scripts/app/views/status-images.coffee | 7 +- assets/scripts/app/views/top.coffee | 42 +- assets/scripts/travis.coffee | 9 +- assets/scripts/vendor/log.js | 2 - 33 files changed, 1432 insertions(+), 398 deletions(-) create mode 100644 assets/scripts/app/vendor/log.js create mode 100644 assets/scripts/app/views/accounts-info.coffee create mode 100644 assets/scripts/app/views/accounts-list.coffee delete mode 100644 assets/scripts/app/views/accounts.coffee create mode 100644 assets/scripts/app/views/flash-item.coffee create mode 100644 assets/scripts/app/views/hooks.coffee delete mode 100644 assets/scripts/app/views/left.coffee create mode 100644 assets/scripts/app/views/pre.coffee create mode 100644 assets/scripts/app/views/profile-accounts.coffee create mode 100644 assets/scripts/app/views/profile-tabs.coffee delete mode 100644 assets/scripts/app/views/stats.coffee delete mode 100644 assets/scripts/vendor/log.js diff --git a/assets/scripts/app/transforms/object.coffee b/assets/scripts/app/transforms/object.coffee index 1b7d6e55..13fba95d 100644 --- a/assets/scripts/app/transforms/object.coffee +++ b/assets/scripts/app/transforms/object.coffee @@ -1,6 +1,8 @@ -Travis.ObjectTransform = DS.Transform.extend +Transform = DS.Transform.extend deserialize: (serialized) -> serialized serialize: (deserialized) -> deserialized + +Travis.ObjectTransform = Transform diff --git a/assets/scripts/app/utils/lines-selector.coffee b/assets/scripts/app/utils/lines-selector.coffee index 1f81002c..a70008ad 100644 --- a/assets/scripts/app/utils/lines-selector.coffee +++ b/assets/scripts/app/utils/lines-selector.coffee @@ -1,4 +1,4 @@ -class Travis.LinesSelector +class LinesSelector Location: getHash: -> window.location.hash @@ -71,3 +71,5 @@ class Travis.LinesSelector first = match[1] last = match[3] || match[1] {first: first, last: last} + +Travis.LinesSelector = LinesSelector diff --git a/assets/scripts/app/utils/log-chunks.coffee b/assets/scripts/app/utils/log-chunks.coffee index 9570ad4a..3689ba50 100644 --- a/assets/scripts/app/utils/log-chunks.coffee +++ b/assets/scripts/app/utils/log-chunks.coffee @@ -1,4 +1,4 @@ -Travis.LogChunks = Em.ArrayProxy.extend +LogChunks = Ember.ArrayProxy.extend timeout: 30000 init: -> @@ -80,3 +80,5 @@ Travis.LogChunks = Em.ArrayProxy.extend Ember.run.once this, -> @tryFinalizing() @resetTimeout() + +Travis.LogChunks = LogChunks diff --git a/assets/scripts/app/utils/log-folder.coffee b/assets/scripts/app/utils/log-folder.coffee index 1d1bb1be..22b7e86e 100644 --- a/assets/scripts/app/utils/log-folder.coffee +++ b/assets/scripts/app/utils/log-folder.coffee @@ -1,4 +1,4 @@ -class Travis.LogFolder +class LogFolder constructor: (@element) -> @element.on 'click', '.fold', (event) => folder = @getFolderFromLine $(event.target) @@ -22,3 +22,5 @@ class Travis.LogFolder getFolderFromLine: (line) -> line.parent('.fold') + + Travis.LogFolder = LogFolder diff --git a/assets/scripts/app/vendor/log.js b/assets/scripts/app/vendor/log.js new file mode 100644 index 00000000..496e44d1 --- /dev/null +++ b/assets/scripts/app/vendor/log.js @@ -0,0 +1,1075 @@ +var Log = function() { + this.autoCloseFold = true; + this.listeners = []; + this.renderer = new Log.Renderer; + this.children = new Log.Nodes(this); + this.parts = {}; + this.folds = new Log.Folds(this); + this.times = new Log.Times(this); + return this; +}; + +Log.extend = function(one, other) { + var name; + for (name in other) { + one[name] = other[name]; + } + return one; +}; + +Log.extend(Log, { + DEBUG: true, + SLICE: 500, + TIMEOUT: 25, + FOLD: /fold:(start|end):([\w_\-\.]+)/, + TIME: /time:(start|end):([\w_\-\.]+):?([\w_\-\.\=\,]*)/, + create: function(options) { + var listener, log, _i, _len, _ref; + options || (options = {}); + log = new Log(); + if (options.limit) { + log.listeners.push(log.limit = new Log.Limit(options.limit)); + } + _ref = options.listeners || []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + listener = _ref[_i]; + log.listeners.push(listener); + } + return log; + } +}); + +var newLineAtTheEndRegexp, newLineRegexp, rRegexp, removeCarriageReturns; + +Log.Node = function(id, num) { + this.id = id; + this.num = num; + this.key = Log.Node.key(this.id); + this.children = new Log.Nodes(this); + return this; +}; + +Log.extend(Log.Node, { + key: function(id) { + if (id) { + return id.split('-').map(function(i) { + return '000000'.concat(i).slice(-6); + }).join(''); + } + } +}); + +Log.extend(Log.Node.prototype, { + addChild: function(node) { + return this.children.add(node); + }, + remove: function() { + this.log.remove(this.element); + return this.parent.children.remove(this); + } +}); + +Object.defineProperty(Log.Node.prototype, 'log', { + get: function() { + var _ref; + return this._log || (this._log = ((_ref = this.parent) != null ? _ref.log : void 0) || this.parent); + } +}); + +Object.defineProperty(Log.Node.prototype, 'firstChild', { + get: function() { + return this.children.first; + } +}); + +Object.defineProperty(Log.Node.prototype, 'lastChild', { + get: function() { + return this.children.last; + } +}); + +Log.Nodes = function(parent) { + if (parent) { + this.parent = parent; + } + this.items = []; + this.index = {}; + return this; +}; + +Log.extend(Log.Nodes.prototype, { + add: function(item) { + var ix, next, prev, _ref, _ref1; + ix = this.position(item) || 0; + this.items.splice(ix, 0, item); + if (this.parent) { + item.parent = this.parent; + } + prev = function(item) { + while (item && !item.children.last) { + item = item.prev; + } + return item != null ? item.children.last : void 0; + }; + next = function(item) { + while (item && !item.children.first) { + item = item.next; + } + return item != null ? item.children.first : void 0; + }; + if (item.prev = this.items[ix - 1] || prev((_ref = this.parent) != null ? _ref.prev : void 0)) { + item.prev.next = item; + } + if (item.next = this.items[ix + 1] || next((_ref1 = this.parent) != null ? _ref1.next : void 0)) { + item.next.prev = item; + } + return item; + }, + remove: function(item) { + this.items.splice(this.items.indexOf(item), 1); + if (item.next) { + item.next.prev = item.prev; + } + if (item.prev) { + item.prev.next = item.next; + } + if (this.items.length === 0) { + return this.parent.remove(); + } + }, + position: function(item) { + var ix, _i, _ref; + for (ix = _i = _ref = this.items.length - 1; _i >= 0; ix = _i += -1) { + if (this.items[ix].key < item.key) { + return ix + 1; + } + } + }, + indexOf: function() { + return this.items.indexOf.apply(this.items, arguments); + }, + slice: function() { + return this.items.slice.apply(this.items, arguments); + }, + each: function(func) { + return this.items.slice().forEach(func); + }, + map: function(func) { + return this.items.map(func); + } +}); + +Object.defineProperty(Log.Nodes.prototype, 'first', { + get: function() { + return this.items[0]; + } +}); + +Object.defineProperty(Log.Nodes.prototype, 'last', { + get: function() { + return this.items[this.length - 1]; + } +}); + +Object.defineProperty(Log.Nodes.prototype, 'length', { + get: function() { + return this.items.length; + } +}); + +Log.Part = function(id, num, string) { + Log.Node.apply(this, arguments); + this.string = string || ''; + this.string = this.string.replace(/\033\[1000D/gm, '\r'); + this.string = this.string.replace(/\r+\n/gm, '\n'); + this.strings = this.string.split(/^/gm) || []; + this.slices = ((function() { + var _results; + _results = []; + while (this.strings.length > 0) { + _results.push(this.strings.splice(0, Log.SLICE)); + } + return _results; + }).call(this)); + return this; +}; + +Log.extend(Log.Part, { + create: function(log, num, string) { + var part; + part = new Log.Part(num.toString(), num, string); + log.addChild(part); + return part.process(0, -1); + } +}); + +Log.Part.prototype = Log.extend(new Log.Node, { + remove: function() {}, + process: function(slice, num) { + var node, span, spans, string, _i, _j, _len, _len1, _ref, _ref1, _ref2, _ref3, _ref4, + _this = this; + _ref = this.slices[slice] || []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + string = _ref[_i]; + if ((_ref1 = this.log.limit) != null ? _ref1.limited : void 0) { + return; + } + spans = []; + _ref2 = Log.Deansi.apply(string); + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + node = _ref2[_j]; + span = Log.Span.create(this, "" + this.id + "-" + (num += 1), num, node.text, node["class"]); + span.render(); + spans.push(span); + } + if ((_ref3 = spans[0]) != null ? (_ref4 = _ref3.line) != null ? _ref4.cr : void 0 : void 0) { + spans[0].line.clear(); + } + } + if (!(slice >= this.slices.length - 1)) { + return setTimeout((function() { + return _this.process(slice + 1, num); + }), Log.TIMEOUT); + } + } +}); + +newLineAtTheEndRegexp = new RegExp("\n$"); + +newLineRegexp = new RegExp("\n"); + +rRegexp = new RegExp("\r"); + +removeCarriageReturns = function(string) { + var index; + index = string.lastIndexOf("\r"); + if (index === -1) { + return string; + } + return string.substr(index + 1); +}; + +Log.Span = function(id, num, text, classes) { + var fold, time, _ref; + Log.Node.apply(this, arguments); + if (fold = text.match(Log.FOLD)) { + this.fold = true; + this.event = fold[1]; + this.text = this.name = fold[2]; + } else if (time = text.match(Log.TIME)) { + this.time = true; + this.event = time[1]; + this.name = time[2]; + this.stats = time[3]; + } else { + this.text = text; + this.text = removeCarriageReturns(this.text); + this.text = this.text.replace(newLineAtTheEndRegexp, ''); + this.nl = !!((_ref = text[text.length - 1]) != null ? _ref.match(newLineRegexp) : void 0); + this.cr = !!text.match(rRegexp); + this["class"] = this.cr && ['clears'] || classes; + } + return this; +}; + +Log.extend(Log.Span, { + create: function(parent, id, num, text, classes) { + var span; + span = new Log.Span(id, num, text, classes); + parent.addChild(span); + return span; + }, + render: function(parent, id, num, text, classes) { + var span; + span = this.create(parent, id, num, text, classes); + return span.render(); + } +}); + +Log.Span.prototype = Log.extend(new Log.Node, { + render: function() { + var tail; + if (this.time && this.event === 'end' && this.prev) { + if (Log.DEBUG) { + console.log("S.0 insert " + this.id + " after prev " + this.prev.id); + } + this.nl = this.prev.nl; + this.log.insert(this.data, { + after: this.prev.element + }); + this.line = this.prev.line; + } else if (!this.fold && this.prev && !this.prev.fold && !this.prev.nl) { + if (Log.DEBUG) { + console.log("S.1 insert " + this.id + " after prev " + this.prev.id); + } + this.log.insert(this.data, { + after: this.prev.element + }); + this.line = this.prev.line; + } else if (!this.fold && this.next && !this.next.fold && !this.next.time) { + if (Log.DEBUG) { + console.log("S.2 insert " + this.id + " before next " + this.next.id); + } + this.log.insert(this.data, { + before: this.next.element + }); + this.line = this.next.line; + } else { + this.line = Log.Line.create(this.log, [this]); + this.line.render(); + } + if (this.nl && (tail = this.tail).length > 0) { + this.split(tail); + } + if (this.time) { + return this.log.times.add(this); + } + }, + remove: function() { + Log.Node.prototype.remove.apply(this); + if (this.line) { + return this.line.remove(this); + } + }, + split: function(spans) { + var line, span, _i, _len; + if (Log.DEBUG) { + console.log("S.4 split [" + (spans.map(function(span) { + return span.id; + }).join(', ')) + "]"); + } + for (_i = 0, _len = spans.length; _i < _len; _i++) { + span = spans[_i]; + this.log.remove(span.element); + } + line = Log.Line.create(this.log, spans); + line.render(); + if (line.cr) { + return line.clear(); + } + }, + clear: function() { + if (this.prev && this.isSibling(this.prev) && this.isSequence(this.prev)) { + this.prev.clear(); + return this.prev.remove(); + } + }, + isSequence: function(other) { + return this.parent.num - other.parent.num === this.log.children.indexOf(this.parent) - this.log.children.indexOf(other.parent); + }, + isSibling: function(other) { + var _ref, _ref1; + return ((_ref = this.element) != null ? _ref.parentNode : void 0) === ((_ref1 = other.element) != null ? _ref1.parentNode : void 0); + }, + siblings: function(type) { + var siblings, span; + siblings = []; + while ((span = (span || this)[type]) && this.isSibling(span)) { + siblings.push(span); + } + return siblings; + } +}); + +Object.defineProperty(Log.Span.prototype, 'data', { + get: function() { + return { + id: this.id, + type: 'span', + text: this.text, + "class": this["class"], + time: this.time + }; + } +}); + +Object.defineProperty(Log.Span.prototype, 'line', { + get: function() { + return this._line; + }, + set: function(line) { + if (this.line) { + this.line.remove(this); + } + this._line = line; + if (this.line) { + return this.line.add(this); + } + } +}); + +Object.defineProperty(Log.Span.prototype, 'element', { + get: function() { + return document.getElementById(this.id); + } +}); + +Object.defineProperty(Log.Span.prototype, 'head', { + get: function() { + return this.siblings('prev').reverse(); + } +}); + +Object.defineProperty(Log.Span.prototype, 'tail', { + get: function() { + return this.siblings('next'); + } +}); + +Log.Line = function(log) { + this.log = log; + this.spans = []; + return this; +}; + +Log.extend(Log.Line, { + create: function(log, spans) { + var line, span, _i, _len; + if ((span = spans[0]) && span.fold) { + line = new Log.Fold(log, span.event, span.name); + } else { + line = new Log.Line(log); + } + for (_i = 0, _len = spans.length; _i < _len; _i++) { + span = spans[_i]; + span.line = line; + } + return line; + } +}); + +Log.extend(Log.Line.prototype, { + add: function(span) { + var ix; + if (span.cr) { + this.cr = true; + } + if (this.spans.indexOf(span) > -1) { + + } else if ((ix = this.spans.indexOf(span.prev)) > -1) { + return this.spans.splice(ix + 1, 0, span); + } else if ((ix = this.spans.indexOf(span.next)) > -1) { + return this.spans.splice(ix, 0, span); + } else { + return this.spans.push(span); + } + }, + remove: function(span) { + var ix; + if ((ix = this.spans.indexOf(span)) > -1) { + return this.spans.splice(ix, 1); + } + }, + render: function() { + var fold; + if ((fold = this.prev) && fold.event === 'start' && fold.active) { + if (this.next && !this.next.fold) { + if (Log.DEBUG) { + console.log("L.0 insert " + this.id + " before next " + this.next.id); + } + return this.element = this.log.insert(this.data, { + before: this.next.element + }); + } else { + if (Log.DEBUG) { + console.log("L.0 insert " + this.id + " into fold " + fold.id); + } + fold = this.log.folds.folds[fold.name].fold; + return this.element = this.log.insert(this.data, { + into: fold + }); + } + } else if (this.prev) { + if (Log.DEBUG) { + console.log("L.1 insert " + this.spans[0].id + " after prev " + this.prev.id); + } + return this.element = this.log.insert(this.data, { + after: this.prev.element + }); + } else if (this.next) { + if (Log.DEBUG) { + console.log("L.2 insert " + this.spans[0].id + " before next " + this.next.id); + } + return this.element = this.log.insert(this.data, { + before: this.next.element + }); + } else { + if (Log.DEBUG) { + console.log("L.3 insert " + this.spans[0].id + " into #log"); + } + return this.element = this.log.insert(this.data); + } + }, + clear: function() { + var cr, _i, _len, _ref, _results; + _ref = this.crs; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + cr = _ref[_i]; + _results.push(cr.clear()); + } + return _results; + } +}); + +Object.defineProperty(Log.Line.prototype, 'id', { + get: function() { + var _ref; + return (_ref = this.spans[0]) != null ? _ref.id : void 0; + } +}); + +Object.defineProperty(Log.Line.prototype, 'data', { + get: function() { + return { + type: 'paragraph', + nodes: this.nodes + }; + } +}); + +Object.defineProperty(Log.Line.prototype, 'nodes', { + get: function() { + return this.spans.map(function(span) { + return span.data; + }); + } +}); + +Object.defineProperty(Log.Line.prototype, 'prev', { + get: function() { + var _ref; + return (_ref = this.spans[0].prev) != null ? _ref.line : void 0; + } +}); + +Object.defineProperty(Log.Line.prototype, 'next', { + get: function() { + var _ref; + return (_ref = this.spans[this.spans.length - 1].next) != null ? _ref.line : void 0; + } +}); + +Object.defineProperty(Log.Line.prototype, 'crs', { + get: function() { + return this.spans.filter(function(span) { + return span.cr; + }); + } +}); + +Log.Fold = function(log, event, name) { + Log.Line.apply(this, arguments); + this.fold = true; + this.event = event; + this.name = name; + return this; +}; + +Log.Fold.prototype = Log.extend(new Log.Line, { + render: function() { + var element, _ref; + if (this.prev && this.prev.element) { + if (Log.DEBUG) { + console.log("F.1 insert " + this.id + " after prev " + this.prev.id); + } + element = this.prev.element; + this.element = this.log.insert(this.data, { + after: element + }); + } else if (this.next) { + if (Log.DEBUG) { + console.log("F.2 insert " + this.id + " before next " + this.next.id); + } + element = this.next.element || this.next.element.parentNode; + this.element = this.log.insert(this.data, { + before: element + }); + } else { + if (Log.DEBUG) { + console.log("F.3 insert " + this.id); + } + this.element = this.log.insert(this.data); + } + if (this.span.next && ((_ref = this.span.prev) != null ? _ref.isSibling(this.span.next) : void 0)) { + this.span.prev.split([this.span.next].concat(this.span.next.tail)); + } + return this.active = this.log.folds.add(this.data); + } +}); + +Object.defineProperty(Log.Fold.prototype, 'id', { + get: function() { + return "fold-" + this.event + "-" + this.name; + } +}); + +Object.defineProperty(Log.Fold.prototype, 'span', { + get: function() { + return this.spans[0]; + } +}); + +Object.defineProperty(Log.Fold.prototype, 'data', { + get: function() { + return { + type: 'fold', + id: this.id, + event: this.event, + name: this.name + }; + } +}); + +Log.prototype = Log.extend(new Log.Node, { + set: function(num, string) { + if (this.parts[num]) { + return console.log("part " + num + " exists"); + } else { + this.parts[num] = true; + return Log.Part.create(this, num, string); + } + }, + insert: function(data, pos) { + this.trigger('insert', data, pos); + return this.renderer.insert(data, pos); + }, + remove: function(node) { + this.trigger('remove', node); + return this.renderer.remove(node); + }, + hide: function(node) { + this.trigger('hide', node); + return this.renderer.hide(node); + }, + trigger: function() { + var args, ix, listener, _i, _len, _ref, _results; + args = [this].concat(Array.prototype.slice.apply(arguments)); + _ref = this.listeners; + _results = []; + for (ix = _i = 0, _len = _ref.length; _i < _len; ix = ++_i) { + listener = _ref[ix]; + _results.push(listener.notify.apply(listener, args)); + } + return _results; + } +}); + +Log.Listener = function() {}; + +Log.extend(Log.Listener.prototype, { + notify: function(log, event) { + if (this[event]) { + return this[event].apply(this, [log].concat(Array.prototype.slice.call(arguments, 2))); + } + } +}); + +Log.Folds = function(log) { + this.log = log; + this.folds = {}; + return this; +}; + +Log.extend(Log.Folds.prototype, { + add: function(data) { + var fold, _base, _name; + fold = (_base = this.folds)[_name = data.name] || (_base[_name] = new Log.Folds.Fold); + fold.receive(data, { + autoCloseFold: this.log.autoCloseFold + }); + return fold.active; + } +}); + +Log.Folds.Fold = function() { + return this; +}; + +Log.extend(Log.Folds.Fold.prototype, { + receive: function(data, options) { + this[data.event] = data.id; + if (this.start && this.end && !this.active) { + return this.activate(options); + } + }, + activate: function(options) { + var fragment, nextSibling, node, parentNode, toRemove, _i, _len, _ref; + options || (options = {}); + if (Log.DEBUG) { + console.log("F.n - activate " + this.start); + } + toRemove = this.fold.parentNode; + parentNode = toRemove.parentNode; + nextSibling = toRemove.nextSibling; + parentNode.removeChild(toRemove); + fragment = document.createDocumentFragment(); + _ref = this.nodes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + node = _ref[_i]; + fragment.appendChild(node); + } + this.fold.appendChild(fragment); + parentNode.insertBefore(toRemove, nextSibling); + this.fold.setAttribute('class', this.classes(options['autoCloseFold'])); + return this.active = true; + }, + classes: function(autoCloseFold) { + var classes; + classes = this.fold.getAttribute('class').split(' '); + classes.push('fold'); + if (!autoCloseFold) { + classes.push('open'); + } + if (this.fold.childNodes.length > 2) { + classes.push('active'); + } + return classes.join(' '); + } +}); + +Object.defineProperty(Log.Folds.Fold.prototype, 'fold', { + get: function() { + return this._fold || (this._fold = document.getElementById(this.start)); + } +}); + +Object.defineProperty(Log.Folds.Fold.prototype, 'nodes', { + get: function() { + var node, nodes; + node = this.fold; + nodes = []; + while ((node = node.nextSibling) && node.id !== this.end) { + nodes.push(node); + } + return nodes; + } +}); + +Log.Times = function(log) { + this.log = log; + this.times = {}; + return this; +}; + +Log.extend(Log.Times.prototype, { + add: function(node) { + var time, _base, _name; + time = (_base = this.times)[_name = node.name] || (_base[_name] = new Log.Times.Time); + return time.receive(node); + }, + duration: function(name) { + if (this.times[name]) { + return this.times[name].duration; + } + } +}); + +Log.Times.Time = function() { + return this; +}; + +Log.extend(Log.Times.Time.prototype, { + receive: function(node) { + this[node.event] = node; + if (Log.DEBUG) { + console.log("T.0 - " + node.event + " " + node.name); + } + if (this.start && this.end) { + return this.finish(); + } + }, + finish: function() { + var element; + if (Log.DEBUG) { + console.log("T.1 - finish " + this.start.name); + } + element = document.getElementById(this.start.id); + if (element) { + return this.update(element); + } + }, + update: function(element) { + element.setAttribute('class', 'duration'); + element.setAttribute('title', "This command finished after " + this.duration + " seconds."); + return element.lastChild.nodeValue = "" + this.duration + "s"; + } +}); + +Object.defineProperty(Log.Times.Time.prototype, 'duration', { + get: function() { + var duration; + duration = this.stats.duration / 1000 / 1000 / 1000; + return duration.toFixed(2); + } +}); + +Object.defineProperty(Log.Times.Time.prototype, 'stats', { + get: function() { + var stat, stats, _i, _len, _ref; + if (!(this.end && this.end.stats)) { + return {}; + } + stats = {}; + _ref = this.end.stats.split(','); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + stat = _ref[_i]; + stat = stat.split('='); + stats[stat[0]] = stat[1]; + } + return stats; + } +}); + +Log.Deansi = { + CLEAR_ANSI: /(?:\033)(?:\[0?c|\[[0356]n|\[7[lh]|\[\?25[lh]|\(B|H|\[(?:\d+(;\d+){,2})?G|\[(?:[12])?[JK]|[DM]|\[0K)/gm, + apply: function(string) { + var nodes, + _this = this; + if (!string) { + return []; + } + string = string.replace(this.CLEAR_ANSI, ''); + nodes = ansiparse(string).map(function(part) { + return _this.node(part); + }); + return nodes; + }, + node: function(part) { + var classes, node; + node = { + type: 'span', + text: part.text + }; + if (classes = this.classes(part)) { + node["class"] = classes.join(' '); + } + return node; + }, + classes: function(part) { + var result; + result = []; + result = result.concat(this.colors(part)); + if (result.length > 0) { + return result; + } + }, + colors: function(part) { + var colors; + colors = []; + if (part.foreground) { + colors.push(part.foreground); + } + if (part.background) { + colors.push("bg-" + part.background); + } + if (part.bold) { + colors.push('bold'); + } + if (part.italic) { + colors.push('italic'); + } + if (part.underline) { + colors.push('underline'); + } + return colors; + }, + hidden: function(part) { + if (part.text.match(/\r/)) { + part.text = part.text.replace(/^.*\r/gm, ''); + return true; + } + } +}; + +Log.Limit = function(max_lines) { + this.max_lines = max_lines || 1000; + return this; +}; + +Log.Limit.prototype = Log.extend(new Log.Listener, { + count: 0, + insert: function(log, node, pos) { + if (node.type === 'paragraph' && !node.hidden) { + return this.count += 1; + } + } +}); + +Object.defineProperty(Log.Limit.prototype, 'limited', { + get: function() { + return this.count >= this.max_lines; + } +}); + +Log.Renderer = function() { + this.frag = document.createDocumentFragment(); + this.para = this.createParagraph(); + this.span = this.createSpan(); + this.text = document.createTextNode(''); + this.fold = this.createFold(); + return this; +}; + +Log.extend(Log.Renderer.prototype, { + insert: function(data, pos) { + var after, before, into, node; + node = this.render(data); + if (into = pos != null ? pos.into : void 0) { + if (typeof into === 'String') { + into = document.getElementById(pos != null ? pos.into : void 0); + } + if (pos != null ? pos.prepend : void 0) { + this.prependTo(node, into); + } else { + this.appendTo(node, into); + } + } else if (after = pos != null ? pos.after : void 0) { + if (typeof after === 'String') { + after = document.getElementById(pos); + } + this.insertAfter(node, after); + } else if (before = pos != null ? pos.before : void 0) { + if (typeof before === 'String') { + before = document.getElementById(pos != null ? pos.before : void 0); + } + this.insertBefore(node, before); + } else { + this.insertBefore(node); + } + return node; + }, + hide: function(node) { + node.setAttribute('class', this.addClass(node.getAttribute('class'), 'hidden')); + return node; + }, + remove: function(node) { + if (node) { + node.parentNode.removeChild(node); + } + return node; + }, + render: function(data) { + var frag, node, type, _i, _len; + if (data instanceof Array) { + frag = this.frag.cloneNode(true); + for (_i = 0, _len = data.length; _i < _len; _i++) { + node = data[_i]; + node = this.render(node); + if (node) { + frag.appendChild(node); + } + } + return frag; + } else { + data.type || (data.type = 'paragraph'); + type = data.type[0].toUpperCase() + data.type.slice(1); + return this["render" + type](data); + } + }, + renderParagraph: function(data) { + var node, para, type, _i, _len, _ref; + para = this.para.cloneNode(true); + if (data.id) { + para.setAttribute('id', data.id); + } + if (data.hidden) { + para.setAttribute('style', 'display: none;'); + } + _ref = data.nodes || []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + node = _ref[_i]; + type = node.type[0].toUpperCase() + node.type.slice(1); + node = this["render" + type](node); + para.appendChild(node); + } + return para; + }, + renderFold: function(data) { + var fold; + fold = this.fold.cloneNode(true); + fold.setAttribute('id', data.id || ("fold-" + data.event + "-" + data.name)); + fold.setAttribute('class', "fold-" + data.event); + if (data.event === 'start') { + fold.lastChild.lastChild.nodeValue = data.name; + } else { + fold.removeChild(fold.lastChild); + } + return fold; + }, + renderSpan: function(data) { + var span; + span = this.span.cloneNode(true); + if (data.id) { + span.setAttribute('id', data.id); + } + if (data["class"]) { + span.setAttribute('class', data["class"]); + } + span.lastChild.nodeValue = data.text || ''; + return span; + }, + renderText: function(data) { + var text; + text = this.text.cloneNode(true); + text.nodeValue = data.text; + return text; + }, + createParagraph: function() { + var para; + para = document.createElement('p'); + para.appendChild(document.createElement('a')); + return para; + }, + createFold: function() { + var fold; + fold = document.createElement('div'); + fold.appendChild(this.createSpan()); + fold.lastChild.setAttribute('class', 'fold-name'); + return fold; + }, + createSpan: function() { + var span; + span = document.createElement('span'); + span.appendChild(document.createTextNode(' ')); + return span; + }, + insertBefore: function(node, other) { + var log; + if (other) { + return other.parentNode.insertBefore(node, other); + } else { + log = document.getElementById('log'); + return log.insertBefore(node, log.firstChild); + } + }, + insertAfter: function(node, other) { + if (other.nextSibling) { + return this.insertBefore(node, other.nextSibling); + } else { + return this.appendTo(node, other.parentNode); + } + }, + prependTo: function(node, other) { + if (other.firstChild) { + return other.insertBefore(node, other.firstChild); + } else { + return appendTo(node, other); + } + }, + appendTo: function(node, other) { + return other.appendChild(node); + }, + addClass: function(classes, string) { + if (classes != null ? classes.indexOf(string) : void 0) { + return; + } + if (classes) { + return "" + classes + " " + string; + } else { + return string; + } + } +}); + +window.Log = Log; diff --git a/assets/scripts/app/views/accounts-info.coffee b/assets/scripts/app/views/accounts-info.coffee new file mode 100644 index 00000000..e2b8a067 --- /dev/null +++ b/assets/scripts/app/views/accounts-info.coffee @@ -0,0 +1,11 @@ +BasicView = Travis.BasicView + +View = BasicView.extend + templateName: 'profile/tabs/user' + userBinding: 'controller.user' + + gravatarUrl: (-> + "#{location.protocol}//www.gravatar.com/avatar/#{@get('user.gravatarId')}?s=200&d=mm" + ).property('user.gravatarId') + +AccountsInfoView = View diff --git a/assets/scripts/app/views/accounts-list.coffee b/assets/scripts/app/views/accounts-list.coffee new file mode 100644 index 00000000..6a0ee89e --- /dev/null +++ b/assets/scripts/app/views/accounts-list.coffee @@ -0,0 +1,30 @@ +accountUrl = Travis.Urls.account + +View = Ember.CollectionView.extend + elementId: 'accounts' + accountBinding: 'content' + tagName: 'ul' + + emptyView: Ember.View.extend + template: Ember.Handlebars.compile('
Loading
') + + itemViewClass: Ember.View.extend + accountBinding: 'content' + typeBinding: 'content.type' + selectedBinding: 'account.selected' + + classNames: ['account'] + classNameBindings: ['type', 'selected'] + + name: (-> + @get('content.name') || @get('content.login') + ).property('content.login', 'content.name') + + urlAccount: (-> + accountUrl(@get('account.login')) + ).property('account.login') + + click: -> + @get('controller').transitionToRoute("account", @get('account.login')) + +AccountsListView = View diff --git a/assets/scripts/app/views/accounts.coffee b/assets/scripts/app/views/accounts.coffee deleted file mode 100644 index 5d479445..00000000 --- a/assets/scripts/app/views/accounts.coffee +++ /dev/null @@ -1,34 +0,0 @@ -@Travis.reopen - ProfileAccountsView: Travis.BasicView.extend - tabBinding: 'controller.tab' - templateName: 'profile/accounts' - classAccounts: (-> - 'active' if @get('tab') == 'accounts' - ).property('tab') - - AccountsListView: Em.CollectionView.extend - elementId: 'accounts' - accountBinding: 'content' - tagName: 'ul' - - emptyView: Ember.View.extend - template: Ember.Handlebars.compile('
Loading
') - - itemViewClass: Travis.BasicView.extend - accountBinding: 'content' - typeBinding: 'content.type' - selectedBinding: 'account.selected' - - classNames: ['account'] - classNameBindings: ['type', 'selected'] - - name: (-> - @get('content.name') || @get('content.login') - ).property('content.login', 'content.name') - - urlAccount: (-> - Travis.Urls.account(@get('account.login')) - ).property('account.login') - - click: -> - @get('controller').transitionToRoute("account", @get('account.login')) diff --git a/assets/scripts/app/views/annotation.coffee b/assets/scripts/app/views/annotation.coffee index b3afe483..3ae89392 100644 --- a/assets/scripts/app/views/annotation.coffee +++ b/assets/scripts/app/views/annotation.coffee @@ -1,4 +1,6 @@ -Travis.reopen - AnnotationsView: Travis.BasicView.extend - templateName: 'annotations/list' +BasicView = Travis.BasicView +View = BasicView.extend + templateName: 'annotations/list' + +Travis.AnnotationsView = View diff --git a/assets/scripts/app/views/annotations.coffee b/assets/scripts/app/views/annotations.coffee index ac8376a0..5045bd7d 100644 --- a/assets/scripts/app/views/annotations.coffee +++ b/assets/scripts/app/views/annotations.coffee @@ -1,2 +1,3 @@ -Travis.reopen - AnnotationsView: Travis.BasicView.extend +View = Ember.View.extend() + +Travis.AnnotationsView = View diff --git a/assets/scripts/app/views/application.coffee b/assets/scripts/app/views/application.coffee index fd595908..f6581f30 100644 --- a/assets/scripts/app/views/application.coffee +++ b/assets/scripts/app/views/application.coffee @@ -1,17 +1,19 @@ -Travis.reopen - ApplicationView: Travis.BasicView.extend - classNames: ['application'] - click: (event) -> - # TODO: this solves the case of closing menus and popups, - # but I would like to rewrite it later, not sure how - # yet, but this does not seem optimal - targetAndParents = $(event.target).parents().andSelf() - if ! ( targetAndParents.hasClass('open-popup') || targetAndParents.hasClass('popup') ) - @popupCloseAll() +BasicView = Travis.BasicView - # TODO: I needed to add second check to this conditional, because for some reason - # event.stopPropagation() in menu() function in RepoShowToolsView does - # not prevent calling following code - if ! targetAndParents.hasClass('menu') && !targetAndParents.is('#tools > a') - $('.menu').removeClass('display') +View = BasicView.extend + classNames: ['application'] + click: (event) -> + # TODO: this solves the case of closing menus and popups, + # but I would like to rewrite it later, not sure how + # yet, but this does not seem optimal + targetAndParents = $(event.target).parents().andSelf() + if ! ( targetAndParents.hasClass('open-popup') || targetAndParents.hasClass('popup') ) + @popupCloseAll() + # TODO: I needed to add second check to this conditional, because for some reason + # event.stopPropagation() in menu() function in RepoShowToolsView does + # not prevent calling following code + if ! targetAndParents.hasClass('menu') && !targetAndParents.is('#tools > a') + $('.menu').removeClass('display') + +ApplicationView = View diff --git a/assets/scripts/app/views/build.coffee b/assets/scripts/app/views/build.coffee index 1ef531c9..1e062f38 100644 --- a/assets/scripts/app/views/build.coffee +++ b/assets/scripts/app/views/build.coffee @@ -1,12 +1,13 @@ colorForState = Travis.Helpers.colorForState +BasicView = Travis.BasicView -View = Travis.BasicView.extend - classNameBindings: ['color', 'loading'] - buildBinding: 'controller.build' - loadingBinding: 'controller.loading' +View = BasicView.extend + classNameBindings: ['color', 'loading'] + buildBinding: 'controller.build' + loadingBinding: 'controller.loading' - color: (-> - colorForState(@get('build.state')) - ).property('build.state') + color: (-> + colorForState(@get('build.state')) + ).property('build.state') Travis.BuildView = View diff --git a/assets/scripts/app/views/dashboard.coffee b/assets/scripts/app/views/dashboard.coffee index 3cc467af..09081a55 100644 --- a/assets/scripts/app/views/dashboard.coffee +++ b/assets/scripts/app/views/dashboard.coffee @@ -1,8 +1,6 @@ require 'views/basic' -TravisView = Travis.BasicView - -View = TravisView.extend +View = Ember.View.extend layoutName: 'layouts/dashboard' classNames: ['dashboard'] diff --git a/assets/scripts/app/views/first-sync.coffee b/assets/scripts/app/views/first-sync.coffee index 88c61a0f..18934520 100644 --- a/assets/scripts/app/views/first-sync.coffee +++ b/assets/scripts/app/views/first-sync.coffee @@ -1,4 +1,6 @@ -View = Travis.BasicView.extend +BasicView = Travis.BasicView + +View = BasicView.extend layoutName: 'layouts/simple' Travis.FirstSyncView = View diff --git a/assets/scripts/app/views/flash-item.coffee b/assets/scripts/app/views/flash-item.coffee new file mode 100644 index 00000000..7ae2bc66 --- /dev/null +++ b/assets/scripts/app/views/flash-item.coffee @@ -0,0 +1,15 @@ +BasicView = Travis.BasicView + +View = BasicView.extend + tagName: 'li' + classNameBindings: ['type'] + + type: (-> + @get('flash.type') || 'broadcast' + ).property('flash.type') + + actions: + close: -> + @get('controller').close(@get('flash')) + +FlashItemView = View diff --git a/assets/scripts/app/views/flash.coffee b/assets/scripts/app/views/flash.coffee index b1fe7451..7bad9961 100644 --- a/assets/scripts/app/views/flash.coffee +++ b/assets/scripts/app/views/flash.coffee @@ -1,17 +1,8 @@ -@Travis.reopen - FlashView: Travis.BasicView.extend - classNames: ['flash'] - tagName: 'ul' - templateName: 'layouts/flash' +BasicView = Travis.BasicView - FlashItemView: Travis.BasicView.extend - tagName: 'li' - classNameBindings: ['type'] +View = BasicView.extend + classNames: ['flash'] + tagName: 'ul' + templateName: 'layouts/flash' - type: (-> - @get('flash.type') || 'broadcast' - ).property('flash.type') - - actions: - close: -> - @get('controller').close(@get('flash')) +Travis.FlashView = View diff --git a/assets/scripts/app/views/hooks.coffee b/assets/scripts/app/views/hooks.coffee new file mode 100644 index 00000000..bdca93a9 --- /dev/null +++ b/assets/scripts/app/views/hooks.coffee @@ -0,0 +1,12 @@ +BasicView = Travis.BasicView +githubAdminUrl = Travis.Urls.githubAdmin + +View = BasicView.extend + templateName: 'profile/tabs/hooks' + userBinding: 'controller.user' + + urlGithubAdmin: (-> + githubAdminUrl(@get('hook.slug')) + ).property('hook.slug') + +HooksView = View diff --git a/assets/scripts/app/views/jobs-item.coffee b/assets/scripts/app/views/jobs-item.coffee index 77fff83d..e9ca8e8d 100644 --- a/assets/scripts/app/views/jobs-item.coffee +++ b/assets/scripts/app/views/jobs-item.coffee @@ -1,11 +1,14 @@ -View = Travis.BasicView.extend +colorForState = Travis.Helpers.colorForState +BasicView = Travis.BasicView + +View = BasicView.extend tagName: 'tr' classNameBindings: ['color'] repoBinding: 'context.repo' jobBinding: 'context' color: (-> - Travis.Helpers.colorForState(@get('job.state')) + colorForState(@get('job.state')) ).property('job.state') Travis.JobsItemView = View diff --git a/assets/scripts/app/views/left.coffee b/assets/scripts/app/views/left.coffee deleted file mode 100644 index 02c9eba9..00000000 --- a/assets/scripts/app/views/left.coffee +++ /dev/null @@ -1,20 +0,0 @@ -@Travis.reopen - ReposView: Travis.BasicView.extend - templateName: 'repos/list' - tabBinding: 'controller.tab' - - classRecent: (-> - 'active' if @get('tab') == 'recent' - ).property('tab') - - classOwned: (-> - classes = [] - classes.push('active') if @get('tab') == 'owned' - classes.push('display') if @get('controller.currentUser') - classes.join(' ') - ).property('tab', 'controller.currentUser') - - classSearch: (-> - 'active' if @get('tab') == 'search' - ).property('tab') - diff --git a/assets/scripts/app/views/log.coffee b/assets/scripts/app/views/log.coffee index c0241462..9b6a0a36 100644 --- a/assets/scripts/app/views/log.coffee +++ b/assets/scripts/app/views/log.coffee @@ -1,153 +1,35 @@ -require 'log' -require 'utils/lines-selector' -require 'utils/log-folder' +BasicView = Travis.BasicView Log.DEBUG = false Log.LIMIT = 10000 - config = ENV.config -Travis.reopen - LogView: Travis.BasicView.extend - templateName: 'jobs/log' - logBinding: 'job.log' +View = BasicView.extend + templateName: 'jobs/log' + logBinding: 'job.log' - didInsertElement: -> - @setupLog() + didInsertElement: -> + @setupLog() - logDidChange: (-> - @setupLog() - ).observes('log') + logDidChange: (-> + @setupLog() + ).observes('log') - logWillChange: (-> - @teardownLog() - ).observesBefore('log') + logWillChange: (-> + @teardownLog() + ).observesBefore('log') - willDestroyElement: -> - @teardownLog() + willDestroyElement: -> + @teardownLog() - teardownLog: -> - job = @get('job') - job.unsubscribe() if job + teardownLog: -> + job = @get('job') + job.unsubscribe() if job - setupLog: -> - job = @get('job') - if job - job.get('log').fetch() - job.subscribe() + setupLog: -> + job = @get('job') + if job + job.get('log').fetch() + job.subscribe() - PreView: Em.View.extend - templateName: 'jobs/pre' - - logWillChange: (-> - console.log 'log view: log will change' if Log.DEBUG - @teardownLog() - ).observesBefore('log') - - didInsertElement: -> - console.log 'log view: did insert' if Log.DEBUG - @_super.apply this, arguments - @createEngine() - - willDestroyElement: -> - console.log 'log view: will destroy' if Log.DEBUG - @teardownLog() - - versionDidChange: (-> - @rerender() if @get('_state') == 'inDOM' - ).observes('log.version') - - logDidChange: (-> - console.log 'log view: log did change: rerender' if Log.DEBUG - - if @get('log') - @createEngine() - @rerender() if @get('_state') == 'inDOM' - ).observes('log') - - teardownLog: -> - if log = @get('log') - parts = log.get('parts') - parts.removeArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop') - parts.destroy() - log.notifyPropertyChange('parts') - @lineSelector?.willDestroy() - - createEngine: -> - if @get('log') - console.log 'log view: create engine' if Log.DEBUG - @scroll = new Log.Scroll beforeScroll: => - @unfoldHighlight() - @engine = Log.create(limit: Log.LIMIT, listeners: [@scroll]) - @logFolder = new Travis.LogFolder(@$().find('#log')) - @lineSelector = new Travis.LinesSelector(@$().find('#log'), @scroll, @logFolder) - @observeParts() - - unfoldHighlight: -> - @lineSelector.unfoldLines() - - observeParts: -> - if log = @get('log') - parts = log.get('parts') - parts.addArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop') - parts = parts.slice(0) - @partsDidChange(parts, 0, null, parts.length) - - partsDidChange: (parts, start, _, added) -> - console.log 'log view: parts did change' if Log.DEBUG - for part, i in parts.slice(start, start + added) - # console.log "limit in log view: #{@get('limited')}" - break if @get('limited') - @engine.set(part.number, part.content) - @propertyDidChange('limited') - - limited: (-> - @engine?.limit?.limited - ).property() - - plainTextLogUrl: (-> - if id = @get('log.job.id') - url = Travis.Urls.plainTextLog(id) - if config.pro - url += "&access_token=#{@get('job.log.token')}" - url - ).property('job.log.id', 'job.log.token') - - actions: - toTop: () -> - $(window).scrollTop(0) - - toggleTailing: -> - Travis.tailing.toggle() - @engine.autoCloseFold = !Travis.tailing.isActive() - event.preventDefault() - - noop: -> # TODO required? - -Log.Scroll = (options) -> - options ||= {} - @beforeScroll = options.beforeScroll - this -Log.Scroll.prototype = $.extend new Log.Listener, - insert: (log, data, pos) -> - @tryScroll() if @numbers - true - - tryScroll: -> - if element = $("#log p:visible.highlight:first") - if @beforeScroll - @beforeScroll() - $('#main').scrollTop(0) - $('html, body').scrollTop(element.offset()?.top - (window.innerHeight / 3)) # weird, html works in chrome, body in firefox - -# Log.Logger = -> -# Log.Logger.prototype = $.extend new Log.Listener, -# receive: (log, num, string) -> -# @log("rcv #{num} #{JSON.stringify(string)}") -# true -# insert: (log, element, pos) -> -# @log("ins #{element.id}, #{if pos.before then 'before' else 'after'}: #{pos.before || pos.after || '?'}, #{JSON.stringify(element)}") -# remove: (log, element) -> -# @log("rem #{element.id}") -# log: (line) -> -# console.log(line) +Travis.LogView = View diff --git a/assets/scripts/app/views/pre.coffee b/assets/scripts/app/views/pre.coffee new file mode 100644 index 00000000..d7bb8d48 --- /dev/null +++ b/assets/scripts/app/views/pre.coffee @@ -0,0 +1,113 @@ +require 'utils/lines-selector' +require 'utils/log-folder' + +config = ENV.config +plainTextLogUrl = Travis.Urls.plainTextLog +LogFolder = Travis.LogFolder +LinesSelector = Travis.LinesSelector + +Log.Scroll = (options) -> + options ||= {} + @beforeScroll = options.beforeScroll + this +Log.Scroll.prototype = $.extend new Log.Listener, + insert: (log, data, pos) -> + @tryScroll() if @numbers + true + + tryScroll: -> + if element = $("#log p:visible.highlight:first") + if @beforeScroll + @beforeScroll() + $('#main').scrollTop(0) + $('html, body').scrollTop(element.offset()?.top - (window.innerHeight / 3)) # weird, html works in chrome, body in firefox + +View = Ember.View.extend + templateName: 'jobs/pre' + + logWillChange: (-> + console.log 'log view: log will change' if Log.DEBUG + @teardownLog() + ).observesBefore('log') + + didInsertElement: -> + console.log 'log view: did insert' if Log.DEBUG + @_super.apply this, arguments + @createEngine() + + willDestroyElement: -> + console.log 'log view: will destroy' if Log.DEBUG + @teardownLog() + + versionDidChange: (-> + @rerender() if @get('_state') == 'inDOM' + ).observes('log.version') + + logDidChange: (-> + console.log 'log view: log did change: rerender' if Log.DEBUG + + if @get('log') + @createEngine() + @rerender() if @get('_state') == 'inDOM' + ).observes('log') + + teardownLog: -> + if log = @get('log') + parts = log.get('parts') + parts.removeArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop') + parts.destroy() + log.notifyPropertyChange('parts') + @lineSelector?.willDestroy() + + createEngine: -> + if @get('log') + console.log 'log view: create engine' if Log.DEBUG + @scroll = new Log.Scroll beforeScroll: => + @unfoldHighlight() + @engine = Log.create(limit: Log.LIMIT, listeners: [@scroll]) + @logFolder = new LogFolder(@$().find('#log')) + @lineSelector = new LinesSelector(@$().find('#log'), @scroll, @logFolder) + @observeParts() + + unfoldHighlight: -> + @lineSelector.unfoldLines() + + observeParts: -> + if log = @get('log') + parts = log.get('parts') + parts.addArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop') + parts = parts.slice(0) + @partsDidChange(parts, 0, null, parts.length) + + partsDidChange: (parts, start, _, added) -> + console.log 'log view: parts did change' if Log.DEBUG + for part, i in parts.slice(start, start + added) + # console.log "limit in log view: #{@get('limited')}" + break if @get('limited') + @engine.set(part.number, part.content) + @propertyDidChange('limited') + + limited: (-> + @engine?.limit?.limited + ).property() + + plainTextLogUrl: (-> + if id = @get('log.job.id') + url = plainTextLogUrl(id) + if config.pro + url += "&access_token=#{@get('job.log.token')}" + url + ).property('job.log.id', 'job.log.token') + + actions: + toTop: () -> + $(window).scrollTop(0) + + toggleTailing: -> + Travis.tailing.toggle() + @engine.autoCloseFold = !Travis.tailing.isActive() + event.preventDefault() + + noop: -> # TODO required? + +Travis.PreView = View diff --git a/assets/scripts/app/views/profile-accounts.coffee b/assets/scripts/app/views/profile-accounts.coffee new file mode 100644 index 00000000..c76b8e47 --- /dev/null +++ b/assets/scripts/app/views/profile-accounts.coffee @@ -0,0 +1,11 @@ +BasicView = Travis.BasicView + +View = BasicView.extend + tabBinding: 'controller.tab' + templateName: 'profile/accounts' + classAccounts: (-> + 'active' if @get('tab') == 'accounts' + ).property('tab') + + +ProfileAccountsView = View diff --git a/assets/scripts/app/views/profile-tabs.coffee b/assets/scripts/app/views/profile-tabs.coffee new file mode 100644 index 00000000..fda52920 --- /dev/null +++ b/assets/scripts/app/views/profile-tabs.coffee @@ -0,0 +1,22 @@ +BasicView = Travis.BasicView + +View = BasicView.extend + templateName: 'profile/tabs' + tabBinding: 'controller.tab' + + activate: -> + @get('controller').activate(event.target.name) + + classHooks: (-> + 'active' if @get('tab') == 'hooks' + ).property('tab') + + classUser: (-> + 'active' if @get('tab') == 'user' + ).property('tab') + + displayUser: (-> + @get('controller.account.login') == @get('controller.user.login') + ).property('controller.account.login', 'controller.user.login') + +ProfileTabsView = View diff --git a/assets/scripts/app/views/profile.coffee b/assets/scripts/app/views/profile.coffee index dadf0518..cb59eb84 100644 --- a/assets/scripts/app/views/profile.coffee +++ b/assets/scripts/app/views/profile.coffee @@ -1,47 +1,15 @@ -Travis.reopen - ProfileView: Travis.BasicView.extend - templateName: 'profile/show' - layoutName: 'layouts/profile' - classNames: ['profile-view'] - accountBinding: 'controller.account' - subscribedBinding: 'account.subscribed' - educationBinding: 'account.education' +BasicView = Travis.BasicView - name: (-> - @get('account.name') || @get('account.login') - ).property('account.name', 'account.login') +View = BasicView.extend + templateName: 'profile/show' + layoutName: 'layouts/profile' + classNames: ['profile-view'] + accountBinding: 'controller.account' + subscribedBinding: 'account.subscribed' + educationBinding: 'account.education' - ProfileTabsView: Travis.BasicView.extend - templateName: 'profile/tabs' - tabBinding: 'controller.tab' + name: (-> + @get('account.name') || @get('account.login') + ).property('account.name', 'account.login') - activate: -> - @get('controller').activate(event.target.name) - - classHooks: (-> - 'active' if @get('tab') == 'hooks' - ).property('tab') - - classUser: (-> - 'active' if @get('tab') == 'user' - ).property('tab') - - displayUser: (-> - @get('controller.account.login') == @get('controller.user.login') - ).property('controller.account.login', 'controller.user.login') - - HooksView: Travis.BasicView.extend - templateName: 'profile/tabs/hooks' - userBinding: 'controller.user' - - urlGithubAdmin: (-> - Travis.Urls.githubAdmin(@get('hook.slug')) - ).property('hook.slug') - - AccountsInfoView: Travis.BasicView.extend - templateName: 'profile/tabs/user' - userBinding: 'controller.user' - - gravatarUrl: (-> - "#{location.protocol}//www.gravatar.com/avatar/#{@get('user.gravatarId')}?s=200&d=mm" - ).property('user.gravatarId') +ProfileView = View diff --git a/assets/scripts/app/views/repo.coffee b/assets/scripts/app/views/repo.coffee index 9f8c309d..58ce2672 100644 --- a/assets/scripts/app/views/repo.coffee +++ b/assets/scripts/app/views/repo.coffee @@ -1,8 +1,9 @@ statusImage = Travis.Urls.statusImage StatusImagesView = Travis.StatusImagesView config = ENV.config +BasicView = Travis.BasicView -View = Travis.BasicView.extend +View = BasicView.extend reposBinding: 'controllers.repos' repoBinding: 'controller.repo' buildBinding: 'controller.build' @@ -23,11 +24,11 @@ View = Travis.BasicView.extend statusImages: () -> @popupCloseAll() view = StatusImagesView.create(toolsView: this) - Travis.BasicView.currentPopupView = view + BasicView.currentPopupView = view view.appendTo($('body')) return false - ReposEmptyView: Travis.BasicView.extend + ReposEmptyView: BasicView.extend template: (-> if config.pro 'pro/repos/show/empty' diff --git a/assets/scripts/app/views/repos-list.coffee b/assets/scripts/app/views/repos-list.coffee index 4d38d6ba..a4e7c6ee 100644 --- a/assets/scripts/app/views/repos-list.coffee +++ b/assets/scripts/app/views/repos-list.coffee @@ -1,6 +1,6 @@ colorForState = Travis.Helpers.colorForState -View = Em.CollectionView.extend +View = Ember.CollectionView.extend elementId: 'repos' tagName: 'ul' diff --git a/assets/scripts/app/views/signin.coffee b/assets/scripts/app/views/signin.coffee index 3365fcfa..b6e975db 100644 --- a/assets/scripts/app/views/signin.coffee +++ b/assets/scripts/app/views/signin.coffee @@ -1,3 +1,6 @@ -@Travis.reopen - SigninView: Travis.BasicView.extend - templateName: 'auth/signin' +BasicView = Travis.BasicView + +View = BasicView.extend + templateName: 'auth/signin' + +Travis.SigninView = View diff --git a/assets/scripts/app/views/stats.coffee b/assets/scripts/app/views/stats.coffee deleted file mode 100644 index 7043e232..00000000 --- a/assets/scripts/app/views/stats.coffee +++ /dev/null @@ -1,73 +0,0 @@ -@Travis.reopen - StatsView: Travis.BasicView.extend - templateName: 'stats/show' - didInsertElement: -> - # @renderChart(config) for name, config of @CHARTS - - renderChart: (config) -> - chart = new Highcharts.Chart(config) - @fetch config.source, (data) -> - stats = (config.map(stats) for stats in data.stats) - chart.series[0].setData(stats) - - fetch: (url, callback) -> - $.ajax - type: 'GET' - url: url - accepts: { json: 'application/vnd.travis-ci.2+json' } - success: callback - - CHARTS: - repos: - source: '/api/stats/repos' - total: 0 - map: (data) -> - [Date.parse(data.date), @total += parseInt(data.count)] - chart: - renderTo: "repos_stats" - title: - text: "Total Projects/Repositories" - xAxis: - type: "datetime" - dateTimeLabelFormats: # don't display the dummy year - month: "%e. %b" - year: "%b" - yAxis: - title: - text: "Count" - min: 0 - tooltip: - formatter: -> - Highcharts.dateFormat("%e. %b", @x) + ": " + @y + " repos" - series: [ - name: "Repository Growth" - data: [] - ] - - builds: - source: '/api/stats/tests' - map: (data) -> - [Date.parse(data.date), parseInt(data.count)] - chart: - renderTo: "tests_stats" - type: "column" - title: - text: "Build Count" - subtitle: - text: "last month" - xAxis: - type: "datetime" - dateTimeLabelFormats: # don't display the dummy year - month: "%e. %b" - year: "%b" - yAxis: - title: - text: "Count" - min: 0 - tooltip: - formatter: -> - Highcharts.dateFormat("%e. %b", @x) + ": " + @y + " builds" - series: [ - name: "Total Builds" - data: [] - ] diff --git a/assets/scripts/app/views/status-image-input.coffee b/assets/scripts/app/views/status-image-input.coffee index dd8c4530..69b77117 100644 --- a/assets/scripts/app/views/status-image-input.coffee +++ b/assets/scripts/app/views/status-image-input.coffee @@ -1,3 +1,5 @@ -Travis.StatusImageInput = Em.TextArea.extend +View = Ember.TextArea.extend click: -> @get('element').select() + +Travis.StatusImageInput = View diff --git a/assets/scripts/app/views/status-images.coffee b/assets/scripts/app/views/status-images.coffee index f3e733e5..f851ad21 100644 --- a/assets/scripts/app/views/status-images.coffee +++ b/assets/scripts/app/views/status-images.coffee @@ -1,4 +1,6 @@ -Travis.StatusImagesView = Em.View.extend +format = Travis.StatusImageFormats.format + +View = Ember.View.extend templateName: 'status_images' elementId: 'status-images' classNames: ['popup'] @@ -46,6 +48,7 @@ Travis.StatusImagesView = Em.View.extend ).observes('repo.branches', 'repo.branches.isLoaded', 'build.commit.branch') statusString: (-> - Travis.StatusImageFormatter.format(@get('statusImageFormat'), @get('repo.slug'), @get('statusImageBranch.commit.branch')) + format(@get('statusImageFormat'), @get('repo.slug'), @get('statusImageBranch.commit.branch')) ).property('statusImageFormat', 'repo.slug', 'statusImageBranch.commit.branch') +Travis.StatusImagesView = View diff --git a/assets/scripts/app/views/top.coffee b/assets/scripts/app/views/top.coffee index 7ddcb7ce..be1fcc39 100644 --- a/assets/scripts/app/views/top.coffee +++ b/assets/scripts/app/views/top.coffee @@ -1,26 +1,28 @@ -@Travis.reopen - TopView: Travis.BasicView.extend - tabBinding: 'controller.tab' +BasicView = Travis.BasicView - # hrm. how to parametrize bind-attr? - classHome: (-> - 'active' if @get('tab') == 'home' - ).property('tab') +View = BasicView.extend + tabBinding: 'controller.tab' - classStats: (-> - 'active' if @get('tab') == 'stats' - ).property('tab') + # hrm. how to parametrize bind-attr? + classHome: (-> + 'active' if @get('tab') == 'home' + ).property('tab') - classProfile: (-> - classes = ['profile menu'] - classes.push('active') if @get('tab') == 'profile' - classes.push(@get('controller.auth.state') || 'signed-out') - classes.join(' ') - ).property('tab', 'controller.auth.state') + classStats: (-> + 'active' if @get('tab') == 'stats' + ).property('tab') - showProfile: -> - $('#top .profile ul').show() + classProfile: (-> + classes = ['profile menu'] + classes.push('active') if @get('tab') == 'profile' + classes.push(@get('controller.auth.state') || 'signed-out') + classes.join(' ') + ).property('tab', 'controller.auth.state') - hideProfile: -> - $('#top .profile ul').hide() + showProfile: -> + $('#top .profile ul').show() + hideProfile: -> + $('#top .profile ul').hide() + +Travis.TopView = View diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index c16a518f..dfcb1c21 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -182,8 +182,13 @@ require 'models/user' require 'models/env-var' require 'models/ssh-key' +require 'vendor/log' + require 'views/basic' -require 'views/accounts' +require 'views/flash-item' +require 'views/accounts-info' +require 'views/hooks' +require 'views/pre' require 'views/annotation' require 'views/application' require 'views/build' @@ -199,7 +204,7 @@ require 'views/repo-show-tools' require 'views/repo-show-tabs' require 'views/repo-actions' require 'views/profile' -require 'views/stats' +require 'views/profile-tabs' require 'views/signin' require 'views/top' require 'views/status-images' diff --git a/assets/scripts/vendor/log.js b/assets/scripts/vendor/log.js deleted file mode 100644 index 715e47b5..00000000 --- a/assets/scripts/vendor/log.js +++ /dev/null @@ -1,2 +0,0 @@ -minispade.register('log', "(function() {(function() {\n\n this.Log = function() {\n this.autoCloseFold = true;\n this.listeners = [];\n this.renderer = new Log.Renderer;\n this.children = new Log.Nodes(this);\n this.parts = {};\n this.folds = new Log.Folds(this);\n this.times = new Log.Times(this);\n return this;\n };\n\n Log.extend = function(one, other) {\n var name;\n for (name in other) {\n one[name] = other[name];\n }\n return one;\n };\n\n Log.extend(Log, {\n DEBUG: true,\n SLICE: 500,\n TIMEOUT: 25,\n FOLD: /fold:(start|end):([\\w_\\-\\.]+)/,\n TIME: /time:(start|end):([\\w_\\-\\.]+):?([\\w_\\-\\.\\=\\,]*)/,\n create: function(options) {\n var listener, log, _i, _len, _ref;\n options || (options = {});\n log = new Log();\n if (options.limit) {\n log.listeners.push(log.limit = new Log.Limit(options.limit));\n }\n _ref = options.listeners || [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n listener = _ref[_i];\n log.listeners.push(listener);\n }\n return log;\n }\n });\nminispade.require('log/nodes');\n\n Log.prototype = Log.extend(new Log.Node, {\n set: function(num, string) {\n if (this.parts[num]) {\n return console.log(\"part \" + num + \" exists\");\n } else {\n this.parts[num] = true;\n return Log.Part.create(this, num, string);\n }\n },\n insert: function(data, pos) {\n this.trigger('insert', data, pos);\n return this.renderer.insert(data, pos);\n },\n remove: function(node) {\n this.trigger('remove', node);\n return this.renderer.remove(node);\n },\n hide: function(node) {\n this.trigger('hide', node);\n return this.renderer.hide(node);\n },\n trigger: function() {\n var args, ix, listener, _i, _len, _ref, _results;\n args = [this].concat(Array.prototype.slice.apply(arguments));\n _ref = this.listeners;\n _results = [];\n for (ix = _i = 0, _len = _ref.length; _i < _len; ix = ++_i) {\n listener = _ref[ix];\n _results.push(listener.notify.apply(listener, args));\n }\n return _results;\n }\n });\n\n Log.Listener = function() {};\n\n Log.extend(Log.Listener.prototype, {\n notify: function(log, event) {\n if (this[event]) {\n return this[event].apply(this, [log].concat(Array.prototype.slice.call(arguments, 2)));\n }\n }\n });\nminispade.require('log/folds');\nminispade.require('log/times');\nminispade.require('log/deansi');\nminispade.require('log/limit');\nminispade.require('log/renderer');\n\n}).call(this);\n\n})();\n//@ sourceURL=log");minispade.register('log/deansi', "(function() {(function() {\n\n Log.Deansi = {\n CLEAR_ANSI: /(?:\\033)(?:\\[0?c|\\[[0356]n|\\[7[lh]|\\[\\?25[lh]|\\(B|H|\\[(?:\\d+(;\\d+){,2})?G|\\[(?:[12])?[JK]|[DM]|\\[0K)/gm,\n apply: function(string) {\n var nodes,\n _this = this;\n if (!string) {\n return [];\n }\n string = string.replace(this.CLEAR_ANSI, '');\n nodes = ansiparse(string).map(function(part) {\n return _this.node(part);\n });\n return nodes;\n },\n node: function(part) {\n var classes, node;\n node = {\n type: 'span',\n text: part.text\n };\n if (classes = this.classes(part)) {\n node[\"class\"] = classes.join(' ');\n }\n return node;\n },\n classes: function(part) {\n var result;\n result = [];\n result = result.concat(this.colors(part));\n if (result.length > 0) {\n return result;\n }\n },\n colors: function(part) {\n var colors;\n colors = [];\n if (part.foreground) {\n colors.push(part.foreground);\n }\n if (part.background) {\n colors.push(\"bg-\" + part.background);\n }\n if (part.bold) {\n colors.push('bold');\n }\n if (part.italic) {\n colors.push('italic');\n }\n if (part.underline) {\n colors.push('underline');\n }\n return colors;\n },\n hidden: function(part) {\n if (part.text.match(/\\r/)) {\n part.text = part.text.replace(/^.*\\r/gm, '');\n return true;\n }\n }\n };\n\n}).call(this);\n\n})();\n//@ sourceURL=log/deansi");minispade.register('log/folds', "(function() {(function() {\n\n Log.Folds = function(log) {\n this.log = log;\n this.folds = {};\n return this;\n };\n\n Log.extend(Log.Folds.prototype, {\n add: function(data) {\n var fold, _base, _name;\n fold = (_base = this.folds)[_name = data.name] || (_base[_name] = new Log.Folds.Fold);\n fold.receive(data, {\n autoCloseFold: this.log.autoCloseFold\n });\n return fold.active;\n }\n });\n\n Log.Folds.Fold = function() {\n return this;\n };\n\n Log.extend(Log.Folds.Fold.prototype, {\n receive: function(data, options) {\n this[data.event] = data.id;\n if (this.start && this.end && !this.active) {\n return this.activate(options);\n }\n },\n activate: function(options) {\n var fragment, nextSibling, node, parentNode, toRemove, _i, _len, _ref;\n options || (options = {});\n if (Log.DEBUG) {\n console.log(\"F.n - activate \" + this.start);\n }\n toRemove = this.fold.parentNode;\n parentNode = toRemove.parentNode;\n nextSibling = toRemove.nextSibling;\n parentNode.removeChild(toRemove);\n fragment = document.createDocumentFragment();\n _ref = this.nodes;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n node = _ref[_i];\n fragment.appendChild(node);\n }\n this.fold.appendChild(fragment);\n parentNode.insertBefore(toRemove, nextSibling);\n this.fold.setAttribute('class', this.classes(options['autoCloseFold']));\n return this.active = true;\n },\n classes: function(autoCloseFold) {\n var classes;\n classes = this.fold.getAttribute('class').split(' ');\n classes.push('fold');\n if (!autoCloseFold) {\n classes.push('open');\n }\n if (this.fold.childNodes.length > 2) {\n classes.push('active');\n }\n return classes.join(' ');\n }\n });\n\n Object.defineProperty(Log.Folds.Fold.prototype, 'fold', {\n get: function() {\n return this._fold || (this._fold = document.getElementById(this.start));\n }\n });\n\n Object.defineProperty(Log.Folds.Fold.prototype, 'nodes', {\n get: function() {\n var node, nodes;\n node = this.fold;\n nodes = [];\n while ((node = node.nextSibling) && node.id !== this.end) {\n nodes.push(node);\n }\n return nodes;\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=log/folds");minispade.register('log/limit', "(function() {(function() {\n\n Log.Limit = function(max_lines) {\n this.max_lines = max_lines || 1000;\n return this;\n };\n\n Log.Limit.prototype = Log.extend(new Log.Listener, {\n count: 0,\n insert: function(log, node, pos) {\n if (node.type === 'paragraph' && !node.hidden) {\n return this.count += 1;\n }\n }\n });\n\n Object.defineProperty(Log.Limit.prototype, 'limited', {\n get: function() {\n return this.count >= this.max_lines;\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=log/limit");minispade.register('log/nodes', "(function() {(function() {\n var newLineAtTheEndRegexp, newLineRegexp, rRegexp, removeCarriageReturns;\n\n Log.Node = function(id, num) {\n this.id = id;\n this.num = num;\n this.key = Log.Node.key(this.id);\n this.children = new Log.Nodes(this);\n return this;\n };\n\n Log.extend(Log.Node, {\n key: function(id) {\n if (id) {\n return id.split('-').map(function(i) {\n return '000000'.concat(i).slice(-6);\n }).join('');\n }\n }\n });\n\n Log.extend(Log.Node.prototype, {\n addChild: function(node) {\n return this.children.add(node);\n },\n remove: function() {\n this.log.remove(this.element);\n return this.parent.children.remove(this);\n }\n });\n\n Object.defineProperty(Log.Node.prototype, 'log', {\n get: function() {\n var _ref;\n return this._log || (this._log = ((_ref = this.parent) != null ? _ref.log : void 0) || this.parent);\n }\n });\n\n Object.defineProperty(Log.Node.prototype, 'firstChild', {\n get: function() {\n return this.children.first;\n }\n });\n\n Object.defineProperty(Log.Node.prototype, 'lastChild', {\n get: function() {\n return this.children.last;\n }\n });\n\n Log.Nodes = function(parent) {\n if (parent) {\n this.parent = parent;\n }\n this.items = [];\n this.index = {};\n return this;\n };\n\n Log.extend(Log.Nodes.prototype, {\n add: function(item) {\n var ix, next, prev, _ref, _ref1;\n ix = this.position(item) || 0;\n this.items.splice(ix, 0, item);\n if (this.parent) {\n item.parent = this.parent;\n }\n prev = function(item) {\n while (item && !item.children.last) {\n item = item.prev;\n }\n return item != null ? item.children.last : void 0;\n };\n next = function(item) {\n while (item && !item.children.first) {\n item = item.next;\n }\n return item != null ? item.children.first : void 0;\n };\n if (item.prev = this.items[ix - 1] || prev((_ref = this.parent) != null ? _ref.prev : void 0)) {\n item.prev.next = item;\n }\n if (item.next = this.items[ix + 1] || next((_ref1 = this.parent) != null ? _ref1.next : void 0)) {\n item.next.prev = item;\n }\n return item;\n },\n remove: function(item) {\n this.items.splice(this.items.indexOf(item), 1);\n if (item.next) {\n item.next.prev = item.prev;\n }\n if (item.prev) {\n item.prev.next = item.next;\n }\n if (this.items.length === 0) {\n return this.parent.remove();\n }\n },\n position: function(item) {\n var ix, _i, _ref;\n for (ix = _i = _ref = this.items.length - 1; _i >= 0; ix = _i += -1) {\n if (this.items[ix].key < item.key) {\n return ix + 1;\n }\n }\n },\n indexOf: function() {\n return this.items.indexOf.apply(this.items, arguments);\n },\n slice: function() {\n return this.items.slice.apply(this.items, arguments);\n },\n each: function(func) {\n return this.items.slice().forEach(func);\n },\n map: function(func) {\n return this.items.map(func);\n }\n });\n\n Object.defineProperty(Log.Nodes.prototype, 'first', {\n get: function() {\n return this.items[0];\n }\n });\n\n Object.defineProperty(Log.Nodes.prototype, 'last', {\n get: function() {\n return this.items[this.length - 1];\n }\n });\n\n Object.defineProperty(Log.Nodes.prototype, 'length', {\n get: function() {\n return this.items.length;\n }\n });\n\n Log.Part = function(id, num, string) {\n Log.Node.apply(this, arguments);\n this.string = string || '';\n this.string = this.string.replace(/\\033\\[1000D/gm, '\\r');\n this.string = this.string.replace(/\\r+\\n/gm, '\\n');\n this.strings = this.string.split(/^/gm) || [];\n this.slices = ((function() {\n var _results;\n _results = [];\n while (this.strings.length > 0) {\n _results.push(this.strings.splice(0, Log.SLICE));\n }\n return _results;\n }).call(this));\n return this;\n };\n\n Log.extend(Log.Part, {\n create: function(log, num, string) {\n var part;\n part = new Log.Part(num.toString(), num, string);\n log.addChild(part);\n return part.process(0, -1);\n }\n });\n\n Log.Part.prototype = Log.extend(new Log.Node, {\n remove: function() {},\n process: function(slice, num) {\n var node, span, spans, string, _i, _j, _len, _len1, _ref, _ref1, _ref2, _ref3, _ref4,\n _this = this;\n _ref = this.slices[slice] || [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n string = _ref[_i];\n if ((_ref1 = this.log.limit) != null ? _ref1.limited : void 0) {\n return;\n }\n spans = [];\n _ref2 = Log.Deansi.apply(string);\n for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {\n node = _ref2[_j];\n span = Log.Span.create(this, \"\" + this.id + \"-\" + (num += 1), num, node.text, node[\"class\"]);\n span.render();\n spans.push(span);\n }\n if ((_ref3 = spans[0]) != null ? (_ref4 = _ref3.line) != null ? _ref4.cr : void 0 : void 0) {\n spans[0].line.clear();\n }\n }\n if (!(slice >= this.slices.length - 1)) {\n return setTimeout((function() {\n return _this.process(slice + 1, num);\n }), Log.TIMEOUT);\n }\n }\n });\n\n newLineAtTheEndRegexp = new RegExp(\"\\n$\");\n\n newLineRegexp = new RegExp(\"\\n\");\n\n rRegexp = new RegExp(\"\\r\");\n\n removeCarriageReturns = function(string) {\n var index;\n index = string.lastIndexOf(\"\\r\");\n if (index === -1) {\n return string;\n }\n return string.substr(index + 1);\n };\n\n Log.Span = function(id, num, text, classes) {\n var fold, time, _ref;\n Log.Node.apply(this, arguments);\n if (fold = text.match(Log.FOLD)) {\n this.fold = true;\n this.event = fold[1];\n this.text = this.name = fold[2];\n } else if (time = text.match(Log.TIME)) {\n this.time = true;\n this.event = time[1];\n this.name = time[2];\n this.stats = time[3];\n } else {\n this.text = text;\n this.text = removeCarriageReturns(this.text);\n this.text = this.text.replace(newLineAtTheEndRegexp, '');\n this.nl = !!((_ref = text[text.length - 1]) != null ? _ref.match(newLineRegexp) : void 0);\n this.cr = !!text.match(rRegexp);\n this[\"class\"] = this.cr && ['clears'] || classes;\n }\n return this;\n };\n\n Log.extend(Log.Span, {\n create: function(parent, id, num, text, classes) {\n var span;\n span = new Log.Span(id, num, text, classes);\n parent.addChild(span);\n return span;\n },\n render: function(parent, id, num, text, classes) {\n var span;\n span = this.create(parent, id, num, text, classes);\n return span.render();\n }\n });\n\n Log.Span.prototype = Log.extend(new Log.Node, {\n render: function() {\n var tail;\n if (this.time && this.event === 'end' && this.prev) {\n if (Log.DEBUG) {\n console.log(\"S.0 insert \" + this.id + \" after prev \" + this.prev.id);\n }\n this.nl = this.prev.nl;\n this.log.insert(this.data, {\n after: this.prev.element\n });\n this.line = this.prev.line;\n } else if (!this.fold && this.prev && !this.prev.fold && !this.prev.nl) {\n if (Log.DEBUG) {\n console.log(\"S.1 insert \" + this.id + \" after prev \" + this.prev.id);\n }\n this.log.insert(this.data, {\n after: this.prev.element\n });\n this.line = this.prev.line;\n } else if (!this.fold && this.next && !this.next.fold && !this.next.time) {\n if (Log.DEBUG) {\n console.log(\"S.2 insert \" + this.id + \" before next \" + this.next.id);\n }\n this.log.insert(this.data, {\n before: this.next.element\n });\n this.line = this.next.line;\n } else {\n this.line = Log.Line.create(this.log, [this]);\n this.line.render();\n }\n if (this.nl && (tail = this.tail).length > 0) {\n this.split(tail);\n }\n if (this.time) {\n return this.log.times.add(this);\n }\n },\n remove: function() {\n Log.Node.prototype.remove.apply(this);\n if (this.line) {\n return this.line.remove(this);\n }\n },\n split: function(spans) {\n var line, span, _i, _len;\n if (Log.DEBUG) {\n console.log(\"S.4 split [\" + (spans.map(function(span) {\n return span.id;\n }).join(', ')) + \"]\");\n }\n for (_i = 0, _len = spans.length; _i < _len; _i++) {\n span = spans[_i];\n this.log.remove(span.element);\n }\n line = Log.Line.create(this.log, spans);\n line.render();\n if (line.cr) {\n return line.clear();\n }\n },\n clear: function() {\n if (this.prev && this.isSibling(this.prev) && this.isSequence(this.prev)) {\n this.prev.clear();\n return this.prev.remove();\n }\n },\n isSequence: function(other) {\n return this.parent.num - other.parent.num === this.log.children.indexOf(this.parent) - this.log.children.indexOf(other.parent);\n },\n isSibling: function(other) {\n var _ref, _ref1;\n return ((_ref = this.element) != null ? _ref.parentNode : void 0) === ((_ref1 = other.element) != null ? _ref1.parentNode : void 0);\n },\n siblings: function(type) {\n var siblings, span;\n siblings = [];\n while ((span = (span || this)[type]) && this.isSibling(span)) {\n siblings.push(span);\n }\n return siblings;\n }\n });\n\n Object.defineProperty(Log.Span.prototype, 'data', {\n get: function() {\n return {\n id: this.id,\n type: 'span',\n text: this.text,\n \"class\": this[\"class\"],\n time: this.time\n };\n }\n });\n\n Object.defineProperty(Log.Span.prototype, 'line', {\n get: function() {\n return this._line;\n },\n set: function(line) {\n if (this.line) {\n this.line.remove(this);\n }\n this._line = line;\n if (this.line) {\n return this.line.add(this);\n }\n }\n });\n\n Object.defineProperty(Log.Span.prototype, 'element', {\n get: function() {\n return document.getElementById(this.id);\n }\n });\n\n Object.defineProperty(Log.Span.prototype, 'head', {\n get: function() {\n return this.siblings('prev').reverse();\n }\n });\n\n Object.defineProperty(Log.Span.prototype, 'tail', {\n get: function() {\n return this.siblings('next');\n }\n });\n\n Log.Line = function(log) {\n this.log = log;\n this.spans = [];\n return this;\n };\n\n Log.extend(Log.Line, {\n create: function(log, spans) {\n var line, span, _i, _len;\n if ((span = spans[0]) && span.fold) {\n line = new Log.Fold(log, span.event, span.name);\n } else {\n line = new Log.Line(log);\n }\n for (_i = 0, _len = spans.length; _i < _len; _i++) {\n span = spans[_i];\n span.line = line;\n }\n return line;\n }\n });\n\n Log.extend(Log.Line.prototype, {\n add: function(span) {\n var ix;\n if (span.cr) {\n this.cr = true;\n }\n if (this.spans.indexOf(span) > -1) {\n\n } else if ((ix = this.spans.indexOf(span.prev)) > -1) {\n return this.spans.splice(ix + 1, 0, span);\n } else if ((ix = this.spans.indexOf(span.next)) > -1) {\n return this.spans.splice(ix, 0, span);\n } else {\n return this.spans.push(span);\n }\n },\n remove: function(span) {\n var ix;\n if ((ix = this.spans.indexOf(span)) > -1) {\n return this.spans.splice(ix, 1);\n }\n },\n render: function() {\n var fold;\n if ((fold = this.prev) && fold.event === 'start' && fold.active) {\n if (this.next && !this.next.fold) {\n if (Log.DEBUG) {\n console.log(\"L.0 insert \" + this.id + \" before next \" + this.next.id);\n }\n return this.element = this.log.insert(this.data, {\n before: this.next.element\n });\n } else {\n if (Log.DEBUG) {\n console.log(\"L.0 insert \" + this.id + \" into fold \" + fold.id);\n }\n fold = this.log.folds.folds[fold.name].fold;\n return this.element = this.log.insert(this.data, {\n into: fold\n });\n }\n } else if (this.prev) {\n if (Log.DEBUG) {\n console.log(\"L.1 insert \" + this.spans[0].id + \" after prev \" + this.prev.id);\n }\n return this.element = this.log.insert(this.data, {\n after: this.prev.element\n });\n } else if (this.next) {\n if (Log.DEBUG) {\n console.log(\"L.2 insert \" + this.spans[0].id + \" before next \" + this.next.id);\n }\n return this.element = this.log.insert(this.data, {\n before: this.next.element\n });\n } else {\n if (Log.DEBUG) {\n console.log(\"L.3 insert \" + this.spans[0].id + \" into #log\");\n }\n return this.element = this.log.insert(this.data);\n }\n },\n clear: function() {\n var cr, _i, _len, _ref, _results;\n _ref = this.crs;\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n cr = _ref[_i];\n _results.push(cr.clear());\n }\n return _results;\n }\n });\n\n Object.defineProperty(Log.Line.prototype, 'id', {\n get: function() {\n var _ref;\n return (_ref = this.spans[0]) != null ? _ref.id : void 0;\n }\n });\n\n Object.defineProperty(Log.Line.prototype, 'data', {\n get: function() {\n return {\n type: 'paragraph',\n nodes: this.nodes\n };\n }\n });\n\n Object.defineProperty(Log.Line.prototype, 'nodes', {\n get: function() {\n return this.spans.map(function(span) {\n return span.data;\n });\n }\n });\n\n Object.defineProperty(Log.Line.prototype, 'prev', {\n get: function() {\n var _ref;\n return (_ref = this.spans[0].prev) != null ? _ref.line : void 0;\n }\n });\n\n Object.defineProperty(Log.Line.prototype, 'next', {\n get: function() {\n var _ref;\n return (_ref = this.spans[this.spans.length - 1].next) != null ? _ref.line : void 0;\n }\n });\n\n Object.defineProperty(Log.Line.prototype, 'crs', {\n get: function() {\n return this.spans.filter(function(span) {\n return span.cr;\n });\n }\n });\n\n Log.Fold = function(log, event, name) {\n Log.Line.apply(this, arguments);\n this.fold = true;\n this.event = event;\n this.name = name;\n return this;\n };\n\n Log.Fold.prototype = Log.extend(new Log.Line, {\n render: function() {\n var element, _ref;\n if (this.prev && this.prev.element) {\n if (Log.DEBUG) {\n console.log(\"F.1 insert \" + this.id + \" after prev \" + this.prev.id);\n }\n element = this.prev.element;\n this.element = this.log.insert(this.data, {\n after: element\n });\n } else if (this.next) {\n if (Log.DEBUG) {\n console.log(\"F.2 insert \" + this.id + \" before next \" + this.next.id);\n }\n element = this.next.element || this.next.element.parentNode;\n this.element = this.log.insert(this.data, {\n before: element\n });\n } else {\n if (Log.DEBUG) {\n console.log(\"F.3 insert \" + this.id);\n }\n this.element = this.log.insert(this.data);\n }\n if (this.span.next && ((_ref = this.span.prev) != null ? _ref.isSibling(this.span.next) : void 0)) {\n this.span.prev.split([this.span.next].concat(this.span.next.tail));\n }\n return this.active = this.log.folds.add(this.data);\n }\n });\n\n Object.defineProperty(Log.Fold.prototype, 'id', {\n get: function() {\n return \"fold-\" + this.event + \"-\" + this.name;\n }\n });\n\n Object.defineProperty(Log.Fold.prototype, 'span', {\n get: function() {\n return this.spans[0];\n }\n });\n\n Object.defineProperty(Log.Fold.prototype, 'data', {\n get: function() {\n return {\n type: 'fold',\n id: this.id,\n event: this.event,\n name: this.name\n };\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=log/nodes");minispade.register('log/renderer', "(function() {(function() {\n\n Log.Renderer = function() {\n this.frag = document.createDocumentFragment();\n this.para = this.createParagraph();\n this.span = this.createSpan();\n this.text = document.createTextNode('');\n this.fold = this.createFold();\n return this;\n };\n\n Log.extend(Log.Renderer.prototype, {\n insert: function(data, pos) {\n var after, before, into, node;\n node = this.render(data);\n if (into = pos != null ? pos.into : void 0) {\n if (typeof into === 'String') {\n into = document.getElementById(pos != null ? pos.into : void 0);\n }\n if (pos != null ? pos.prepend : void 0) {\n this.prependTo(node, into);\n } else {\n this.appendTo(node, into);\n }\n } else if (after = pos != null ? pos.after : void 0) {\n if (typeof after === 'String') {\n after = document.getElementById(pos);\n }\n this.insertAfter(node, after);\n } else if (before = pos != null ? pos.before : void 0) {\n if (typeof before === 'String') {\n before = document.getElementById(pos != null ? pos.before : void 0);\n }\n this.insertBefore(node, before);\n } else {\n this.insertBefore(node);\n }\n return node;\n },\n hide: function(node) {\n node.setAttribute('class', this.addClass(node.getAttribute('class'), 'hidden'));\n return node;\n },\n remove: function(node) {\n if (node) {\n node.parentNode.removeChild(node);\n }\n return node;\n },\n render: function(data) {\n var frag, node, type, _i, _len;\n if (data instanceof Array) {\n frag = this.frag.cloneNode(true);\n for (_i = 0, _len = data.length; _i < _len; _i++) {\n node = data[_i];\n node = this.render(node);\n if (node) {\n frag.appendChild(node);\n }\n }\n return frag;\n } else {\n data.type || (data.type = 'paragraph');\n type = data.type[0].toUpperCase() + data.type.slice(1);\n return this[\"render\" + type](data);\n }\n },\n renderParagraph: function(data) {\n var node, para, type, _i, _len, _ref;\n para = this.para.cloneNode(true);\n if (data.id) {\n para.setAttribute('id', data.id);\n }\n if (data.hidden) {\n para.setAttribute('style', 'display: none;');\n }\n _ref = data.nodes || [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n node = _ref[_i];\n type = node.type[0].toUpperCase() + node.type.slice(1);\n node = this[\"render\" + type](node);\n para.appendChild(node);\n }\n return para;\n },\n renderFold: function(data) {\n var fold;\n fold = this.fold.cloneNode(true);\n fold.setAttribute('id', data.id || (\"fold-\" + data.event + \"-\" + data.name));\n fold.setAttribute('class', \"fold-\" + data.event);\n if (data.event === 'start') {\n fold.lastChild.lastChild.nodeValue = data.name;\n } else {\n fold.removeChild(fold.lastChild);\n }\n return fold;\n },\n renderSpan: function(data) {\n var span;\n span = this.span.cloneNode(true);\n if (data.id) {\n span.setAttribute('id', data.id);\n }\n if (data[\"class\"]) {\n span.setAttribute('class', data[\"class\"]);\n }\n span.lastChild.nodeValue = data.text || '';\n return span;\n },\n renderText: function(data) {\n var text;\n text = this.text.cloneNode(true);\n text.nodeValue = data.text;\n return text;\n },\n createParagraph: function() {\n var para;\n para = document.createElement('p');\n para.appendChild(document.createElement('a'));\n return para;\n },\n createFold: function() {\n var fold;\n fold = document.createElement('div');\n fold.appendChild(this.createSpan());\n fold.lastChild.setAttribute('class', 'fold-name');\n return fold;\n },\n createSpan: function() {\n var span;\n span = document.createElement('span');\n span.appendChild(document.createTextNode(' '));\n return span;\n },\n insertBefore: function(node, other) {\n var log;\n if (other) {\n return other.parentNode.insertBefore(node, other);\n } else {\n log = document.getElementById('log');\n return log.insertBefore(node, log.firstChild);\n }\n },\n insertAfter: function(node, other) {\n if (other.nextSibling) {\n return this.insertBefore(node, other.nextSibling);\n } else {\n return this.appendTo(node, other.parentNode);\n }\n },\n prependTo: function(node, other) {\n if (other.firstChild) {\n return other.insertBefore(node, other.firstChild);\n } else {\n return appendTo(node, other);\n }\n },\n appendTo: function(node, other) {\n return other.appendChild(node);\n },\n addClass: function(classes, string) {\n if (classes != null ? classes.indexOf(string) : void 0) {\n return;\n }\n if (classes) {\n return \"\" + classes + \" \" + string;\n } else {\n return string;\n }\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=log/renderer");minispade.register('log/times', "(function() {(function() {\n\n Log.Times = function(log) {\n this.log = log;\n this.times = {};\n return this;\n };\n\n Log.extend(Log.Times.prototype, {\n add: function(node) {\n var time, _base, _name;\n time = (_base = this.times)[_name = node.name] || (_base[_name] = new Log.Times.Time);\n return time.receive(node);\n },\n duration: function(name) {\n if (this.times[name]) {\n return this.times[name].duration;\n }\n }\n });\n\n Log.Times.Time = function() {\n return this;\n };\n\n Log.extend(Log.Times.Time.prototype, {\n receive: function(node) {\n this[node.event] = node;\n if (Log.DEBUG) {\n console.log(\"T.0 - \" + node.event + \" \" + node.name);\n }\n if (this.start && this.end) {\n return this.finish();\n }\n },\n finish: function() {\n var element;\n if (Log.DEBUG) {\n console.log(\"T.1 - finish \" + this.start.name);\n }\n element = document.getElementById(this.start.id);\n if (element) {\n return this.update(element);\n }\n },\n update: function(element) {\n element.setAttribute('class', 'duration');\n element.setAttribute('title', \"This command finished after \" + this.duration + \" seconds.\");\n return element.lastChild.nodeValue = \"\" + this.duration + \"s\";\n }\n });\n\n Object.defineProperty(Log.Times.Time.prototype, 'duration', {\n get: function() {\n var duration;\n duration = this.stats.duration / 1000 / 1000 / 1000;\n return duration.toFixed(2);\n }\n });\n\n Object.defineProperty(Log.Times.Time.prototype, 'stats', {\n get: function() {\n var stat, stats, _i, _len, _ref;\n if (!(this.end && this.end.stats)) {\n return {};\n }\n stats = {};\n _ref = this.end.stats.split(',');\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n stat = _ref[_i];\n stat = stat.split('=');\n stats[stat[0]] = stat[1];\n }\n return stats;\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=log/times"); - From 2e05002a83abb1f57ff23d9d70ffeaba481a02b7 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 15:56:16 +0100 Subject: [PATCH 147/313] Use Ember.run.throttle instead of $.throttle --- assets/scripts/app/utils/tailing.coffee | 3 +- assets/scripts/app/utils/to-top.coffee | 3 +- assets/scripts/vendor/jquery.throttle.js | 252 ----------------------- 3 files changed, 4 insertions(+), 254 deletions(-) delete mode 100644 assets/scripts/vendor/jquery.throttle.js diff --git a/assets/scripts/app/utils/tailing.coffee b/assets/scripts/app/utils/tailing.coffee index 6162b169..bdecc272 100644 --- a/assets/scripts/app/utils/tailing.coffee +++ b/assets/scripts/app/utils/tailing.coffee @@ -9,7 +9,8 @@ class Tailing constructor: (@window, @tail_selector, @log_selector) -> @position = @window.scrollTop() - @window.scroll( $.throttle( 200, @onScroll.bind(this) ) ) + @window.scroll => + Ember.run.throttle(this, @onScroll, [], 200, false) this run: -> diff --git a/assets/scripts/app/utils/to-top.coffee b/assets/scripts/app/utils/to-top.coffee index 57f9fdf1..fd255a4b 100644 --- a/assets/scripts/app/utils/to-top.coffee +++ b/assets/scripts/app/utils/to-top.coffee @@ -6,7 +6,8 @@ class ToTop # the calculations. constructor: (@window, @element_selector, @container_selector) -> @position = @window.scrollTop() - @window.scroll( $.throttle( 200, @onScroll.bind(this) ) ) + @window.scroll => + Ember.run.throttle(this, @onScroll, [], 200, false) this element: -> diff --git a/assets/scripts/vendor/jquery.throttle.js b/assets/scripts/vendor/jquery.throttle.js deleted file mode 100644 index f39717c1..00000000 --- a/assets/scripts/vendor/jquery.throttle.js +++ /dev/null @@ -1,252 +0,0 @@ -/*! - * jQuery throttle / debounce - v1.1 - 3/7/2010 - * http://benalman.com/projects/jquery-throttle-debounce-plugin/ - * - * Copyright (c) 2010 "Cowboy" Ben Alman - * Dual licensed under the MIT and GPL licenses. - * http://benalman.com/about/license/ - */ - -// Script: jQuery throttle / debounce: Sometimes, less is more! -// -// *Version: 1.1, Last updated: 3/7/2010* -// -// Project Home - http://benalman.com/projects/jquery-throttle-debounce-plugin/ -// GitHub - http://github.com/cowboy/jquery-throttle-debounce/ -// Source - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.js -// (Minified) - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.min.js (0.7kb) -// -// About: License -// -// Copyright (c) 2010 "Cowboy" Ben Alman, -// Dual licensed under the MIT and GPL licenses. -// http://benalman.com/about/license/ -// -// About: Examples -// -// These working examples, complete with fully commented code, illustrate a few -// ways in which this plugin can be used. -// -// Throttle - http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/ -// Debounce - http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/ -// -// About: Support and Testing -// -// Information about what version or versions of jQuery this plugin has been -// tested with, what browsers it has been tested in, and where the unit tests -// reside (so you can test it yourself). -// -// jQuery Versions - none, 1.3.2, 1.4.2 -// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome 4-5, Opera 9.6-10.1. -// Unit Tests - http://benalman.com/code/projects/jquery-throttle-debounce/unit/ -// -// About: Release History -// -// 1.1 - (3/7/2010) Fixed a bug in where trailing callbacks -// executed later than they should. Reworked a fair amount of internal -// logic as well. -// 1.0 - (3/6/2010) Initial release as a stand-alone project. Migrated over -// from jquery-misc repo v0.4 to jquery-throttle repo v1.0, added the -// no_trailing throttle parameter and debounce functionality. -// -// Topic: Note for non-jQuery users -// -// jQuery isn't actually required for this plugin, because nothing internal -// uses any jQuery methods or properties. jQuery is just used as a namespace -// under which these methods can exist. -// -// Since jQuery isn't actually required for this plugin, if jQuery doesn't exist -// when this plugin is loaded, the method described below will be created in -// the `Cowboy` namespace. Usage will be exactly the same, but instead of -// $.method() or jQuery.method(), you'll need to use Cowboy.method(). - -(function(window,undefined){ - '$:nomunge'; // Used by YUI compressor. - - // Since jQuery really isn't required for this plugin, use `jQuery` as the - // namespace only if it already exists, otherwise use the `Cowboy` namespace, - // creating it if necessary. - var $ = window.jQuery || window.Cowboy || ( window.Cowboy = {} ), - - // Internal method reference. - jq_throttle; - - // Method: jQuery.throttle - // - // Throttle execution of a function. Especially useful for rate limiting - // execution of handlers on events like resize and scroll. If you want to - // rate-limit execution of a function to a single time, see the - // method. - // - // In this visualization, | is a throttled-function call and X is the actual - // callback execution: - // - // > Throttled with `no_trailing` specified as false or unspecified: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X X X X X X X X X X X - // > - // > Throttled with `no_trailing` specified as true: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X X X X X X X X X - // - // Usage: - // - // > var throttled = jQuery.throttle( delay, [ no_trailing, ] callback ); - // > - // > jQuery('selector').bind( 'someevent', throttled ); - // > jQuery('selector').unbind( 'someevent', throttled ); - // - // This also works in jQuery 1.4+: - // - // > jQuery('selector').bind( 'someevent', jQuery.throttle( delay, [ no_trailing, ] callback ) ); - // > jQuery('selector').unbind( 'someevent', callback ); - // - // Arguments: - // - // delay - (Number) A zero-or-greater delay in milliseconds. For event - // callbacks, values around 100 or 250 (or even higher) are most useful. - // no_trailing - (Boolean) Optional, defaults to false. If no_trailing is - // true, callback will only execute every `delay` milliseconds while the - // throttled-function is being called. If no_trailing is false or - // unspecified, callback will be executed one final time after the last - // throttled-function call. (After the throttled-function has not been - // called for `delay` milliseconds, the internal counter is reset) - // callback - (Function) A function to be executed after delay milliseconds. - // The `this` context and all arguments are passed through, as-is, to - // `callback` when the throttled-function is executed. - // - // Returns: - // - // (Function) A new, throttled, function. - - $.throttle = jq_throttle = function( delay, no_trailing, callback, debounce_mode ) { - // After wrapper has stopped being called, this timeout ensures that - // `callback` is executed at the proper times in `throttle` and `end` - // debounce modes. - var timeout_id, - - // Keep track of the last time `callback` was executed. - last_exec = 0; - - // `no_trailing` defaults to falsy. - if ( typeof no_trailing !== 'boolean' ) { - debounce_mode = callback; - callback = no_trailing; - no_trailing = undefined; - } - - // The `wrapper` function encapsulates all of the throttling / debouncing - // functionality and when executed will limit the rate at which `callback` - // is executed. - function wrapper() { - var that = this, - elapsed = +new Date() - last_exec, - args = arguments; - - // Execute `callback` and update the `last_exec` timestamp. - function exec() { - last_exec = +new Date(); - callback.apply( that, args ); - }; - - // If `debounce_mode` is true (at_begin) this is used to clear the flag - // to allow future `callback` executions. - function clear() { - timeout_id = undefined; - }; - - if ( debounce_mode && !timeout_id ) { - // Since `wrapper` is being called for the first time and - // `debounce_mode` is true (at_begin), execute `callback`. - exec(); - } - - // Clear any existing timeout. - timeout_id && clearTimeout( timeout_id ); - - if ( debounce_mode === undefined && elapsed > delay ) { - // In throttle mode, if `delay` time has been exceeded, execute - // `callback`. - exec(); - - } else if ( no_trailing !== true ) { - // In trailing throttle mode, since `delay` time has not been - // exceeded, schedule `callback` to execute `delay` ms after most - // recent execution. - // - // If `debounce_mode` is true (at_begin), schedule `clear` to execute - // after `delay` ms. - // - // If `debounce_mode` is false (at end), schedule `callback` to - // execute after `delay` ms. - timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay ); - } - }; - - // Set the guid of `wrapper` function to the same of original callback, so - // it can be removed in jQuery 1.4+ .unbind or .die by using the original - // callback as a reference. - if ( $.guid ) { - wrapper.guid = callback.guid = callback.guid || $.guid++; - } - - // Return the wrapper function. - return wrapper; - }; - - // Method: jQuery.debounce - // - // Debounce execution of a function. Debouncing, unlike throttling, - // guarantees that a function is only executed a single time, either at the - // very beginning of a series of calls, or at the very end. If you want to - // simply rate-limit execution of a function, see the - // method. - // - // In this visualization, | is a debounced-function call and X is the actual - // callback execution: - // - // > Debounced with `at_begin` specified as false or unspecified: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X - // > - // > Debounced with `at_begin` specified as true: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X - // - // Usage: - // - // > var debounced = jQuery.debounce( delay, [ at_begin, ] callback ); - // > - // > jQuery('selector').bind( 'someevent', debounced ); - // > jQuery('selector').unbind( 'someevent', debounced ); - // - // This also works in jQuery 1.4+: - // - // > jQuery('selector').bind( 'someevent', jQuery.debounce( delay, [ at_begin, ] callback ) ); - // > jQuery('selector').unbind( 'someevent', callback ); - // - // Arguments: - // - // delay - (Number) A zero-or-greater delay in milliseconds. For event - // callbacks, values around 100 or 250 (or even higher) are most useful. - // at_begin - (Boolean) Optional, defaults to false. If at_begin is false or - // unspecified, callback will only be executed `delay` milliseconds after - // the last debounced-function call. If at_begin is true, callback will be - // executed only at the first debounced-function call. (After the - // throttled-function has not been called for `delay` milliseconds, the - // internal counter is reset) - // callback - (Function) A function to be executed after delay milliseconds. - // The `this` context and all arguments are passed through, as-is, to - // `callback` when the debounced-function is executed. - // - // Returns: - // - // (Function) A new, debounced, function. - - $.debounce = function( delay, at_begin, callback ) { - return callback === undefined - ? jq_throttle( delay, at_begin, false ) - : jq_throttle( delay, callback, at_begin !== false ); - }; - -})(this); From 1e9d136911f0df900381ac130cf8e6199c78e6d0 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 16:21:03 +0100 Subject: [PATCH 148/313] Rename builds/item controller to builds-item --- .../app/controllers/{builds/item.coffee => builds-item.coffee} | 0 assets/scripts/travis.coffee | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename assets/scripts/app/controllers/{builds/item.coffee => builds-item.coffee} (100%) diff --git a/assets/scripts/app/controllers/builds/item.coffee b/assets/scripts/app/controllers/builds-item.coffee similarity index 100% rename from assets/scripts/app/controllers/builds/item.coffee rename to assets/scripts/app/controllers/builds-item.coffee diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index dfcb1c21..4a630e1c 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -113,7 +113,7 @@ require 'controllers/top' require 'controllers/first-sync' require 'controllers/accounts/info' require 'controllers/main/error' -require 'controllers/builds/item' +require 'controllers/builds-item' require 'controllers/queue' require 'controllers/running-jobs' require 'controllers/dashboard/repositories' From 429d580b008aae66eb89d7bf9a262b058298b77a Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 2 Feb 2015 16:21:19 +0100 Subject: [PATCH 149/313] Use durationFrom as durationFromHelper --- assets/scripts/app/models/repo.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/scripts/app/models/repo.coffee b/assets/scripts/app/models/repo.coffee index 7721734c..9775ba53 100644 --- a/assets/scripts/app/models/repo.coffee +++ b/assets/scripts/app/models/repo.coffee @@ -7,7 +7,7 @@ EnvVar = Travis.EnvVar Build = Travis.Build SshKey = Travis.SshKey Event = Travis.Event -durationFrom = Travis.Helpers.durationFrom +durationFromHelper = Travis.Helpers.durationFrom Ajax = Travis.ajax Repo = Model.extend @@ -105,7 +105,7 @@ Repo = Model.extend lastBuildDuration: (-> duration = @get('_lastBuildDuration') - duration = durationFrom(@get('lastBuildStartedAt'), @get('lastBuildFinishedAt')) unless duration + duration = durationFromHelper(@get('lastBuildStartedAt'), @get('lastBuildFinishedAt')) unless duration duration ).property('_lastBuildDuration', 'lastBuildStartedAt', 'lastBuildFinishedAt') From 9f4e408242fd7fd99e23105d9532d7810ab7db60 Mon Sep 17 00:00:00 2001 From: Lisa Passing Date: Mon, 2 Feb 2015 17:30:27 +0100 Subject: [PATCH 150/313] foundationerize pt1 --- assets/scripts/app/routes/dashboard.coffee | 12 +- assets/scripts/app/templates/layouts/home.hbs | 8 +- assets/scripts/app/templates/top.hbs | 4 +- assets/styles/app/_mixins/all.sass | 3 + assets/styles/app/_mixins/vars.sass | 13 + .../app/foundation/scss/foundation.scss | 46 + .../scss/foundation/_functions.scss | 146 ++ .../foundation/scss/foundation/_settings.scss | 1445 ++++++++++++++++ .../foundation/components/_accordion.scss | 157 ++ .../foundation/components/_alert-boxes.scss | 128 ++ .../foundation/components/_block-grid.scss | 132 ++ .../foundation/components/_breadcrumbs.scss | 132 ++ .../foundation/components/_button-groups.scss | 197 +++ .../scss/foundation/components/_buttons.scss | 259 +++ .../scss/foundation/components/_clearing.scss | 247 +++ .../components/_dropdown-buttons.scss | 130 ++ .../scss/foundation/components/_dropdown.scss | 262 +++ .../foundation/components/_flex-video.scss | 51 + .../scss/foundation/components/_forms.scss | 570 ++++++ .../scss/foundation/components/_global.scss | 480 +++++ .../scss/foundation/components/_grid.scss | 289 ++++ .../scss/foundation/components/_icon-bar.scss | 329 ++++ .../foundation/components/_inline-lists.scss | 57 + .../scss/foundation/components/_joyride.scss | 222 +++ .../foundation/components/_keystrokes.scss | 61 + .../scss/foundation/components/_labels.scss | 106 ++ .../scss/foundation/components/_magellan.scss | 34 + .../foundation/components/_offcanvas.scss | 515 ++++++ .../scss/foundation/components/_orbit.scss | 368 ++++ .../foundation/components/_pagination.scss | 162 ++ .../scss/foundation/components/_panels.scss | 101 ++ .../components/_pricing-tables.scss | 150 ++ .../foundation/components/_progress-bars.scss | 79 + .../foundation/components/_range-slider.scss | 168 ++ .../scss/foundation/components/_reveal.scss | 223 +++ .../scss/foundation/components/_side-nav.scss | 116 ++ .../foundation/components/_split-buttons.scss | 191 ++ .../scss/foundation/components/_sub-nav.scss | 123 ++ .../scss/foundation/components/_switches.scss | 238 +++ .../scss/foundation/components/_tables.scss | 135 ++ .../scss/foundation/components/_tabs.scss | 123 ++ .../scss/foundation/components/_thumbs.scss | 66 + .../scss/foundation/components/_toolbar.scss | 71 + .../scss/foundation/components/_tooltips.scss | 142 ++ .../scss/foundation/components/_top-bar.scss | 689 ++++++++ .../scss/foundation/components/_type.scss | 525 ++++++ .../foundation/components/_visibility.scss | 408 +++++ assets/styles/app/layout.sass | 95 +- assets/styles/app/layouts/dashboard.sass | 523 ++++++ assets/styles/app/left.sass | 6 +- assets/styles/app/left/list.sass | 7 + assets/styles/app/main.sass | 6 +- assets/styles/app/main/repository.sass | 8 +- assets/styles/app/main/summary.sass | 21 +- assets/styles/app/main/tools.sass | 28 +- assets/styles/app/status.sass | 6 + assets/styles/app/tabs.sass | 10 +- assets/styles/app/top.sass | 196 ++- assets/styles/dashboard/dashboard.scss | 744 -------- assets/styles/dashboard/foundation.scss | 1537 ----------------- 60 files changed, 10891 insertions(+), 2409 deletions(-) create mode 100644 assets/styles/app/_mixins/vars.sass create mode 100644 assets/styles/app/foundation/scss/foundation.scss create mode 100644 assets/styles/app/foundation/scss/foundation/_functions.scss create mode 100644 assets/styles/app/foundation/scss/foundation/_settings.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_accordion.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_alert-boxes.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_block-grid.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_breadcrumbs.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_button-groups.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_buttons.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_clearing.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_dropdown-buttons.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_dropdown.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_flex-video.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_forms.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_global.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_grid.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_icon-bar.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_inline-lists.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_joyride.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_keystrokes.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_labels.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_magellan.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_offcanvas.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_orbit.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_pagination.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_panels.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_pricing-tables.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_progress-bars.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_range-slider.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_reveal.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_side-nav.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_split-buttons.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_sub-nav.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_switches.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_tables.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_tabs.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_thumbs.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_toolbar.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_tooltips.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_top-bar.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_type.scss create mode 100644 assets/styles/app/foundation/scss/foundation/components/_visibility.scss create mode 100644 assets/styles/app/layouts/dashboard.sass delete mode 100644 assets/styles/dashboard/dashboard.scss delete mode 100644 assets/styles/dashboard/foundation.scss diff --git a/assets/scripts/app/routes/dashboard.coffee b/assets/scripts/app/routes/dashboard.coffee index 8190e2c9..0c12faa5 100644 --- a/assets/scripts/app/routes/dashboard.coffee +++ b/assets/scripts/app/routes/dashboard.coffee @@ -4,12 +4,12 @@ TravisRoute = Travis.Route Route = TravisRoute.extend needsAuth: true - activate: -> - @get('stylesheetsManager').disable('main') - @get('stylesheetsManager').enable('dashboard') + # activate: -> + # @get('stylesheetsManager').disable('main') + # @get('stylesheetsManager').enable('dashboard') - deactivate: -> - @get('stylesheetsManager').enable('main') - @get('stylesheetsManager').disable('dashboard') + # deactivate: -> + # @get('stylesheetsManager').enable('main') + # @get('stylesheetsManager').disable('dashboard') Travis.DashboardRoute = Route diff --git a/assets/scripts/app/templates/layouts/home.hbs b/assets/scripts/app/templates/layouts/home.hbs index c13f9413..d4e31df8 100644 --- a/assets/scripts/app/templates/layouts/home.hbs +++ b/assets/scripts/app/templates/layouts/home.hbs @@ -2,15 +2,15 @@ {{render "top"}}
-
- {{outlet "left"}} -
-
{{render "flash"}} {{yield}}
+
+ {{outlet "left"}} +
+ {{#if config.pro}}