0ef8e2f35a
The former is not a JS identifier, which is not guaranteed to work in computed properties. Change-Id: Ia5359bf00beea3800b4a8d64cd59557cd62e0a0d
197 lines
5.9 KiB
HTML
197 lines
5.9 KiB
HTML
<!--
|
|
Copyright (C) 2015 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.
|
|
-->
|
|
|
|
<link rel="import" href="../bower_components/polymer/polymer.html">
|
|
<link rel="import" href="../bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
|
|
<link rel="import" href="../styles/gr-change-list-styles.html">
|
|
<link rel="import" href="gr-change-list-item.html">
|
|
|
|
<dom-module id="gr-change-list">
|
|
<template>
|
|
<style>
|
|
:host {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
.headerRow {
|
|
display: flex;
|
|
}
|
|
.topHeader,
|
|
.groupHeader {
|
|
border-bottom: 1px solid #eee;
|
|
font-weight: bold;
|
|
padding: .3em .5em;
|
|
}
|
|
.topHeader {
|
|
background-color: #ddd;
|
|
flex-shrink: 0;
|
|
}
|
|
</style>
|
|
<style include="gr-change-list-styles"></style>
|
|
<div class="headerRow">
|
|
<span class="topHeader keyboard"></span> <!-- keyboard position indicator -->
|
|
<span class="topHeader subject">Subject</span>
|
|
<span class="topHeader status">Status</span>
|
|
<span class="topHeader owner">Owner</span>
|
|
<span class="topHeader project">Project</span>
|
|
<span class="topHeader branch">Branch</span>
|
|
<span class="topHeader updated">Updated</span>
|
|
<span class="topHeader size">Size</span>
|
|
<span class="topHeader codeReview" title="Code-Review">CR</span>
|
|
<span class="topHeader verified" title="Verified">V</span>
|
|
</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]]"
|
|
selected="[[_isSelected(groupIndex, index)]]"></gr-change-list-item>
|
|
</template>
|
|
</template>
|
|
</template>
|
|
|
|
<script>
|
|
(function() {
|
|
'use strict';
|
|
|
|
Polymer({
|
|
is: 'gr-change-list',
|
|
|
|
behaviors: [
|
|
Polymer.IronA11yKeysBehavior
|
|
],
|
|
|
|
hostAttributes: {
|
|
tabindex: 0,
|
|
},
|
|
|
|
properties: {
|
|
/**
|
|
* 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 []; },
|
|
observer: '_groupsChanged',
|
|
},
|
|
keyEventTarget: {
|
|
type: Object,
|
|
value: function() {
|
|
return document.body;
|
|
}
|
|
},
|
|
groupTitles: {
|
|
type: Array,
|
|
value: function() { return []; },
|
|
},
|
|
selectedIndex: {
|
|
type: Number,
|
|
value: 0,
|
|
observer: '_selectedIndexChanged',
|
|
},
|
|
},
|
|
|
|
keyBindings: {
|
|
'j k o enter': '_handleKey',
|
|
},
|
|
|
|
_isSelected: function(groupIndex, index) {
|
|
return index == this.selectedIndex;
|
|
},
|
|
|
|
_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'];
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
_groupTitle: function(groupIndex) {
|
|
if (groupIndex > this.groupTitles.length - 1) { return null; }
|
|
return this.groupTitles[groupIndex];
|
|
},
|
|
|
|
_selectedIndexChanged: function(value) {
|
|
// Don't re-render the entire list.
|
|
var changeEls = this._getListItems();
|
|
for (var i = 0; i < changeEls.length; i++) {
|
|
changeEls[i].toggleAttribute('selected', i == value);
|
|
}
|
|
},
|
|
|
|
_handleKey: function(e) {
|
|
if (util.shouldSupressKeyboardShortcut(e)) { return; }
|
|
|
|
if (this.groups == null) { return; }
|
|
var len = 0;
|
|
this.groups.forEach(function(group) {
|
|
len += group.length;
|
|
});
|
|
switch(e.detail.combo) {
|
|
case 'j':
|
|
if (this.selectedIndex == len - 1) { return; }
|
|
this.selectedIndex += 1;
|
|
break;
|
|
case 'k':
|
|
if (this.selectedIndex == 0) { return; }
|
|
this.selectedIndex -= 1;
|
|
break;
|
|
case 'o':
|
|
case 'enter':
|
|
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');
|
|
},
|
|
|
|
});
|
|
})();
|
|
</script>
|
|
</dom-module>
|