Fix changeStatusString logic
Migrates all changeStatusString computation logic to the behavior, consolidates tests from the individual elements into the behavior suite. Change statuses are now a comma separated list of statuses, e.g. "Merge Conflict, Private, WIP" or "Draft, WIP" -- no more parentheses to avoid unnecessary complexity and cognitive load. Also, no longer computes extra bits for closed changes. Bug: Issue 6795 Change-Id: I36e7875a07ee9e5ff2172328b87c6bc22c3bcaa4
This commit is contained in:
@@ -116,35 +116,19 @@ limitations under the License.
|
|||||||
status === this.ChangeStatus.DRAFT;
|
status === this.ChangeStatus.DRAFT;
|
||||||
},
|
},
|
||||||
|
|
||||||
wipOrPrivateStatus(change) {
|
|
||||||
if (change.work_in_progress && change.is_private) {
|
|
||||||
return ' (Private) (WIP)';
|
|
||||||
} else if (change.work_in_progress) {
|
|
||||||
return ' (WIP)';
|
|
||||||
} else if (change.is_private) {
|
|
||||||
return ' (Private)';
|
|
||||||
}
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
|
|
||||||
changeStatusString(change) {
|
changeStatusString(change) {
|
||||||
// "Closed" states should take precedence over "open" ones.
|
const states = [];
|
||||||
if (change.status === this.ChangeStatus.MERGED) {
|
if (change.status === this.ChangeStatus.MERGED) {
|
||||||
return 'Merged' + this.wipOrPrivateStatus(change);
|
states.push('Merged');
|
||||||
|
} else if (change.status === this.ChangeStatus.ABANDONED) {
|
||||||
|
states.push('Abandoned');
|
||||||
|
} else if (!change.mergeable) {
|
||||||
|
states.push('Merge Conflict');
|
||||||
}
|
}
|
||||||
if (change.status === this.ChangeStatus.ABANDONED) {
|
if (change.work_in_progress) { states.push('WIP'); }
|
||||||
return 'Abandoned' + this.wipOrPrivateStatus(change);
|
if (change.is_private) { states.push('Private'); }
|
||||||
}
|
if (change.status === this.ChangeStatus.DRAFT) { states.push('Draft'); }
|
||||||
if (change.mergeable === false) {
|
return states.join(', ');
|
||||||
return 'Merge Conflict' + this.wipOrPrivateStatus(change);
|
|
||||||
}
|
|
||||||
if (change.status === this.ChangeStatus.DRAFT) {
|
|
||||||
return 'Draft' + this.wipOrPrivateStatus(change);
|
|
||||||
}
|
|
||||||
if (change.status === this.ChangeStatus.NEW) {
|
|
||||||
return this.wipOrPrivateStatus(change);
|
|
||||||
}
|
|
||||||
return '';
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -85,11 +85,26 @@ limitations under the License.
|
|||||||
current_revision: 'rev1',
|
current_revision: 'rev1',
|
||||||
status: 'NEW',
|
status: 'NEW',
|
||||||
labels: {},
|
labels: {},
|
||||||
|
mergeable: true,
|
||||||
};
|
};
|
||||||
const status = element.changeStatusString(change);
|
const status = element.changeStatusString(change);
|
||||||
assert.equal(status, '');
|
assert.equal(status, '');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Merge conflict', () => {
|
||||||
|
const change = {
|
||||||
|
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
||||||
|
revisions: {
|
||||||
|
rev1: {_number: 1},
|
||||||
|
},
|
||||||
|
current_revision: 'rev1',
|
||||||
|
status: 'NEW',
|
||||||
|
labels: {},
|
||||||
|
};
|
||||||
|
const status = element.changeStatusString(change);
|
||||||
|
assert.equal(status, 'Merge Conflict');
|
||||||
|
});
|
||||||
|
|
||||||
test('Merged status', () => {
|
test('Merged status', () => {
|
||||||
const change = {
|
const change = {
|
||||||
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
||||||
@@ -129,25 +144,27 @@ limitations under the License.
|
|||||||
is_private: true,
|
is_private: true,
|
||||||
work_in_progress: true,
|
work_in_progress: true,
|
||||||
labels: {},
|
labels: {},
|
||||||
|
mergeable: true,
|
||||||
};
|
};
|
||||||
const status = element.changeStatusString(change);
|
const status = element.changeStatusString(change);
|
||||||
assert.equal(status, ' (Private) (WIP)');
|
assert.equal(status, 'WIP, Private');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Abandoned status with private and wip', () => {
|
test('Merge conflict with private and wip', () => {
|
||||||
const change = {
|
const change = {
|
||||||
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
||||||
revisions: {
|
revisions: {
|
||||||
rev1: {_number: 1},
|
rev1: {_number: 1},
|
||||||
},
|
},
|
||||||
current_revision: 'rev1',
|
current_revision: 'rev1',
|
||||||
status: 'ABANDONED',
|
status: 'NEW',
|
||||||
is_private: true,
|
is_private: true,
|
||||||
work_in_progress: true,
|
work_in_progress: true,
|
||||||
labels: {},
|
labels: {},
|
||||||
|
mergeable: false,
|
||||||
};
|
};
|
||||||
const status = element.changeStatusString(change);
|
const status = element.changeStatusString(change);
|
||||||
assert.equal(status, 'Abandoned (Private) (WIP)');
|
assert.equal(status, 'Merge Conflict, WIP, Private');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -45,20 +45,6 @@ limitations under the License.
|
|||||||
element = fixture('basic');
|
element = fixture('basic');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('change status', () => {
|
|
||||||
const getStatusForChange = function(change) {
|
|
||||||
element.change = change;
|
|
||||||
return element.$$('.cell.status').textContent.trim();
|
|
||||||
};
|
|
||||||
|
|
||||||
assert.equal(getStatusForChange({mergeable: true}), '');
|
|
||||||
assert.equal(getStatusForChange({mergeable: false}), 'Merge Conflict');
|
|
||||||
assert.equal(getStatusForChange({status: 'NEW'}), '');
|
|
||||||
assert.equal(getStatusForChange({status: 'MERGED'}), 'Merged');
|
|
||||||
assert.equal(getStatusForChange({status: 'ABANDONED'}), 'Abandoned');
|
|
||||||
assert.equal(getStatusForChange({status: 'DRAFT'}), 'Draft');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('computed fields', () => {
|
test('computed fields', () => {
|
||||||
assert.equal(element._computeLabelClass({labels: {}}),
|
assert.equal(element._computeLabelClass({labels: {}}),
|
||||||
'cell label u-gray-background');
|
'cell label u-gray-background');
|
||||||
|
|||||||
@@ -341,8 +341,6 @@ limitations under the License.
|
|||||||
--></template><!--
|
--></template><!--
|
||||||
-->)<!--
|
-->)<!--
|
||||||
--></template><!--
|
--></template><!--
|
||||||
--><span hidden$="[[!_change.work_in_progress]]"> (Work in progress)</span><!--
|
|
||||||
--><span>[[_privateChanges(_change)]]</span><!--
|
|
||||||
-->: [[_change.subject]]
|
-->: [[_change.subject]]
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -171,7 +171,7 @@
|
|||||||
},
|
},
|
||||||
_changeStatus: {
|
_changeStatus: {
|
||||||
type: String,
|
type: String,
|
||||||
computed: '_computeChangeStatus(_change, _patchRange.patchNum)',
|
computed: 'changeStatusString(_change)',
|
||||||
},
|
},
|
||||||
_commitCollapsed: {
|
_commitCollapsed: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@@ -623,17 +623,6 @@
|
|||||||
return Gerrit.Nav.getUrlForChange(change);
|
return Gerrit.Nav.getUrlForChange(change);
|
||||||
},
|
},
|
||||||
|
|
||||||
_computeChangeStatus(change, patchNum) {
|
|
||||||
let statusString = this.changeStatusString(change);
|
|
||||||
if (change.status === this.ChangeStatus.NEW) {
|
|
||||||
const rev = this.getRevisionByPatchNum(change.revisions, patchNum);
|
|
||||||
if (rev && rev.draft === true) {
|
|
||||||
statusString = 'Draft';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return statusString;
|
|
||||||
},
|
|
||||||
|
|
||||||
_privateChanges(change) {
|
_privateChanges(change) {
|
||||||
return change.is_private ? ' (Private)' : '';
|
return change.is_private ? ' (Private)' : '';
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -701,146 +701,6 @@ limitations under the License.
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('change status new', () => {
|
|
||||||
element._changeNum = '1';
|
|
||||||
element._patchRange = {
|
|
||||||
basePatchNum: 'PARENT',
|
|
||||||
patchNum: 1,
|
|
||||||
};
|
|
||||||
element._change = {
|
|
||||||
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
|
||||||
revisions: {
|
|
||||||
rev1: {_number: 1},
|
|
||||||
},
|
|
||||||
current_revision: 'rev1',
|
|
||||||
status: 'NEW',
|
|
||||||
labels: {},
|
|
||||||
};
|
|
||||||
const status = element._computeChangeStatus(element._change, '1');
|
|
||||||
assert.equal(status, '');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('change status draft', () => {
|
|
||||||
element._changeNum = '1';
|
|
||||||
element._patchRange = {
|
|
||||||
basePatchNum: 'PARENT',
|
|
||||||
patchNum: 1,
|
|
||||||
};
|
|
||||||
element._change = {
|
|
||||||
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
|
||||||
revisions: {
|
|
||||||
rev1: {_number: 1},
|
|
||||||
},
|
|
||||||
current_revision: 'rev1',
|
|
||||||
status: 'DRAFT',
|
|
||||||
labels: {},
|
|
||||||
};
|
|
||||||
const status = element._computeChangeStatus(element._change, '1');
|
|
||||||
assert.equal(status, 'Draft');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('change status conflict', () => {
|
|
||||||
element._changeNum = '1';
|
|
||||||
element._patchRange = {
|
|
||||||
basePatchNum: 'PARENT',
|
|
||||||
patchNum: 1,
|
|
||||||
};
|
|
||||||
element._change = {
|
|
||||||
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
|
||||||
revisions: {
|
|
||||||
rev1: {_number: 1},
|
|
||||||
},
|
|
||||||
current_revision: 'rev1',
|
|
||||||
mergeable: false,
|
|
||||||
status: 'NEW',
|
|
||||||
labels: {},
|
|
||||||
};
|
|
||||||
const status = element._computeChangeStatus(element._change, '1');
|
|
||||||
assert.equal(status, 'Merge Conflict');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('change status private', () => {
|
|
||||||
element._changeNum = '1';
|
|
||||||
element._patchRange = {
|
|
||||||
basePatchNum: 'PARENT',
|
|
||||||
patchNum: 1,
|
|
||||||
};
|
|
||||||
element._change = {
|
|
||||||
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
|
||||||
revisions: {
|
|
||||||
rev1: {_number: 1},
|
|
||||||
},
|
|
||||||
current_revision: 'rev1',
|
|
||||||
status: 'NEW',
|
|
||||||
labels: {},
|
|
||||||
is_private: true,
|
|
||||||
};
|
|
||||||
const status = element._privateChanges(element._change);
|
|
||||||
assert.equal(status, ' (Private)');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('change status without private', () => {
|
|
||||||
element._changeNum = '1';
|
|
||||||
element._patchRange = {
|
|
||||||
basePatchNum: 'PARENT',
|
|
||||||
patchNum: 1,
|
|
||||||
};
|
|
||||||
element._change = {
|
|
||||||
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
|
||||||
revisions: {
|
|
||||||
rev1: {_number: 1},
|
|
||||||
},
|
|
||||||
current_revision: 'rev1',
|
|
||||||
status: 'NEW',
|
|
||||||
labels: {},
|
|
||||||
is_private: false,
|
|
||||||
};
|
|
||||||
const status = element._privateChanges(element._change);
|
|
||||||
assert.equal(status, '');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('change status merged', () => {
|
|
||||||
element._changeNum = '1';
|
|
||||||
element._patchRange = {
|
|
||||||
basePatchNum: 'PARENT',
|
|
||||||
patchNum: 1,
|
|
||||||
};
|
|
||||||
element._change = {
|
|
||||||
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
|
||||||
revisions: {
|
|
||||||
rev1: {_number: 1},
|
|
||||||
},
|
|
||||||
current_revision: 'rev1',
|
|
||||||
status: element.ChangeStatus.MERGED,
|
|
||||||
labels: {},
|
|
||||||
};
|
|
||||||
const status = element._computeChangeStatus(element._change, '1');
|
|
||||||
assert.equal(status, 'Merged');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('revision status draft', () => {
|
|
||||||
element._changeNum = '1';
|
|
||||||
element._patchRange = {
|
|
||||||
basePatchNum: 'PARENT',
|
|
||||||
patchNum: 1,
|
|
||||||
};
|
|
||||||
element._change = {
|
|
||||||
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
|
|
||||||
revisions: {
|
|
||||||
rev1: {_number: 1},
|
|
||||||
rev2: {
|
|
||||||
_number: 2,
|
|
||||||
draft: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
current_revision: 'rev1',
|
|
||||||
status: 'NEW',
|
|
||||||
labels: {},
|
|
||||||
};
|
|
||||||
const status = element._computeChangeStatus(element._change, '2');
|
|
||||||
assert.equal(status, 'Draft');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('_computeMergedCommitInfo', () => {
|
test('_computeMergedCommitInfo', () => {
|
||||||
const dummyRevs = {
|
const dummyRevs = {
|
||||||
1: {commit: {commit: 1}},
|
1: {commit: {commit: 1}},
|
||||||
|
|||||||
Reference in New Issue
Block a user