diff options
author | Phil Hughes <me@iamphill.com> | 2018-11-23 09:22:11 +0000 |
---|---|---|
committer | Steve Azzopardi <steveazz@outlook.com> | 2018-11-30 10:27:14 +0100 |
commit | 103d453a00bff872e018696e5f690b52b15510ea (patch) | |
tree | 569f63549031ffa48aafa62239ac7c405cd67731 | |
parent | c35ed731a23980c8a247f97e57e87dd00a610be1 (diff) | |
download | gitlab-ce-103d453a00bff872e018696e5f690b52b15510ea.tar.gz |
Merge branch '_acet-fix-unable-to-reply-resolved-nondiff-discussion' into 'master'
Allow commenting to resolved non-diff discussions
Closes #54330
See merge request gitlab-org/gitlab-ce!23279
3 files changed, 56 insertions, 6 deletions
diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue index c1dfa036678..cdcec0862de 100644 --- a/app/assets/javascripts/notes/components/noteable_discussion.vue +++ b/app/assets/javascripts/notes/components/noteable_discussion.vue @@ -69,7 +69,7 @@ export default { isReplying: false, isResolving: false, resolveAsThread: true, - isRepliesCollapsed: (!this.discussion.diff_discussion && this.discussion.resolved) || false, + isRepliesToggledByUser: false, }; }, computed: { @@ -189,6 +189,15 @@ export default { return isExpanded || this.alwaysExpanded || isResolvedNonDiffDiscussion; }, + isRepliesCollapsed() { + const { discussion, isRepliesToggledByUser } = this; + const { resolved, notes } = discussion; + const hasReplies = notes.length > 1; + + return ( + (!discussion.diff_discussion && resolved && hasReplies && !isRepliesToggledByUser) || false + ); + }, }, watch: { isReplying() { @@ -233,7 +242,7 @@ export default { this.toggleDiscussion({ discussionId: this.discussion.id }); }, toggleReplies() { - this.isRepliesCollapsed = !this.isRepliesCollapsed; + this.isRepliesToggledByUser = !this.isRepliesToggledByUser; }, showReplyForm() { this.isReplying = true; diff --git a/app/assets/javascripts/notes/components/toggle_replies_widget.vue b/app/assets/javascripts/notes/components/toggle_replies_widget.vue index 78ecbbb9247..e59cc4cfc0b 100644 --- a/app/assets/javascripts/notes/components/toggle_replies_widget.vue +++ b/app/assets/javascripts/notes/components/toggle_replies_widget.vue @@ -42,10 +42,7 @@ export default { </script> <template> - <li - :class="className" - class="replies-toggle" - > + <li :class="className" class="replies-toggle js-toggle-replies"> <template v-if="collapsed"> <icon name="chevron-right" diff --git a/spec/javascripts/notes/components/noteable_discussion_spec.js b/spec/javascripts/notes/components/noteable_discussion_spec.js index 81cb3e1f74d..4b4403689d9 100644 --- a/spec/javascripts/notes/components/noteable_discussion_spec.js +++ b/spec/javascripts/notes/components/noteable_discussion_spec.js @@ -6,6 +6,7 @@ import { noteableDataMock, discussionMock, notesDataMock } from '../mock_data'; import mockDiffFile from '../../diffs/mock_data/diff_file'; const discussionWithTwoUnresolvedNotes = 'merge_requests/resolved_diff_discussion.json'; +const diffDiscussionFixture = 'merge_requests/diff_discussion.json'; describe('noteable_discussion component', () => { const Component = Vue.extend(noteableDiscussion); @@ -115,6 +116,49 @@ describe('noteable_discussion component', () => { .catch(done.fail); }); }); + + describe('isRepliesCollapsed', () => { + it('should return false for diff discussions', done => { + const diffDiscussion = getJSONFixture(diffDiscussionFixture)[0]; + vm.$store.dispatch('setInitialNotes', [diffDiscussion]); + + Vue.nextTick() + .then(() => { + expect(vm.isRepliesCollapsed).toEqual(false); + expect(vm.$el.querySelector('.js-toggle-replies')).not.toBeNull(); + expect(vm.$el.querySelector('.discussion-reply-holder')).not.toBeNull(); + }) + .then(done) + .catch(done.fail); + }); + + it('should return false if discussion does not have a reply', () => { + const discussion = { ...discussionMock, resolved: true }; + discussion.notes = discussion.notes.slice(0, 1); + const noRepliesVm = new Component({ + store, + propsData: { discussion }, + }).$mount(); + + expect(noRepliesVm.isRepliesCollapsed).toEqual(false); + expect(noRepliesVm.$el.querySelector('.js-toggle-replies')).toBeNull(); + expect(vm.$el.querySelector('.discussion-reply-holder')).not.toBeNull(); + noRepliesVm.$destroy(); + }); + + it('should return true for resolved non-diff discussion which has replies', () => { + const discussion = { ...discussionMock, resolved: true }; + const resolvedDiscussionVm = new Component({ + store, + propsData: { discussion }, + }).$mount(); + + expect(resolvedDiscussionVm.isRepliesCollapsed).toEqual(true); + expect(resolvedDiscussionVm.$el.querySelector('.js-toggle-replies')).not.toBeNull(); + expect(vm.$el.querySelector('.discussion-reply-holder')).not.toBeNull(); + resolvedDiscussionVm.$destroy(); + }); + }); }); describe('methods', () => { |