Merge "Display comment resolve state"
This commit is contained in:
@@ -23,13 +23,18 @@ limitations under the License.
|
||||
<template>
|
||||
<style>
|
||||
:host {
|
||||
background-color: #ffd;
|
||||
border: 1px solid #bbb;
|
||||
display: block;
|
||||
white-space: normal;
|
||||
}
|
||||
#container {
|
||||
background-color: #fcfad6;
|
||||
}
|
||||
#container.unresolved {
|
||||
background-color: #fcfaa6;
|
||||
}
|
||||
</style>
|
||||
<div id="container">
|
||||
<div id="container" class$="[[_computeHostClass(_unresolved)]]">
|
||||
<template id="commentList" is="dom-repeat" items="[[_orderedComments]]" as="comment">
|
||||
<gr-diff-comment
|
||||
comment="{{comment}}"
|
||||
|
||||
@@ -45,6 +45,10 @@
|
||||
|
||||
_showActions: Boolean,
|
||||
_orderedComments: Array,
|
||||
_unresolved: {
|
||||
type: Boolean,
|
||||
notify: true,
|
||||
},
|
||||
},
|
||||
|
||||
behaviors: [
|
||||
@@ -56,7 +60,7 @@
|
||||
},
|
||||
|
||||
observers: [
|
||||
'_commentsChanged(comments.splices)',
|
||||
'_commentsChanged(comments.*)',
|
||||
],
|
||||
|
||||
keyBindings: {
|
||||
@@ -83,6 +87,7 @@
|
||||
addDraft: function(opt_lineNum, opt_range) {
|
||||
var draft = this._newDraft(opt_lineNum, opt_range);
|
||||
draft.__editing = true;
|
||||
draft.unresolved = true;
|
||||
this.push('comments', draft);
|
||||
},
|
||||
|
||||
@@ -92,6 +97,11 @@
|
||||
|
||||
_commentsChanged: function(changeRecord) {
|
||||
this._orderedComments = this._sortedComments(this.comments);
|
||||
this._unresolved = this._getLastComment().unresolved;
|
||||
},
|
||||
|
||||
_getLastComment: function() {
|
||||
return this._orderedComments[this._orderedComments.length - 1] || {};
|
||||
},
|
||||
|
||||
_handleEKey: function(e) {
|
||||
@@ -125,11 +135,13 @@
|
||||
});
|
||||
},
|
||||
|
||||
_createReplyComment: function(parent, content, opt_isEditing) {
|
||||
_createReplyComment: function(parent, content, opt_isEditing,
|
||||
opt_unresolved) {
|
||||
var reply = this._newReply(
|
||||
this._orderedComments[this._orderedComments.length - 1].id,
|
||||
parent.line,
|
||||
content);
|
||||
content,
|
||||
opt_unresolved);
|
||||
|
||||
// If there is currently a comment in an editing state, add an attribute
|
||||
// so that the gr-diff-comment knows not to populate the draft text.
|
||||
@@ -162,17 +174,17 @@
|
||||
var msg = comment.message;
|
||||
quoteStr = '> ' + msg.replace(NEWLINE_PATTERN, '\n> ') + '\n\n';
|
||||
}
|
||||
this._createReplyComment(comment, quoteStr, true);
|
||||
this._createReplyComment(comment, quoteStr, true, comment.unresolved);
|
||||
},
|
||||
|
||||
_handleCommentAck: function(e) {
|
||||
var comment = e.detail.comment;
|
||||
this._createReplyComment(comment, 'Ack');
|
||||
this._createReplyComment(comment, 'Ack', false, comment.unresolved);
|
||||
},
|
||||
|
||||
_handleCommentDone: function(e) {
|
||||
var comment = e.detail.comment;
|
||||
this._createReplyComment(comment, 'Done');
|
||||
this._createReplyComment(comment, 'Done', false, false);
|
||||
},
|
||||
|
||||
_handleCommentFix: function(e) {
|
||||
@@ -180,7 +192,7 @@
|
||||
var msg = comment.message;
|
||||
var quoteStr = '> ' + msg.replace(NEWLINE_PATTERN, '\n> ') + '\n\n';
|
||||
var response = quoteStr + 'Please Fix';
|
||||
this._createReplyComment(comment, response);
|
||||
this._createReplyComment(comment, response, false, true);
|
||||
},
|
||||
|
||||
_commentElWithDraftID: function(id) {
|
||||
@@ -193,12 +205,15 @@
|
||||
return null;
|
||||
},
|
||||
|
||||
_newReply: function(inReplyTo, opt_lineNum, opt_message) {
|
||||
_newReply: function(inReplyTo, opt_lineNum, opt_message, opt_unresolved) {
|
||||
var d = this._newDraft(opt_lineNum);
|
||||
d.in_reply_to = inReplyTo;
|
||||
if (opt_message != null) {
|
||||
d.message = opt_message;
|
||||
}
|
||||
if (opt_unresolved !== undefined) {
|
||||
d.unresolved = opt_unresolved;
|
||||
}
|
||||
return d;
|
||||
},
|
||||
|
||||
@@ -261,7 +276,7 @@
|
||||
console.error('Comment update for another comment thread.');
|
||||
return;
|
||||
}
|
||||
this.comments[index] = comment;
|
||||
this.set(['comments', index], comment);
|
||||
},
|
||||
|
||||
_indexOf: function(comment, arr) {
|
||||
@@ -274,5 +289,9 @@
|
||||
}
|
||||
return -1;
|
||||
},
|
||||
|
||||
_computeHostClass: function(unresolved) {
|
||||
return unresolved ? 'unresolved' : '';
|
||||
},
|
||||
});
|
||||
})();
|
||||
|
||||
@@ -240,6 +240,7 @@ limitations under the License.
|
||||
assert.equal(drafts.length, 1);
|
||||
assert.equal(drafts[0].message, 'Done');
|
||||
assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
|
||||
assert.isFalse(drafts[0].unresolved);
|
||||
done();
|
||||
});
|
||||
commentEl.fire('create-done-comment', {comment: commentEl.comment},
|
||||
@@ -259,6 +260,7 @@ limitations under the License.
|
||||
assert.equal(
|
||||
drafts[0].message, '> is this a crossover episode!?\n\nPlease Fix');
|
||||
assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
|
||||
assert.isTrue(drafts[0].unresolved);
|
||||
done();
|
||||
});
|
||||
commentEl.fire('create-fix-comment', {comment: commentEl.comment},
|
||||
@@ -462,13 +464,15 @@ limitations under the License.
|
||||
assert.strictEqual(element.comments[0], updatedComment);
|
||||
});
|
||||
|
||||
test('orphan replies', function() {
|
||||
var comments = [
|
||||
suite('jack and sally comment data test consolidation', function() {
|
||||
setup(function() {
|
||||
element.comments = [
|
||||
{
|
||||
id: 'jacks_reply',
|
||||
message: 'i like you, too',
|
||||
in_reply_to: 'sallys_confession',
|
||||
updated: '2015-12-25 15:00:20.396000000',
|
||||
unresolved: false,
|
||||
}, {
|
||||
id: 'sallys_confession',
|
||||
in_reply_to: 'nonexistent_comment',
|
||||
@@ -484,70 +488,41 @@ limitations under the License.
|
||||
message: 'i will poison you so i can get away',
|
||||
updated: '2015-10-31 15:00:20.396000000',
|
||||
}];
|
||||
element.comments = comments;
|
||||
assert.equal(4, element._orderedComments.length);
|
||||
});
|
||||
|
||||
test('orphan replies', function() {
|
||||
assert.equal(4, element._orderedComments.length);
|
||||
});
|
||||
|
||||
test('keyboard shortcuts', function() {
|
||||
var expandCollapseStub = sinon.stub(element, '_expandCollapseComments');
|
||||
MockInteractions.pressAndReleaseKeyOn(element, 69, null, 'e');
|
||||
assert.isTrue(expandCollapseStub.lastCall.calledWith(false));
|
||||
|
||||
MockInteractions.pressAndReleaseKeyOn(element, 69, 'shift', 'e');
|
||||
assert.isTrue(expandCollapseStub.lastCall.calledWith(true));
|
||||
expandCollapseStub.restore();
|
||||
});
|
||||
|
||||
test('comment in_reply_to is either null or most recent comment id',
|
||||
function() {
|
||||
element._createReplyComment(element.comments[3], 'dummy', true);
|
||||
flushAsynchronousOperations();
|
||||
assert.equal(element._orderedComments.length, 5);
|
||||
assert.equal(element._orderedComments[4].in_reply_to, 'jacks_reply');
|
||||
});
|
||||
|
||||
test('resolvable comments', function() {
|
||||
assert.isFalse(element._unresolved);
|
||||
element._createReplyComment(element.comments[3], 'dummy', true, true);
|
||||
flushAsynchronousOperations();
|
||||
assert.isTrue(element._unresolved);
|
||||
});
|
||||
});
|
||||
|
||||
test('keyboard shortcuts', function() {
|
||||
var comments = [
|
||||
{
|
||||
id: 'jacks_reply',
|
||||
message: 'i like you, too',
|
||||
in_reply_to: 'sallys_confession',
|
||||
updated: '2015-12-25 15:00:20.396000000',
|
||||
}, {
|
||||
id: 'sallys_confession',
|
||||
in_reply_to: 'nonexistent_comment',
|
||||
message: 'i like you, jack',
|
||||
updated: '2015-12-24 15:00:20.396000000',
|
||||
}, {
|
||||
id: 'sally_to_dr_finklestein',
|
||||
in_reply_to: 'nonexistent_comment',
|
||||
message: 'i’m running away',
|
||||
updated: '2015-10-31 09:00:20.396000000',
|
||||
}, {
|
||||
id: 'sallys_defiance',
|
||||
message: 'i will poison you so i can get away',
|
||||
updated: '2015-10-31 15:00:20.396000000',
|
||||
}];
|
||||
element.comments = comments;
|
||||
var expandCollapseStub = sinon.stub(element, '_expandCollapseComments');
|
||||
MockInteractions.pressAndReleaseKeyOn(element, 69, null, 'e');
|
||||
assert.isTrue(expandCollapseStub.lastCall.calledWith(false));
|
||||
|
||||
MockInteractions.pressAndReleaseKeyOn(element, 69, 'shift', 'e');
|
||||
assert.isTrue(expandCollapseStub.lastCall.calledWith(true));
|
||||
expandCollapseStub.restore();
|
||||
});
|
||||
|
||||
test('comment in_reply_to is either null or most recent comment id',
|
||||
function() {
|
||||
var comments = [
|
||||
{
|
||||
id: 'jacks_reply',
|
||||
message: 'i like you, too',
|
||||
in_reply_to: 'sallys_confession',
|
||||
updated: '2015-12-25 15:00:20.396000000',
|
||||
}, {
|
||||
id: 'sallys_confession',
|
||||
in_reply_to: 'nonexistent_comment',
|
||||
message: 'i like you, jack',
|
||||
updated: '2015-12-24 15:00:20.396000000',
|
||||
}, {
|
||||
id: 'sally_to_dr_finklestein',
|
||||
in_reply_to: 'nonexistent_comment',
|
||||
message: 'i’m running away',
|
||||
updated: '2015-10-31 09:00:20.396000000',
|
||||
}, {
|
||||
id: 'sallys_defiance',
|
||||
message: 'i will poison you so i can get away',
|
||||
updated: '2015-10-31 15:00:20.396000000',
|
||||
}];
|
||||
element.set('comments', comments);
|
||||
element._createReplyComment(comments[3], 'dummy', true);
|
||||
flushAsynchronousOperations();
|
||||
assert.equal(element._orderedComments.length, 5);
|
||||
assert.equal(element._orderedComments[4].in_reply_to, 'jacks_reply');
|
||||
test('_computeHostClass', function() {
|
||||
assert.equal(element._computeHostClass(true), 'unresolved');
|
||||
assert.equal(element._computeHostClass(false), '');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -109,7 +109,8 @@ limitations under the License.
|
||||
display: inline;
|
||||
}
|
||||
.draft:not(.editing) .save,
|
||||
.draft:not(.editing) .cancel {
|
||||
.draft:not(.editing) .cancel,
|
||||
.draft:not(.editing) .resolve {
|
||||
display: none;
|
||||
}
|
||||
.editing .message,
|
||||
@@ -170,6 +171,13 @@ limitations under the License.
|
||||
#container.collapsed iron-autogrow-textarea {
|
||||
display: none;
|
||||
}
|
||||
.resolve {
|
||||
margin: auto;
|
||||
}
|
||||
.resolve label {
|
||||
color: #333;
|
||||
font-size: 12px;
|
||||
}
|
||||
</style>
|
||||
<div id="container"
|
||||
class="container"
|
||||
|
||||
@@ -114,6 +114,11 @@
|
||||
value: '',
|
||||
observer: '_messageTextChanged',
|
||||
},
|
||||
|
||||
resolved: {
|
||||
type: Boolean,
|
||||
observer: '_toggleResolved',
|
||||
},
|
||||
},
|
||||
|
||||
observers: [
|
||||
@@ -186,6 +191,7 @@
|
||||
|
||||
_commentChanged: function(comment) {
|
||||
this.editing = !!comment.__editing;
|
||||
this.resolved = !comment.unresolved;
|
||||
if (this.editing) { // It's a new draft/reply, notify.
|
||||
this._fireUpdate();
|
||||
}
|
||||
@@ -354,6 +360,7 @@
|
||||
|
||||
_handleSave: function(e) {
|
||||
e.preventDefault();
|
||||
this.set('comment.__editing', false);
|
||||
this.save();
|
||||
},
|
||||
|
||||
@@ -439,5 +446,14 @@
|
||||
_handleMouseLeave: function(e) {
|
||||
this.fire('comment-mouse-out', this._getEventPayload());
|
||||
},
|
||||
|
||||
_handleToggleResolved: function() {
|
||||
this.resolved = !this.resolved;
|
||||
},
|
||||
|
||||
_toggleResolved: function(resolved) {
|
||||
this.comment.unresolved = !resolved;
|
||||
this.fire('comment-update', this._getEventPayload());
|
||||
},
|
||||
});
|
||||
})();
|
||||
|
||||
@@ -129,13 +129,6 @@ limitations under the License.
|
||||
MockInteractions.tap(element.$$('.done'));
|
||||
});
|
||||
|
||||
test('proper event fires on fix', function(done) {
|
||||
element.addEventListener('create-fix-comment', function(e) {
|
||||
done();
|
||||
});
|
||||
MockInteractions.tap(element.$$('.fix'));
|
||||
});
|
||||
|
||||
test('clicking on date link does not trigger nav', function() {
|
||||
var showStub = sinon.stub(page, 'show');
|
||||
var dateEl = element.$$('.date');
|
||||
@@ -480,6 +473,7 @@ limitations under the License.
|
||||
line: 5,
|
||||
path: '/path/to/file',
|
||||
message: 'good news, everyone!',
|
||||
unresolved: false,
|
||||
},
|
||||
patchNum: 1,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user