Merge "Add support for labels other than Code-Review and Verified in list"

This commit is contained in:
David Pursehouse
2016-01-27 06:25:57 +00:00
committed by Gerrit Code Review
4 changed files with 102 additions and 52 deletions

View File

@@ -76,10 +76,10 @@ limitations under the License.
<span class="u-green"><span>+</span>[[change.insertions]]</span>, <span class="u-green"><span>+</span>[[change.insertions]]</span>,
<span class="u-red"><span>-</span>[[change.deletions]]</span> <span class="u-red"><span>-</span>[[change.deletions]]</span>
</span> </span>
<span title$="[[_computeLabelTitle(change.labels.Code_Review, 'Code-Review')]]" <template is="dom-repeat" items="[[labelNames]]" as="labelName">
class$="[[_computeLabelClass(change.labels.Code_Review)]]">[[_computeLabelValue(change.labels.Code_Review)]]</span> <span title$="[[_computeLabelTitle(change, labelName)]]"
<span title$="[[_computeLabelTitle(change.labels.Verified, 'Verified')]]" class$="[[_computeLabelClass(change, labelName)]]">[[_computeLabelValue(change, labelName)]]</span>
class$="[[_computeLabelClass(change.labels.Verified)]]">[[_computeLabelValue(change.labels.Verified)]]</span> </template>
</template> </template>
<script> <script>
(function() { (function() {
@@ -93,6 +93,9 @@ limitations under the License.
type: Boolean, type: Boolean,
reflectToAttribute: true, reflectToAttribute: true,
}, },
labelNames: {
type: Array,
},
change: Object, change: Object,
changeURL: { changeURL: {
type: String, type: String,
@@ -125,7 +128,8 @@ limitations under the License.
return ''; return '';
}, },
_computeLabelTitle: function(label, labelName) { _computeLabelTitle: function(change, labelName) {
var label = change.labels[labelName];
if (!label) { return labelName; } if (!label) { return labelName; }
var significantLabel = label.rejected || label.approved var significantLabel = label.rejected || label.approved
|| label.disliked || label.recommended; || label.disliked || label.recommended;
@@ -135,7 +139,8 @@ limitations under the License.
return labelName; return labelName;
}, },
_computeLabelClass: function(label) { _computeLabelClass: function(change, labelName) {
var label = change.labels[labelName];
// Mimic a Set. // Mimic a Set.
var classes = { var classes = {
'cell': true, 'cell': true,
@@ -159,7 +164,8 @@ limitations under the License.
return Object.keys(classes).sort().join(' '); return Object.keys(classes).sort().join(' ');
}, },
_computeLabelValue: function(label) { _computeLabelValue: function(change, labelName) {
var label = change.labels[labelName];
if (!label) { return ''; } if (!label) { return ''; }
if (label.approved) { if (label.approved) {
return '✓'; return '✓';

View File

@@ -50,15 +50,19 @@ limitations under the License.
<span class="topHeader branch">Branch</span> <span class="topHeader branch">Branch</span>
<span class="topHeader updated">Updated</span> <span class="topHeader updated">Updated</span>
<span class="topHeader size">Size</span> <span class="topHeader size">Size</span>
<span class="topHeader label" title="Code-Review">CR</span> <template is="dom-repeat" items="[[labelNames]]" as="labelName">
<span class="topHeader label" title="Verified">V</span> <span class="topHeader label" title$="[[labelName]]">
[[_computeLabelShortcut(labelName)]]
</span>
</template>
</div> </div>
<template is="dom-repeat" items="{{groups}}" as="changeGroup" index-as="groupIndex"> <template is="dom-repeat" items="{{groups}}" as="changeGroup" index-as="groupIndex">
<template is="dom-if" if="[[_groupTitle(groupIndex)]]"> <template is="dom-if" if="[[_groupTitle(groupIndex)]]">
<div class="groupHeader">[[_groupTitle(groupIndex)]]</div> <div class="groupHeader">[[_groupTitle(groupIndex)]]</div>
</template> </template>
<template is="dom-repeat" items="[[changeGroup]]" as="change"> <template is="dom-repeat" items="[[changeGroup]]" as="change">
<gr-change-list-item change="[[change]]" show-star="[[showStar]]"></gr-change-list-item> <gr-change-list-item change="[[change]]" show-star="[[showStar]]"
label-names="[[labelNames]]"></gr-change-list-item>
</template> </template>
</template> </template>
</template> </template>
@@ -96,6 +100,10 @@ limitations under the License.
type: Array, type: Array,
value: function() { return []; }, value: function() { return []; },
}, },
labelNames: {
type: Array,
computed: '_computeLabelNames(groups)',
},
selectedIndex: { selectedIndex: {
type: Number, type: Number,
value: 0, value: 0,
@@ -119,24 +127,32 @@ limitations under the License.
document.body.removeEventListener('keydown', this._boundKeyHandler); document.body.removeEventListener('keydown', this._boundKeyHandler);
}, },
_computeLabelNames: function(groups) {
var labels = [];
var nonExistingLabel = function(item) {
return labels.indexOf(item) < 0;
};
for (var i = 0; i < groups.length; i++) {
var group = groups[i];
for (var j = 0; j < group.length; j++) {
var change = group[j];
if (!change.labels) { continue; }
var currentLabels = Object.keys(change.labels);
labels = labels.concat(currentLabels.filter(nonExistingLabel));
}
}
return labels.sort();
},
_computeLabelShortcut: function(labelName) {
return labelName.replace(/[a-z-]/g, '');
},
_changesChanged: function(changes) { _changesChanged: function(changes) {
this.groups = [changes]; this.groups = [changes];
}, },
_groupsChanged: function(groups) { _groupsChanged: function(groups) {
for (var i = 0; i < groups.length; i++) {
for (var j = 0; j < groups[i].length; j++) {
var change = groups[i][j];
if (change.labels && change.labels.hasOwnProperty('Code-Review')) {
// Transform Code-Review to Code_Review so it is a JS identifier
// that can be used in computed properties. This is a hack, but
// it'll all have to change to support dynamic label sets anyway.
change.labels['Code_Review'] = change.labels['Code-Review'];
delete change.labels['Code-Review'];
}
}
}
// Allow for the elements to render before resetting the selectedIndex. // Allow for the elements to render before resetting the selectedIndex.
this.async(function() { this.async(function() {
// Setting the property would have no effect if the index is 0 (e.g. // Setting the property would have no effect if the index is 0 (e.g.

View File

@@ -52,55 +52,65 @@ limitations under the License.
assert.equal(element._computeChangeStatusString({status: 'DRAFT'}), assert.equal(element._computeChangeStatusString({status: 'DRAFT'}),
'Draft'); 'Draft');
assert.equal(element._computeLabelClass(), 'cell label'); assert.equal(element._computeLabelClass({labels: {}}), 'cell label');
assert.equal(element._computeLabelClass({}), 'cell label'); assert.equal(element._computeLabelClass(
assert.equal(element._computeLabelClass({approved: true, value: 1}), {labels: {}}, 'Verified'), 'cell label');
assert.equal(element._computeLabelClass(
{labels: {Verified: {approved: true, value: 1}}}, 'Verified'),
'cell label u-green u-monospace'); 'cell label u-green u-monospace');
assert.equal(element._computeLabelClass({rejected: true, value: -1}), assert.equal(element._computeLabelClass(
{labels: {Verified: {rejected: true, value: -1}}}, 'Verified'),
'cell label u-monospace u-red'); 'cell label u-monospace u-red');
assert.equal(element._computeLabelClass({value: 1}), assert.equal(element._computeLabelClass(
{labels: {'Code-Review': {value: 1}}}, 'Code-Review'),
'cell label u-green u-monospace'); 'cell label u-green u-monospace');
assert.equal(element._computeLabelClass({value: -1}), assert.equal(element._computeLabelClass(
{labels: {'Code-Review': {value: -1}}}, 'Code-Review'),
'cell label u-monospace u-red'); 'cell label u-monospace u-red');
assert.equal(element._computeLabelTitle({}, 'Verified'), 'Verified'); assert.equal(element._computeLabelTitle({labels: {}}, 'Verified'),
'Verified');
assert.equal(element._computeLabelTitle( assert.equal(element._computeLabelTitle(
{approved: {name: 'Diffy'}}, 'Verified'), {labels: {Verified: {approved: {name: 'Diffy'}}}}, 'Verified'),
'Verified\nby Diffy'); 'Verified\nby Diffy');
assert.equal(element._computeLabelTitle( assert.equal(element._computeLabelTitle(
{rejected: {name: 'Diffy'}}, 'Verified'), {labels: {Verified: {rejected: {name: 'Diffy'}}}}, 'Verified'),
'Verified\nby Diffy'); 'Verified\nby Diffy');
assert.equal(element._computeLabelTitle( assert.equal(element._computeLabelTitle(
{disliked: {name: 'Diffy'}, value: -1}, 'Code-Review'), {labels: {'Code-Review': {disliked: {name: 'Diffy'}, value: -1}}},
'Code-Review\nby Diffy'); 'Code-Review'), 'Code-Review\nby Diffy');
assert.equal(element._computeLabelTitle( assert.equal(element._computeLabelTitle(
{recommended: {name: 'Diffy'}, value: 1}, 'Code-Review'), {labels: {'Code-Review': {recommended: {name: 'Diffy'}, value: 1}}},
'Code-Review\nby Diffy'); 'Code-Review'), 'Code-Review\nby Diffy');
assert.equal(element._computeLabelTitle( assert.equal(element._computeLabelTitle(
{recommended: {name: 'Diffy'}, {labels: {'Code-Review': {recommended: {name: 'Diffy'},
rejected: {name: 'Admin'}}, 'Code-Review'), rejected: {name: 'Admin'}}}}, 'Code-Review'),
'Code-Review\nby Admin'); 'Code-Review\nby Admin');
assert.equal(element._computeLabelTitle( assert.equal(element._computeLabelTitle(
{approved: {name: 'Diffy'}, {labels: {'Code-Review': {approved: {name: 'Diffy'},
rejected: {name: 'Admin'}}, 'Code-Review'), rejected: {name: 'Admin'}}}}, 'Code-Review'),
'Code-Review\nby Admin'); 'Code-Review\nby Admin');
assert.equal(element._computeLabelTitle( assert.equal(element._computeLabelTitle(
{recommended: {name: 'Diffy'}, {labels: {'Code-Review': {recommended: {name: 'Diffy'},
disliked: {name: 'Admin'}, value: -1}, 'Code-Review'), disliked: {name: 'Admin'}, value: -1}}}, 'Code-Review'),
'Code-Review\nby Admin'); 'Code-Review\nby Admin');
assert.equal(element._computeLabelTitle( assert.equal(element._computeLabelTitle(
{approved: {name: 'Diffy'}, {labels: {'Code-Review': {approved: {name: 'Diffy'},
disliked: {name: 'Admin'}, value: -1}, 'Code-Review'), disliked: {name: 'Admin'}, value: -1}}}, 'Code-Review'),
'Code-Review\nby Diffy'); 'Code-Review\nby Diffy');
assert.equal(element._computeLabelValue(), ''); assert.equal(element._computeLabelValue({labels: {}}), '');
assert.equal(element._computeLabelValue({}), ''); assert.equal(element._computeLabelValue({labels: {}}, 'Verified'), '');
assert.equal(element._computeLabelValue({approved: true, value: 1}), assert.equal(element._computeLabelValue(
'✓'); {labels: {Verified: {approved: true, value: 1}}}, 'Verified'), '✓');
assert.equal(element._computeLabelValue({value: 1}), '+1'); assert.equal(element._computeLabelValue(
assert.equal(element._computeLabelValue({value: -1}), '-1'); {labels: {Verified: {value: 1}}}, 'Verified'), '+1');
assert.equal(element._computeLabelValue({approved: true}), '✓'); assert.equal(element._computeLabelValue(
assert.equal(element._computeLabelValue({rejected: true}), ''); {labels: {Verified: {value: -1}}}, 'Verified'), '-1');
assert.equal(element._computeLabelValue(
{labels: {Verified: {approved: true}}}, 'Verified'), '✓');
assert.equal(element._computeLabelValue(
{labels: {Verified: {rejected: true}}}, 'Verified'), '✕');
assert.equal(element._computeProjectURL('combustible-stuff'), assert.equal(element._computeProjectURL('combustible-stuff'),
'/projects/combustible-stuff,dashboards/default'); '/projects/combustible-stuff,dashboards/default');

View File

@@ -48,6 +48,24 @@ limitations under the License.
element = fixture('basic'); element = fixture('basic');
}); });
test('computed fields', function() {
assert.equal(element._computeLabelNames(
[[{_number: 0, labels: {}}]]).length, 0);
assert.equal(element._computeLabelNames([[
{_number: 0, labels: {Verified: {approved: {}}}},
{_number: 1, labels: {
Verified: {approved: {}}, 'Code-Review': {approved: {}}}},
{_number: 2, labels: {
Verified: {approved: {}}, 'Library-Compliance': {approved: {}}}},
]]).length, 3);
assert.equal(element._computeLabelShortcut('Code-Review'), 'CR');
assert.equal(element._computeLabelShortcut('Verified'), 'V');
assert.equal(element._computeLabelShortcut('Library-Compliance'), 'LC');
assert.equal(element._computeLabelShortcut(
'Some-Special-Label-7'), 'SSL7');
});
test('keyboard shortcuts', function(done) { test('keyboard shortcuts', function(done) {
element.changes = [ element.changes = [
{_number: 0}, {_number: 0},