From d6453e75b7100ee94c3d125d21627961adcaa8cc Mon Sep 17 00:00:00 2001 From: Bob Van Landuyt Date: Mon, 27 Feb 2017 16:01:56 +0100 Subject: [PATCH] Add a button to delegate all discussions in a merge request --- app/assets/stylesheets/pages/notes.scss | 20 +++++ .../_new_issue_for_all_discussions.html.haml | 6 ++ .../projects/merge_requests/_show.html.haml | 1 + .../img/btn_new_issue_for_all_discussions.png | Bin 0 -> 29007 bytes .../merge_request_discussion_resolution.md | 14 +++- ...e_for_discussions_in_merge_request_spec.rb | 73 ++++++++++++------ 6 files changed, 86 insertions(+), 28 deletions(-) create mode 100644 app/views/discussions/_new_issue_for_all_discussions.html.haml create mode 100644 doc/user/project/merge_requests/img/btn_new_issue_for_all_discussions.png diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index dc79de19d48..71005a4666e 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -510,6 +510,7 @@ ul.notes { } .line-resolve-all-container { + .btn-group { margin-left: -4px; } @@ -518,6 +519,25 @@ ul.notes { border-top-left-radius: 0; border-bottom-left-radius: 0; } + + .btn.discussion-create-issue-btn { + margin-left: 4px; + + a { + padding: 0; + line-height: 0; + + &:hover { + text-decoration: none; + border: 0; + } + } + + .new-issue-for-discussion path { + fill: $gray-darkest; + } + } + } .line-resolve-all { diff --git a/app/views/discussions/_new_issue_for_all_discussions.html.haml b/app/views/discussions/_new_issue_for_all_discussions.html.haml new file mode 100644 index 00000000000..21fbbbee54b --- /dev/null +++ b/app/views/discussions/_new_issue_for_all_discussions.html.haml @@ -0,0 +1,6 @@ +- if merge_request.discussions_can_be_resolved_by?(current_user) && can?(current_user, :create_issue, @project) + .btn-group{ role: "group", "v-if" => "unresolvedDiscussionCount > 0" } + .btn.btn-default.discussion-create-issue-btn.has-tooltip{ title: "Resolve all discussions in new issue", + "aria-label" => "Resolve all discussions in new issue", + "data-container" => "body" } + = link_to custom_icon('icon_mr_issue'), new_namespace_project_issue_path(@project.namespace, @project, merge_request_for_resolving_discussions: merge_request.iid), title: "Resolve all discussions in new issue", class: 'new-issue-for-discussion' diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 17be0490a86..524cec5e1f9 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -83,6 +83,7 @@ %span.line-resolve-text {{ resolvedDiscussionCount }}/{{ discussionCount }} {{ resolvedCountText }} resolved = render "discussions/jump_to_next" + = render "discussions/new_issue_for_all_discussions", merge_request: @merge_request .tab-content#diff-notes-app #notes.notes.tab-pane.voting_notes diff --git a/doc/user/project/merge_requests/img/btn_new_issue_for_all_discussions.png b/doc/user/project/merge_requests/img/btn_new_issue_for_all_discussions.png new file mode 100644 index 0000000000000000000000000000000000000000..b15447ec2909687ae11747fb880419c6cec96bb5 GIT binary patch literal 29007 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
    BGuLYFA6LVy2;C%{wqEd2gNd*u1 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 [Introduced][ce-7180] in GitLab 8.15. +> [Introduced][ce-8266] -To delegate unresolved discussions to a new issue you can click the link **open -an issue to resolve them later**. +To continue all open discussions in a merge request, click the button **Resolve +all discussions in new issue** -![Open new issue from unresolved discussions](img/resolve_discussion_open_issue.png) +![Open new issue for all unresolved discussions](img/btn_new_issue_for_all_discussions.png) + +Alternatively, when your project only accepts merge requests when all discussions +are resolved, there will be an **open an issue to resolve them later** link in +the merge request-widget. + +![Link in merge request widget](img/resolve_discussion_open_issue.png) This will prepare an issue with content referring to the merge request and discussions. diff --git a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb index 62ecd0100ae..4751b16013d 100644 --- a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb +++ b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb @@ -1,54 +1,79 @@ require 'rails_helper' -feature 'Resolving all open discussions in a merge request from an issue', feature: true do +feature 'Resolving all open discussions in a merge request from an issue', feature: true, js: true do let(:user) { create(:user) } - let(:project) { create(:project, only_allow_merge_if_all_discussions_are_resolved: true) } + let(:project) { create(:project) } let(:merge_request) { create(:merge_request, source_project: project) } let!(:discussion) { Discussion.for_diff_notes([create(:diff_note_on_merge_request, noteable: merge_request, project: project)]).first } before do project.team << [user, :master] login_as user + visit namespace_project_merge_request_path(project.namespace, project, merge_request) end - context 'with the internal tracker disabled' do - before do - project.project_feature.update_attribute(:issues_access_level, ProjectFeature::DISABLED) - visit namespace_project_merge_request_path(project.namespace, project, merge_request) - end - - it 'does not show a link to create a new issue' do - expect(page).not_to have_link 'open an issue to resolve them later' + it 'shows a button to resolve all discussions by creating a new issue' do + within('li#resolve-count-app') do + expect(page).to have_link "Resolve all discussions in new issue", href: new_namespace_project_issue_path(project.namespace, project, merge_request_for_resolving_discussions: merge_request.iid) end end - context 'merge request has discussions that need to be resolved' do + context 'resolving the discussion' do before do - visit namespace_project_merge_request_path(project.namespace, project, merge_request) + click_button 'Resolve discussion' end - it 'shows a warning that the merge request contains unresolved discussions' do - expect(page).to have_content 'This merge request has unresolved discussions' + it 'hides the link for creating a new issue' do + expect(page).not_to have_link "Resolve all discussions in new issue", href: new_namespace_project_issue_path(project.namespace, project, merge_request_for_resolving_discussions: merge_request.iid) + end + end + + context 'creating an issue for discussions' do + before do + click_link "Resolve all discussions in new issue", href: new_namespace_project_issue_path(project.namespace, project, merge_request_for_resolving_discussions: merge_request.iid) end - it 'has a link to resolve all discussions by creating an issue' do - page.within '.mr-widget-body' do - expect(page).to have_link 'open an issue to resolve them later', href: new_namespace_project_issue_path(project.namespace, project, merge_request_for_resolving_discussions: merge_request.iid) - end + it_behaves_like 'creating an issue for a discussion' + end + + context 'for a project where all discussions need to be resolved before merging' do + before do + project.update_attribute(:only_allow_merge_if_all_discussions_are_resolved, true) end - context 'creating an issue for discussions' do + context 'with the internal tracker disabled' do before do - page.click_link 'open an issue to resolve them later', href: new_namespace_project_issue_path(project.namespace, project, merge_request_for_resolving_discussions: merge_request.iid) + project.project_feature.update_attribute(:issues_access_level, ProjectFeature::DISABLED) + visit namespace_project_merge_request_path(project.namespace, project, merge_request) end - it 'has a hidden field for the discussion' do - merge_request_field = find('#merge_request_for_resolving_discussions', visible: false) + it 'does not show a link to create a new issue' do + expect(page).not_to have_link 'open an issue to resolve them later' + end + end - expect(merge_request_field.value).to eq(merge_request.iid.to_s) + context 'merge request has discussions that need to be resolved' do + before do + visit namespace_project_merge_request_path(project.namespace, project, merge_request) end - it_behaves_like 'creating an issue for a discussion' + it 'shows a warning that the merge request contains unresolved discussions' do + expect(page).to have_content 'This merge request has unresolved discussions' + end + + it 'has a link to resolve all discussions by creating an issue' do + page.within '.mr-widget-body' do + expect(page).to have_link 'open an issue to resolve them later', href: new_namespace_project_issue_path(project.namespace, project, merge_request_for_resolving_discussions: merge_request.iid) + end + end + + context 'creating an issue for discussions' do + before do + page.click_link 'open an issue to resolve them later', href: new_namespace_project_issue_path(project.namespace, project, merge_request_for_resolving_discussions: merge_request.iid) + end + + it_behaves_like 'creating an issue for a discussion' + end end end end