208 lines
5.8 KiB
JavaScript
208 lines
5.8 KiB
JavaScript
// 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';
|
||
|
||
var COMMIT_MESSAGE_PATH = '/COMMIT_MSG';
|
||
|
||
Polymer({
|
||
is: 'gr-file-list',
|
||
|
||
properties: {
|
||
patchNum: String,
|
||
changeNum: String,
|
||
comments: Object,
|
||
drafts: Object,
|
||
selectedIndex: {
|
||
type: Number,
|
||
notify: true,
|
||
},
|
||
keyEventTarget: {
|
||
type: Object,
|
||
value: function() { return document.body; },
|
||
},
|
||
|
||
_files: Array,
|
||
_loggedIn: {
|
||
type: Boolean,
|
||
value: false,
|
||
},
|
||
_reviewed: {
|
||
type: Array,
|
||
value: function() { return []; },
|
||
},
|
||
},
|
||
|
||
behaviors: [
|
||
Gerrit.KeyboardShortcutBehavior,
|
||
],
|
||
|
||
reload: function() {
|
||
if (!this.changeNum || !this.patchNum) {
|
||
return Promise.resolve();
|
||
}
|
||
|
||
var promises = [];
|
||
var _this = this;
|
||
|
||
promises.push(this._getFiles().then(function(files) {
|
||
_this._files = files;
|
||
}));
|
||
promises.push(this._getLoggedIn().then(function(loggedIn) {
|
||
return _this._loggedIn = loggedIn;
|
||
}).then(function(loggedIn) {
|
||
if (!loggedIn) { return; }
|
||
|
||
return _this._getReviewedFiles().then(function(reviewed) {
|
||
_this._reviewed = reviewed;
|
||
});
|
||
}));
|
||
|
||
return Promise.all(promises);
|
||
},
|
||
|
||
_computeCommentsString: function(comments, patchNum, path) {
|
||
return this._computeCountString(comments, patchNum, path, 'comment');
|
||
},
|
||
|
||
_computeDraftsString: function(drafts, patchNum, path) {
|
||
return this._computeCountString(drafts, patchNum, path, 'draft');
|
||
},
|
||
|
||
_computeCountString: function(comments, patchNum, path, noun) {
|
||
if (!comments) { return ''; }
|
||
|
||
var patchComments = (comments[path] || []).filter(function(c) {
|
||
return parseInt(c.patch_set, 10) === parseInt(patchNum, 10);
|
||
});
|
||
var num = patchComments.length;
|
||
if (num === 0) { return ''; }
|
||
return num + ' ' + noun + (num > 1 ? 's' : '');
|
||
},
|
||
|
||
_computeReviewed: function(file, _reviewed) {
|
||
return _reviewed.indexOf(file.__path) !== -1;
|
||
},
|
||
|
||
_handleReviewedChange: function(e) {
|
||
var path = Polymer.dom(e).rootTarget.getAttribute('data-path');
|
||
var index = this._reviewed.indexOf(path);
|
||
var reviewed = index !== -1;
|
||
if (reviewed) {
|
||
this.splice('_reviewed', index, 1);
|
||
} else {
|
||
this.push('_reviewed', path);
|
||
}
|
||
|
||
this._saveReviewedState(path, !reviewed).catch(function(err) {
|
||
alert('Couldn’t change file review status. Check the console ' +
|
||
'and contact the PolyGerrit team for assistance.');
|
||
throw err;
|
||
}.bind(this));
|
||
},
|
||
|
||
_saveReviewedState: function(path, reviewed) {
|
||
return this.$.restAPI.saveFileReviewed(this.changeNum, this.patchNum,
|
||
path, reviewed);
|
||
},
|
||
|
||
_getLoggedIn: function() {
|
||
return this.$.restAPI.getLoggedIn();
|
||
},
|
||
|
||
_getReviewedFiles: function() {
|
||
return this.$.restAPI.getReviewedFiles(this.changeNum, this.patchNum);
|
||
},
|
||
|
||
_getFiles: function() {
|
||
return this.$.restAPI.getChangeFiles(this.changeNum, this.patchNum).then(
|
||
this._normalizeFilesResponse.bind(this));
|
||
},
|
||
|
||
_normalizeFilesResponse: function(response) {
|
||
var paths = Object.keys(response).sort();
|
||
var files = [];
|
||
for (var i = 0; i < paths.length; i++) {
|
||
var info = response[paths[i]];
|
||
info.__path = paths[i];
|
||
info.lines_inserted = info.lines_inserted || 0;
|
||
info.lines_deleted = info.lines_deleted || 0;
|
||
files.push(info);
|
||
}
|
||
return files;
|
||
},
|
||
|
||
_handleKey: function(e) {
|
||
if (this.shouldSupressKeyboardShortcut(e)) { return; }
|
||
|
||
switch (e.keyCode) {
|
||
case 74: // 'j'
|
||
e.preventDefault();
|
||
this.selectedIndex =
|
||
Math.min(this._files.length - 1, this.selectedIndex + 1);
|
||
break;
|
||
case 75: // 'k'
|
||
e.preventDefault();
|
||
this.selectedIndex = Math.max(0, this.selectedIndex - 1);
|
||
break;
|
||
case 219: // '['
|
||
e.preventDefault();
|
||
this._openSelectedFile(this._files.length - 1);
|
||
break;
|
||
case 221: // ']'
|
||
e.preventDefault();
|
||
this._openSelectedFile(0);
|
||
break;
|
||
case 13: // <enter>
|
||
case 79: // 'o'
|
||
e.preventDefault();
|
||
this._openSelectedFile();
|
||
break;
|
||
}
|
||
},
|
||
|
||
_openSelectedFile: function(opt_index) {
|
||
if (opt_index != null) {
|
||
this.selectedIndex = opt_index;
|
||
}
|
||
page.show(this._computeDiffURL(this.changeNum, this.patchNum,
|
||
this._files[this.selectedIndex].__path));
|
||
},
|
||
|
||
_computeFileSelected: function(index, selectedIndex) {
|
||
return index === selectedIndex;
|
||
},
|
||
|
||
_computeFileStatus: function(status) {
|
||
return status || 'M';
|
||
},
|
||
|
||
_computeDiffURL: function(changeNum, patchNum, path) {
|
||
return '/c/' + changeNum + '/' + patchNum + '/' + path;
|
||
},
|
||
|
||
_computeFileDisplayName: function(path) {
|
||
return path === COMMIT_MESSAGE_PATH ? 'Commit message' : path;
|
||
},
|
||
|
||
_computeClass: function(baseClass, path) {
|
||
var classes = [baseClass];
|
||
if (path === COMMIT_MESSAGE_PATH) {
|
||
classes.push('invisible');
|
||
}
|
||
return classes.join(' ');
|
||
},
|
||
});
|
||
})();
|