diff --git a/app/components/build-banner/component.js b/app/components/build-banner/component.js
index 300030c13..7deabc89f 100644
--- a/app/components/build-banner/component.js
+++ b/app/components/build-banner/component.js
@@ -72,6 +72,23 @@ export default Component.extend({
}
}),
+ isButtonDisabledLoaded: false,
+ isButtonDisabled: computed('buildStatus', 'jobDisabled', {
+ get() {
+ if (this.buildAction === 'Restart') {
+ return this.jobDisabled.then(jobDisabled => {
+ this.set('isButtonDisabledLoaded', true);
+
+ return jobDisabled;
+ });
+ }
+
+ this.set('isButtonDisabledLoaded', true);
+
+ return false;
+ }
+ }),
+
overrideCoverageInfo() {
const { buildMeta } = this;
diff --git a/app/components/build-banner/template.hbs b/app/components/build-banner/template.hbs
index 866769c0b..cc816853a 100644
--- a/app/components/build-banner/template.hbs
+++ b/app/components/build-banner/template.hbs
@@ -80,7 +80,9 @@
{{#if isAuthenticated}}
- {{#bs-button onClick=(action "buildButtonClick")}}{{buildAction}}{{/bs-button}}
+ {{#bs-button onClick=(action "buildButtonClick") disabled=(or (await isButtonDisabled) (not isButtonDisabledLoaded))}}
+ {{buildAction}}
+ {{/bs-button}}
{{/if}}
diff --git a/app/pipeline/build/controller.js b/app/pipeline/build/controller.js
index 48d57aac4..36677b3fb 100644
--- a/app/pipeline/build/controller.js
+++ b/app/pipeline/build/controller.js
@@ -21,6 +21,23 @@ export default Controller.extend({
stepList: mapBy('build.steps', 'name'),
isShowingModal: false,
errorMessage: '',
+ jobDisabled: computed('model.job', {
+ get() {
+ const job = this.get('model.job');
+ const jobsPromise = this.get('model.pipeline.jobs');
+
+ return jobsPromise.then(jobs => {
+ if (this.get('model.event.type') === 'pr') {
+ const originalJob = jobs.find(j => j.id === job.prParentJobId);
+
+ return originalJob ? originalJob.isDisabled : false;
+ }
+
+ return job.isDisabled;
+ });
+ }
+ }),
+
prEvents: computed('model.{event.pr.url,pipeline.id}', {
get() {
if (this.get('model.event.type') === 'pr') {
diff --git a/app/pipeline/build/template.hbs b/app/pipeline/build/template.hbs
index 4b4d2d5bd..6ba067cf5 100644
--- a/app/pipeline/build/template.hbs
+++ b/app/pipeline/build/template.hbs
@@ -13,6 +13,7 @@
buildMeta=build.meta
jobName=job.name
jobId=job.id
+ jobDisabled=jobDisabled
annotations=job.annotations
pipelineId=pipeline.id
pipelineName=pipeline.name
diff --git a/tests/integration/components/build-banner/component-test.js b/tests/integration/components/build-banner/component-test.js
index 703f95881..66492f3c8 100644
--- a/tests/integration/components/build-banner/component-test.js
+++ b/tests/integration/components/build-banner/component-test.js
@@ -321,7 +321,7 @@ module('Integration | Component | build banner', function (hooks) {
});
test('it renders a restart button for completed jobs when authenticated', async function (assert) {
- assert.expect(3);
+ assert.expect(4);
const reloadBuildSpy = this.spy();
@@ -332,6 +332,8 @@ module('Integration | Component | build banner', function (hooks) {
});
this.set('eventMock', prEventMock);
this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('isButtonDisabledLoaded', true);
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(false)));
await render(hbs`{{build-banner
buildContainer="node:6"
@@ -340,6 +342,7 @@ module('Integration | Component | build banner', function (hooks) {
buildStart="2016-11-04T20:09:41.238Z"
buildSteps=buildStepsMock
jobName="PR-671"
+ jobDisabled=jobDisabled
isAuthenticated=true
event=eventMock
prEvents=prEvents
@@ -348,10 +351,46 @@ module('Integration | Component | build banner', function (hooks) {
}}`);
assert.dom('button').hasText('Restart');
+ assert.dom('.clicks-disabled').doesNotExist();
assert.notOk(reloadBuildSpy.called);
await click('button');
});
+ test('it renders a disabled restart button for completed disabled jobs when authenticated', async function (assert) {
+ assert.expect(3);
+
+ const reloadBuildSpy = this.spy();
+
+ this.set('buildStepsMock', buildStepsMock);
+ this.set('reloadCb', reloadBuildSpy);
+ this.set('externalStart', () => {
+ assert.ok(true);
+ });
+ this.set('eventMock', prEventMock);
+ this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('isButtonDisabledLoaded', true);
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(true)));
+
+ await render(hbs`{{build-banner
+ buildContainer="node:6"
+ duration="5 seconds"
+ buildStatus="ABORTED"
+ buildStart="2016-11-04T20:09:41.238Z"
+ buildSteps=buildStepsMock
+ jobName="PR-671"
+ jobDisabled=jobDisabled
+ isAuthenticated=true
+ event=eventMock
+ prEvents=prEvents
+ onStart=(action externalStart)
+ reloadBuild=(action reloadCb)
+ }}`);
+
+ assert.dom('button').hasText('Restart');
+ assert.dom('button').hasAttribute('disabled');
+ assert.notOk(reloadBuildSpy.called);
+ });
+
test('it renders a stop button for running job when authenticated', async function (assert) {
assert.expect(4);
this.set('willRender', () => {
@@ -364,6 +403,42 @@ module('Integration | Component | build banner', function (hooks) {
this.set('buildStepsMock', buildStepsMock);
this.set('eventMock', prEventMock);
this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('isButtonDisabledLoaded', true);
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(false)));
+
+ await render(hbs`{{build-banner
+ buildContainer="node:6"
+ duration="5 seconds"
+ buildStatus="RUNNING"
+ buildStart="2016-11-04T20:09:41.238Z"
+ buildSteps=buildStepsMock
+ jobName="main"
+ jobDisabled=jobDisabled
+ isAuthenticated=true
+ event=eventMock
+ prEvents=prEvents
+ onStop=(action externalStop)
+ reloadBuild=(action willRender)
+ }}`);
+
+ assert.dom('button').hasText('Stop');
+ await click('button');
+ });
+
+ test('it renders a stop button for running disabled job when authenticated', async function (assert) {
+ assert.expect(5);
+ this.set('willRender', () => {
+ assert.ok(true);
+ });
+
+ this.set('externalStop', () => {
+ assert.ok(true);
+ });
+ this.set('buildStepsMock', buildStepsMock);
+ this.set('eventMock', prEventMock);
+ this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('isButtonDisabledLoaded', true);
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(true)));
await render(hbs`{{build-banner
buildContainer="node:6"
@@ -372,6 +447,7 @@ module('Integration | Component | build banner', function (hooks) {
buildStart="2016-11-04T20:09:41.238Z"
buildSteps=buildStepsMock
jobName="main"
+ jobDisabled=jobDisabled
isAuthenticated=true
event=eventMock
prEvents=prEvents
@@ -380,6 +456,7 @@ module('Integration | Component | build banner', function (hooks) {
}}`);
assert.dom('button').hasText('Stop');
+ assert.dom('.clicks-disabled').doesNotExist();
await click('button');
});
@@ -395,6 +472,8 @@ module('Integration | Component | build banner', function (hooks) {
this.set('buildStepsMock', buildStepsMock);
this.set('eventMock', prEventMock);
this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('isButtonDisabledLoaded', true);
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(false)));
await render(hbs`{{build-banner
buildContainer="node:6"
@@ -403,6 +482,7 @@ module('Integration | Component | build banner', function (hooks) {
buildStart="2016-11-04T20:09:41.238Z"
buildSteps=buildStepsMock
jobName="main"
+ jobDisabled=jobDisabled
isAuthenticated=true
event=eventMock
prEvents=prEvents
@@ -433,6 +513,7 @@ module('Integration | Component | build banner', function (hooks) {
this.set('buildStepsMock', coverageStepsMock);
this.set('buildMetaMock', buildMetaMock);
this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(false)));
await render(hbs`{{build-banner
buildContainer="node:6"
@@ -443,6 +524,7 @@ module('Integration | Component | build banner', function (hooks) {
buildStart="2016-11-04T20:09:41.238Z"
buildSteps=buildStepsMock
jobId=1
+ jobDisabled=jobDisabled
jobName="main"
isAuthenticated=true
event=eventMock
@@ -479,6 +561,8 @@ module('Integration | Component | build banner', function (hooks) {
this.set('buildStepsMock', coverageStepsMock);
this.set('buildMetaMock', buildMetaMock);
this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('isButtonDisabledLoaded', true);
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(false)));
await render(hbs`{{build-banner
buildContainer="node:6"
@@ -489,6 +573,7 @@ module('Integration | Component | build banner', function (hooks) {
buildStart="2016-11-04T20:09:41.238Z"
buildSteps=buildStepsMock
jobId=1
+ jobDisabled=jobDisabled
jobName="main"
isAuthenticated=true
event=eventMock
@@ -533,6 +618,7 @@ module('Integration | Component | build banner', function (hooks) {
this.set('buildStepsMock', coverageStepsMock);
this.set('buildMetaMock', buildMetaMock);
this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(false)));
await render(hbs`{{build-banner
buildContainer="node:6"
@@ -543,6 +629,7 @@ module('Integration | Component | build banner', function (hooks) {
buildSteps=buildStepsMock
buildMeta=buildMetaMock
jobId=1
+ jobDisabled=jobDisabled
jobName="main"
isAuthenticated=true
event=eventMock
@@ -579,6 +666,7 @@ module('Integration | Component | build banner', function (hooks) {
this.set('buildStepsMock', coverageStepsMock);
this.set('buildMetaMock', buildMetaMock);
this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(false)));
await render(hbs`{{build-banner
buildContainer="node:6"
@@ -589,6 +677,7 @@ module('Integration | Component | build banner', function (hooks) {
buildSteps=buildStepsMock
buildMeta=buildMetaMock
jobId=1
+ jobDisabled=jobDisabled
jobName="main"
isAuthenticated=true
event=eventMock
@@ -613,6 +702,7 @@ module('Integration | Component | build banner', function (hooks) {
this.set('eventMock', prEventMock);
this.set('buildStepsMock', buildStepsMock);
this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(false)));
await render(hbs`{{build-banner
buildContainer="node:6"
@@ -622,6 +712,7 @@ module('Integration | Component | build banner', function (hooks) {
buildStart="2016-11-04T20:09:41.238Z"
buildSteps=buildStepsMock
jobId=1
+ jobDisabled=jobDisabled
jobName="main"
isAuthenticated=true
event=eventMock
@@ -647,6 +738,8 @@ module('Integration | Component | build banner', function (hooks) {
this.set('eventMock', prEventMock);
this.set('buildStepsMock', coverageStepsMock);
this.set('prEvents', new EmberPromise(resolves => resolves([])));
+ this.set('isButtonDisabledLoaded', true);
+ this.set('jobDisabled', new EmberPromise(resolves => resolves(false)));
await render(hbs`{{build-banner
buildContainer="node:6"
@@ -656,6 +749,7 @@ module('Integration | Component | build banner', function (hooks) {
buildStart="2016-11-04T20:09:41.238Z"
buildSteps=buildStepsMock
jobId=1
+ jobDisabled=jobDisabled
jobName="main"
isAuthenticated=true
event=eventMock