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-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 '✓';
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
@@ -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},
|
||||||
|
|||||||
Reference in New Issue
Block a user