Merge "Add support for labels other than Code-Review and Verified in list"
This commit is contained in:
@@ -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 '✓';
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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},
|
||||
|
||||
Reference in New Issue
Block a user