diff --git a/assets/scripts/app/controllers/build.coffee b/assets/scripts/app/controllers/build.coffee index 48ea6918..dbbbf33d 100644 --- a/assets/scripts/app/controllers/build.coffee +++ b/assets/scripts/app/controllers/build.coffee @@ -1,3 +1,5 @@ +require 'helpers/urls' + gravatarImage = Travis.Urls.gravatarImage Controller = Ember.Controller.extend Travis.GithubUrlProperties, diff --git a/assets/scripts/app/controllers/repo.coffee b/assets/scripts/app/controllers/repo.coffee index 295bc758..900127f8 100644 --- a/assets/scripts/app/controllers/repo.coffee +++ b/assets/scripts/app/controllers/repo.coffee @@ -32,7 +32,7 @@ Controller = Ember.Controller.extend activate: (action) -> @stopObservingLastBuild() - this["view#{$.camelize(action)}"]() + this["view_#{action}".camelize()]() viewIndex: -> @observeLastBuild() diff --git a/assets/scripts/app/controllers/repos.coffee b/assets/scripts/app/controllers/repos.coffee index 3434ceda..b445fb39 100644 --- a/assets/scripts/app/controllers/repos.coffee +++ b/assets/scripts/app/controllers/repos.coffee @@ -49,7 +49,7 @@ Travis.ReposController = Ember.ArrayController.extend activate: (tab, params) -> @set('sortProperties', ['sortOrder']) @set('tab', tab) - this["view#{tab.camelize()}"](params) + this["view_#{tab}".camelize()]() viewRecent: -> @set('content', @get('recentRepos')) diff --git a/assets/scripts/app/helpers/urls.coffee b/assets/scripts/app/helpers/urls.coffee index b204bc59..8169f6a6 100644 --- a/assets/scripts/app/helpers/urls.coffee +++ b/assets/scripts/app/helpers/urls.coffee @@ -49,5 +49,6 @@ Travis.Urls = { githubAdmin: githubAdmin, statusImage: statusImage, ccXml: ccXml, - email: email + email: email, + gravatarImage: gravatarImage } diff --git a/assets/scripts/app/views.coffee b/assets/scripts/app/views.coffee index 55ecc56d..a77a0c2f 100644 --- a/assets/scripts/app/views.coffee +++ b/assets/scripts/app/views.coffee @@ -13,6 +13,9 @@ require 'views/log' require 'views/repo' require 'views/repos-list' require 'views/repos-list-tabs' +require 'views/repo-show-tools' +require 'views/repo-show-tabs' +require 'views/repo-actions' require 'views/profile' require 'views/stats' require 'views/signin' diff --git a/assets/scripts/app/views/jobs.coffee b/assets/scripts/app/views/jobs.coffee index 05d27278..f8874809 100644 --- a/assets/scripts/app/views/jobs.coffee +++ b/assets/scripts/app/views/jobs.coffee @@ -1,4 +1,5 @@ View = Ember.View.extend + templateName: 'jobs' buildBinding: 'controller.build' jobTableId: Ember.computed(-> diff --git a/assets/scripts/app/views/repo-actions.coffee b/assets/scripts/app/views/repo-actions.coffee new file mode 100644 index 00000000..ac019ee9 --- /dev/null +++ b/assets/scripts/app/views/repo-actions.coffee @@ -0,0 +1,169 @@ +View = Travis.View.extend + templateName: 'repos/show/actions' + + repoBinding: 'controller.repo' + buildBinding: 'controller.build' + jobBinding: 'controller.job' + tabBinding: 'controller.tab' + currentUserBinding: 'controller.currentUser' + + actions: + requeueBuild: -> + if @get('canRequeueBuild') + @requeue @get('build') + + requeueJob: -> + if @get('canRequeueJob') + @requeue @get('_job') + + cancelBuild: -> + if @get('canCancelBuild') + Travis.flash(notice: 'Build cancellation has been scheduled.') + @get('build').cancel().then -> + Travis.flash(success: 'Build has been successfully canceled.') + , (xhr) -> + if xhr.status == 422 + Travis.flash(error: 'This build can\'t be canceled') + else if xhr.status == 403 + Travis.flash(error: 'You don\'t have sufficient access to cancel this build') + else + Travis.flash(error: 'An error occured when canceling the build') + + + removeLog: -> + @popupCloseAll() + if @get('canRemoveLog') + job = @get('_job') || @get('build.jobs.firstObject') + job.removeLog().then -> + Travis.flash(success: 'Log has been successfully removed.') + , (xhr) -> + if xhr.status == 409 + Travis.flash(error: 'Log can\'t be removed') + else if xhr.status == 401 + Travis.flash(error: 'You don\'t have sufficient access to remove the log') + else + Travis.flash(error: 'An error occured when removing the log') + + cancelJob: -> + if @get('canCancelJob') + Travis.flash(notice: 'Job cancellation has been scheduled.') + @get('_job').cancel().then -> + Travis.flash(success: 'Job has been successfully canceled.') + , (xhr) -> + if xhr.status == 422 + Travis.flash(error: 'This job can\'t be canceled') + else if xhr.status == 403 + Travis.flash(error: 'You don\'t have sufficient access to cancel this job') + else + Travis.flash(error: 'An error occured when canceling the job') + + codeClimatePopup: -> + @popupCloseAll() + @popup('code-climate') + return false + + removeLogPopup: -> + if @get('canRemoveLog') + @set('active', true) + @popup('remove-log-popup') + return false + + hasPermission: (-> + if permissions = @get('currentUser.permissions') + permissions.contains parseInt(@get('repo.id')) + ).property('currentUser.permissions.length', 'repo.id') + + hasPushPermission: (-> + if permissions = @get('currentUser.pushPermissions') + permissions.contains parseInt(@get('repo.id')) + ).property('currentUser.pushPermissions.length', 'repo.id') + + displayRequeueBuild: (-> + @get('isBuildTab') && @get('build.isFinished') + ).property('isBuildTab', 'build.isFinished') + + canRequeueBuild: (-> + @get('displayRequeueBuild') && @get('hasPermission') + ).property('displayRequireBuild', 'hasPermission') + + displayRequeueJob: (-> + @get('isJobTab') && @get('job.isFinished') + ).property('isJobTab', 'job.isFinished') + + canRequeueJob: (-> + @get('displayRequeueJob') && @get('hasPermission') + ).property('displayRequeueJob', 'hasPermission') + + showDownloadLog: (-> + @get('jobIdForLog') && (@get('isJobTab') || @get('isBuildTab')) + ).property('jobIdForLog', 'isJobTab', 'isBuildTab') + + _job: (-> + if id = @get('jobIdForLog') + Travis.Job.find(id) + ).property('jobIdForLog') + + jobIdForLog: (-> + job = @get('job.id') + unless job + if @get('build.jobs.length') == 1 + job = @get('build.jobs').objectAt?(0).get?('id') + job + ).property('job.id', 'build.jobs.firstObject.id', 'build.jobs.length') + + plainTextLogUrl: (-> + if id = @get('jobIdForLog') + url = Travis.Urls.plainTextLog(id) + if Travis.config.pro + token = @get('job.log.token') || @get('build.jobs.firstObject.log.token') + url += "&access_token=#{token}" + url + ).property('jobIdForLog', 'job.log.token', 'build.jobs.firstObject.log.token') + + canRemoveLog: (-> + @get('displayRemoveLog') + ).property('displayRemoveLog') + + displayRemoveLog: (-> + if job = @get('_job') + (@get('isJobTab') || (@get('isBuildTab') && @get('build.jobs.length') == 1)) && + job.get('canRemoveLog') && @get('hasPermission') + ).property('isJobTab', 'isBuildTab', 'build.jobs.length', '_job.canRemoveLog', 'jobIdForLog', 'canRemoveLog', 'hasPermission') + + canCancelBuild: (-> + @get('displayCancelBuild') && @get('hasPermission') + ).property('displayCancelBuild', 'hasPermission') + + displayCancelBuild: (-> + @get('isBuildTab') && @get('build.canCancel') + ).property('isBuildTab', 'build.canCancel') + + canCancelJob: (-> + @get('displayCancelJob') && @get('hasPermission') + ).property('displayCancelJob', 'hasPermission') + + displayCancelJob: (-> + @get('isJobTab') && @get('job.canCancel') + ).property('isJobTab', 'job.canCancel') + + isJobTab: (-> + @get('tab') == 'job' + ).property('tab', 'repo.id') + + isBuildTab: (-> + ['current', 'build'].indexOf(@get('tab')) > -1 + ).property('tab') + + displayCodeClimate: (-> + @get('repo.githubLanguage') == 'Ruby' + ).property('repo.githubLanguage') + + requeueFinished: -> + @set('requeueing', false) + + requeue: (thing) -> + return if @get('requeueing') + @set('requeueing', true) + thing.requeue().then(this.requeueFinished.bind(this), this.requeueFinished.bind(this)) + +Travis.RepoActionsView = View diff --git a/assets/scripts/app/views/repo-show-tools.coffee b/assets/scripts/app/views/repo-show-tools.coffee new file mode 100644 index 00000000..3b5e7833 --- /dev/null +++ b/assets/scripts/app/views/repo-show-tools.coffee @@ -0,0 +1,76 @@ +View = Travis.View.extend + templateName: 'repos/show/tools' + + repoBinding: 'controller.repo' + buildBinding: 'controller.build' + jobBinding: 'controller.job' + tabBinding: 'controller.tab' + currentUserBinding: 'controller.currentUser' + slugBinding: 'controller.repo.slug' + + + didInsertElement: -> + self = this + $('.menu a').on 'click', -> + self.closeMenu() + + willRemoveElement: -> + $('.menu a').off 'click' + + closeMenu: -> + $('.menu').removeClass('display') + + actions: + menu: -> + @popupCloseAll() + $('#tools .menu').toggleClass('display') + return false + + regenerateKeyPopup: -> + if @get('canRegenerateKey') + @set('active', true) + @closeMenu() + @popup('regenerate-key-popup') + return false + + regenerateKey: -> + @popupCloseAll() + + (@get('repo.content') || @get('repo')).regenerateKey + success: => + @popup('regeneration-success') + error: -> + Travis.lookup('controller:flash').loadFlashes([{ error: 'Travis encountered an error while trying to regenerate the key, please try again.'}]) + + canRegenerateKey: (-> + @get('hasAdminPermission') + ).property('hasAdminPermission') + + hasPermission: (-> + if permissions = @get('currentUser.permissions') + permissions.contains parseInt(@get('repo.id')) + ).property('currentUser.permissions.length', 'repo.id') + + hasPushPermission: (-> + if permissions = @get('currentUser.pushPermissions') + permissions.contains parseInt(@get('repo.id')) + ).property('currentUser.pushPermissions.length', 'repo.id') + + hasAdminPermission: (-> + if permissions = @get('currentUser.adminPermissions') + permissions.contains parseInt(@get('repo.id')) + ).property('currentUser.adminPermissions.length', 'repo.id') + + displayRegenerateKey: (-> + @get('canRegenerateKey') + ).property('canRegenerateKey') + + displaySettingsLink: (-> + @get('hasPushPermission') + ).property('hasPushPermission') + + displayStatusImages: (-> + @get('hasPermission') + ).property('hasPermission') + +Travis.RepoShowToolsView = View