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

View File

@@ -50,15 +50,19 @@ limitations under the License.
<span class="topHeader branch">Branch</span>
<span class="topHeader updated">Updated</span>
<span class="topHeader size">Size</span>
<span class="topHeader label" title="Code-Review">CR</span>
<span class="topHeader label" title="Verified">V</span>
<template is="dom-repeat" items="[[labelNames]]" as="labelName">
<span class="topHeader label" title$="[[labelName]]">
[[_computeLabelShortcut(labelName)]]
</span>
</template>
</div>
<template is="dom-repeat" items="{{groups}}" as="changeGroup" index-as="groupIndex">
<template is="dom-if" if="[[_groupTitle(groupIndex)]]">
<div class="groupHeader">[[_groupTitle(groupIndex)]]</div>
</template>
<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>
@@ -96,6 +100,10 @@ limitations under the License.
type: Array,
value: function() { return []; },
},
labelNames: {
type: Array,
computed: '_computeLabelNames(groups)',
},
selectedIndex: {
type: Number,
value: 0,
@@ -119,24 +127,32 @@ limitations under the License.
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) {
this.groups = [changes];
},
_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.
this.async(function() {
// 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'}),
'Draft');
assert.equal(element._computeLabelClass(), 'cell label');
assert.equal(element._computeLabelClass({}), 'cell label');
assert.equal(element._computeLabelClass({approved: true, value: 1}),
assert.equal(element._computeLabelClass({labels: {}}), 'cell label');
assert.equal(element._computeLabelClass(
{labels: {}}, 'Verified'), 'cell label');
assert.equal(element._computeLabelClass(
{labels: {Verified: {approved: true, value: 1}}}, 'Verified'),
'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');
assert.equal(element._computeLabelClass({value: 1}),
assert.equal(element._computeLabelClass(
{labels: {'Code-Review': {value: 1}}}, 'Code-Review'),
'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');
assert.equal(element._computeLabelTitle({}, 'Verified'), 'Verified');
assert.equal(element._computeLabelTitle({labels: {}}, 'Verified'),
'Verified');
assert.equal(element._computeLabelTitle(
{approved: {name: 'Diffy'}}, 'Verified'),
{labels: {Verified: {approved: {name: 'Diffy'}}}}, 'Verified'),
'Verified\nby Diffy');
assert.equal(element._computeLabelTitle(
{rejected: {name: 'Diffy'}}, 'Verified'),
{labels: {Verified: {rejected: {name: 'Diffy'}}}}, 'Verified'),
'Verified\nby Diffy');
assert.equal(element._computeLabelTitle(
{disliked: {name: 'Diffy'}, value: -1}, 'Code-Review'),
'Code-Review\nby Diffy');
{labels: {'Code-Review': {disliked: {name: 'Diffy'}, value: -1}}},
'Code-Review'), 'Code-Review\nby Diffy');
assert.equal(element._computeLabelTitle(
{recommended: {name: 'Diffy'}, value: 1}, 'Code-Review'),
'Code-Review\nby Diffy');
{labels: {'Code-Review': {recommended: {name: 'Diffy'}, value: 1}}},
'Code-Review'), 'Code-Review\nby Diffy');
assert.equal(element._computeLabelTitle(
{recommended: {name: 'Diffy'},
rejected: {name: 'Admin'}}, 'Code-Review'),
{labels: {'Code-Review': {recommended: {name: 'Diffy'},
rejected: {name: 'Admin'}}}}, 'Code-Review'),
'Code-Review\nby Admin');
assert.equal(element._computeLabelTitle(
{approved: {name: 'Diffy'},
rejected: {name: 'Admin'}}, 'Code-Review'),
{labels: {'Code-Review': {approved: {name: 'Diffy'},
rejected: {name: 'Admin'}}}}, 'Code-Review'),
'Code-Review\nby Admin');
assert.equal(element._computeLabelTitle(
{recommended: {name: 'Diffy'},
disliked: {name: 'Admin'}, value: -1}, 'Code-Review'),
{labels: {'Code-Review': {recommended: {name: 'Diffy'},
disliked: {name: 'Admin'}, value: -1}}}, 'Code-Review'),
'Code-Review\nby Admin');
assert.equal(element._computeLabelTitle(
{approved: {name: 'Diffy'},
disliked: {name: 'Admin'}, value: -1}, 'Code-Review'),
{labels: {'Code-Review': {approved: {name: 'Diffy'},
disliked: {name: 'Admin'}, value: -1}}}, 'Code-Review'),
'Code-Review\nby Diffy');
assert.equal(element._computeLabelValue(), '');
assert.equal(element._computeLabelValue({}), '');
assert.equal(element._computeLabelValue({approved: true, value: 1}),
'✓');
assert.equal(element._computeLabelValue({value: 1}), '+1');
assert.equal(element._computeLabelValue({value: -1}), '-1');
assert.equal(element._computeLabelValue({approved: true}), '✓');
assert.equal(element._computeLabelValue({rejected: true}), '');
assert.equal(element._computeLabelValue({labels: {}}), '');
assert.equal(element._computeLabelValue({labels: {}}, 'Verified'), '');
assert.equal(element._computeLabelValue(
{labels: {Verified: {approved: true, value: 1}}}, 'Verified'), '✓');
assert.equal(element._computeLabelValue(
{labels: {Verified: {value: 1}}}, 'Verified'), '+1');
assert.equal(element._computeLabelValue(
{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'),
'/projects/combustible-stuff,dashboards/default');

View File

@@ -48,6 +48,24 @@ limitations under the License.
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) {
element.changes = [
{_number: 0},