| // 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(' '); |
| }, |
| }); |
| })(); |