blob: 4e17253dc530f109e110c94bd81be1bb73d92c40 [file] [log] [blame]
// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
(function() {
'use strict';
Polymer({
is: 'gr-change-list',
hostAttributes: {
tabindex: 0,
},
properties: {
/**
* The logged-in user's account, or an empty object if no user is logged
* in.
*/
account: {
type: Object,
value: function() { return {}; },
},
/**
* An array of ChangeInfo objects to render.
* https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#change-info
*/
changes: {
type: Array,
observer: '_changesChanged',
},
/**
* ChangeInfo objects grouped into arrays. The groups and changes
* properties should not be used together.
*/
groups: {
type: Array,
value: function() { return []; },
},
groupTitles: {
type: Array,
value: function() { return []; },
},
labelNames: {
type: Array,
computed: '_computeLabelNames(groups)',
},
selectedIndex: {
type: Number,
notify: true,
},
showNumber: Boolean, // No default value to prevent flickering.
showStar: {
type: Boolean,
value: false,
},
showReviewedState: {
type: Boolean,
value: false,
},
keyEventTarget: {
type: Object,
value: function() { return document.body; },
},
},
behaviors: [
Gerrit.KeyboardShortcutBehavior,
Gerrit.RESTClientBehavior,
],
attached: function() {
this._loadPreferences();
},
_loadPreferences: function() {
return this._getLoggedIn().then(function(loggedIn) {
if (!loggedIn) {
this.showNumber = false;
return;
}
return this._getPreferences().then(function(preferences) {
this.showNumber = !!(preferences &&
preferences.legacycid_in_change_table);
}.bind(this));
}.bind(this));
},
_getLoggedIn: function() {
return this.$.restAPI.getLoggedIn();
},
_getPreferences: function() {
return this.$.restAPI.getPreferences();
},
_computeLabelNames: function(groups) {
if (!groups) { return []; }
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 ? [changes] : [];
},
_groupTitle: function(groupIndex) {
if (groupIndex > this.groupTitles.length - 1) { return null; }
return this.groupTitles[groupIndex];
},
_computeItemSelected: function(index, groupIndex, selectedIndex) {
var idx = 0;
for (var i = 0; i < groupIndex; i++) {
idx += this.groups[i].length;
}
idx += index;
return idx == selectedIndex;
},
_computeItemNeedsReview: function(account, change, showReviewedState) {
return showReviewedState && !change.reviewed &&
this.changeIsOpen(change.status) &&
account._account_id != change.owner._account_id;
},
_handleKey: function(e) {
if (this.shouldSupressKeyboardShortcut(e)) { return; }
if (this.groups == null) { return; }
var len = 0;
this.groups.forEach(function(group) {
len += group.length;
});
switch (e.keyCode) {
case 74: // 'j'
e.preventDefault();
if (this.selectedIndex == len - 1) { return; }
this.selectedIndex += 1;
break;
case 75: // 'k'
e.preventDefault();
if (this.selectedIndex == 0) { return; }
this.selectedIndex -= 1;
break;
case 79: // 'o'
case 13: // 'enter'
e.preventDefault();
page.show(this._changeURLForIndex(this.selectedIndex));
break;
}
},
_changeURLForIndex: function(index) {
var changeEls = this._getListItems();
if (index < changeEls.length && changeEls[index]) {
return changeEls[index].changeURL;
}
return '';
},
_getListItems: function() {
return Polymer.dom(this.root).querySelectorAll('gr-change-list-item');
},
});
})();