blob: e7a0573fcd057e1c4992ad74e79c507e9729ee4b [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-messages-list',
properties: {
changeNum: Number,
messages: {
type: Array,
value: function() { return []; },
},
reviewerUpdates: {
type: Array,
value: function() { return []; },
},
comments: Object,
projectConfig: Object,
topMargin: Number,
showReplyButtons: {
type: Boolean,
value: false,
},
_expanded: {
type: Boolean,
value: false,
},
},
scrollToMessage: function(messageID) {
var el = this.$$('[data-message-id="' + messageID + '"]');
if (!el) { return; }
el.expanded = true;
var top = el.offsetTop;
for (var offsetParent = el.offsetParent;
offsetParent;
offsetParent = offsetParent.offsetParent) {
top += offsetParent.offsetTop;
}
window.scrollTo(0, top - this.topMargin);
this._highlightEl(el);
},
_computeItems: function(messages, reviewerUpdates) {
messages = messages || [];
reviewerUpdates = reviewerUpdates || [];
var mi = 0;
var ri = 0;
var result = [];
var mDate;
var rDate;
for (var i = 0; i < messages.length; i++) {
messages[i]._index = i;
}
while (mi < messages.length || ri < reviewerUpdates.length) {
if (mi >= messages.length) {
result = result.concat(reviewerUpdates.slice(ri));
break;
}
if (ri >= reviewerUpdates.length) {
result = result.concat(messages.slice(mi));
break;
}
mDate = mDate || util.parseDate(messages[mi].date);
rDate = rDate || util.parseDate(reviewerUpdates[ri].updated);
if (rDate < mDate) {
result.push(reviewerUpdates[ri++]);
rDate = null;
} else {
result.push(messages[mi++]);
mDate = null;
}
}
return result;
},
_highlightEl: function(el) {
var highlightedEls =
Polymer.dom(this.root).querySelectorAll('.highlighted');
for (var i = 0; i < highlightedEls.length; i++) {
highlightedEls[i].classList.remove('highlighted');
}
function handleAnimationEnd() {
el.removeEventListener('animationend', handleAnimationEnd);
el.classList.remove('highlighted');
}
el.addEventListener('animationend', handleAnimationEnd);
el.classList.add('highlighted');
},
_handleExpandCollapseTap: function(e) {
e.preventDefault();
this._expanded = !this._expanded;
var messageEls = Polymer.dom(this.root).querySelectorAll('gr-message');
for (var i = 0; i < messageEls.length; i++) {
messageEls[i].expanded = this._expanded;
}
},
_handleScrollTo: function(e) {
this.scrollToMessage(e.detail.message.id);
},
_computeExpandCollapseMessage: function(expanded) {
return expanded ? 'Collapse all' : 'Expand all';
},
_computeCommentsForMessage: function(comments, message) {
if (message._index === undefined || !comments || !this.messages) {
return [];
}
var index = message._index;
var messages = this.messages || [];
var msgComments = {};
var mDate = util.parseDate(message.date);
var nextMDate;
if (index < messages.length - 1) {
nextMDate = util.parseDate(messages[index + 1].date);
}
for (var file in comments) {
var fileComments = comments[file];
for (var i = 0; i < fileComments.length; i++) {
var cDate = util.parseDate(fileComments[i].updated);
if (cDate >= mDate) {
if (nextMDate && cDate >= nextMDate) {
continue;
}
msgComments[file] = msgComments[file] || [];
msgComments[file].push(fileComments[i]);
}
}
}
return msgComments;
},
});
})();