diff --git a/app/assets/javascripts/merge_request.js b/app/assets/javascripts/merge_request.js index 829e2264152912aa3167097d0af4bc6db4359de7..ff51b14543bec0bb603f494cb0cec7735c6d51c0 100644 --- a/app/assets/javascripts/merge_request.js +++ b/app/assets/javascripts/merge_request.js @@ -90,10 +90,13 @@ MergeRequest.prototype.initMRBtnListeners = function () { MergeRequest.toggleDraftStatus(data.title, wipEvent === 'unwip'); }) .catch(() => { - draftToggle.removeAttribute('disabled'); createFlash({ message: __('Something went wrong. Please try again.'), }); + }) + .finally(() => { + draftToggle.removeAttribute('disabled'); + loader.remove(); }); }); }); @@ -162,7 +165,9 @@ MergeRequest.toggleDraftStatus = function (title, isReady) { ); draftToggle.setAttribute('href', url); - draftToggle.textContent = isReady ? __('Mark as draft') : __('Mark as ready'); + draftToggle.querySelector('.gl-new-dropdown-item-text-wrapper').textContent = isReady + ? __('Mark as draft') + : __('Mark as ready'); }); } }; diff --git a/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml b/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml index f6afac493d592521fdb9be9cead86991ae7b1d7b..df9ef28726a3c8d69810520e44a8449c0f3e1fd4 100644 --- a/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml +++ b/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml @@ -1,36 +1,40 @@ - display_issuable_type = issuable_display_type(@merge_request) -- button_class = "btn gl-button #{!@merge_request.closed? && 'js-draft-toggle-button'}" -- toggle_class = "btn gl-button dropdown-toggle" -.float-left.btn-group.gl-ml-3.gl-display-none.gl-md-display-flex - = link_to @merge_request.closed? ? reopen_issuable_path(@merge_request) : toggle_draft_merge_request_path(@merge_request), method: :put, class: "#{button_class} btn-confirm-secondary" do - - if @merge_request.closed? - = _('Reopen') - = display_issuable_type - - else - = @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft') +.float-left.btn-group.gl-md-ml-3.gl-display-flex.dropdown.gl-new-dropdown.gl-md-w-auto.gl-w-full + = button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md gl-button gl-dropdown-toggle btn-default-tertiary dropdown-icon-only dropdown-toggle-no-caret gl-display-none! gl-md-display-inline-flex!", data: { 'toggle' => 'dropdown' } do + %span.gl-sr-only= _('Toggle dropdown') + = sprite_icon "ellipsis_v", size: 16, css_class: "dropdown-icon gl-icon" + = button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md btn-block gl-button gl-dropdown-toggle gl-md-display-none!", data: { 'toggle' => 'dropdown' } do + %span.gl-new-dropdown-button-text= _('Merge request actions') + = sprite_icon "chevron-down", size: 16, css_class: "dropdown-icon gl-icon" + .dropdown-menu.dropdown-menu-right + .gl-new-dropdown-inner + .gl-new-dropdown-contents + %ul + - if can?(current_user, :update_merge_request, @merge_request) + %li.gl-new-dropdown-item{ class: "gl-md-display-none!" } + = link_to edit_project_merge_request_path(@project, @merge_request), class: 'dropdown-item' do + .gl-new-dropdown-item-text-wrapper + = _('Edit') + - if @merge_request.open? + %li.gl-new-dropdown-item + = link_to toggle_draft_merge_request_path(@merge_request), method: :put, class: 'dropdown-item js-draft-toggle-button' do + .gl-new-dropdown-item-text-wrapper + = @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft') + %li.gl-new-dropdown-item.js-close-item + = link_to close_issuable_path(@merge_request), method: :put, class: 'dropdown-item' do + .gl-new-dropdown-item-text-wrapper + = _('Close') + = display_issuable_type + - elsif !@merge_request.source_project_missing? + %li.gl-new-dropdown-item + = link_to reopen_issuable_path(@merge_request), method: :put, class: 'dropdown-item' do + .gl-new-dropdown-item-text-wrapper + = _('Reopen') + = display_issuable_type - - if !@merge_request.closed? || !issuable_author_is_current_user(@merge_request) - = button_tag type: 'button', class: "#{toggle_class} btn-confirm-secondary btn-icon", data: { 'toggle' => 'dropdown' } do - %span.gl-sr-only= _('Toggle dropdown') - = sprite_icon "chevron-down", size: 12, css_class: "gl-button-icon" - - %ul.dropdown-menu.dropdown-menu-right - - if @merge_request.open? - %li - = link_to close_issuable_path(@merge_request), method: :put do - .description - %strong.title - = _('Close') - = display_issuable_type - - - unless issuable_author_is_current_user(@merge_request) - - unless @merge_request.closed? - %li.divider.droplab-item-ignore - - %li - %a{ href: new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)) } - .description - %strong.title= _('Report abuse') - %p.text.gl-mb-0 - = _('Report %{display_issuable_type} that are abusive, inappropriate or spam.') % { display_issuable_type: display_issuable_type.pluralize } + - unless issuable_author_is_current_user(@merge_request) + %li.gl-new-dropdown-item + = link_to new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)), class: 'dropdown-item' do + .gl-new-dropdown-item-text-wrapper + = _('Report abuse') diff --git a/app/views/projects/merge_requests/_mr_title.html.haml b/app/views/projects/merge_requests/_mr_title.html.haml index 49b7320d630b6d321ec31f5ee540d8ceacef01d6..ae44143f2eeebb79e743a191f4a4f8f2f7639c43 100644 --- a/app/views/projects/merge_requests/_mr_title.html.haml +++ b/app/views/projects/merge_requests/_mr_title.html.haml @@ -24,29 +24,8 @@ = sprite_icon('chevron-double-lg-left') .detail-page-header-actions.js-issuable-actions - .clearfix.dropdown - %button.gl-button.btn.btn-default.float-left.gl-md-display-none.gl-w-full{ type: "button", data: { toggle: "dropdown" } } - Options - = sprite_icon('chevron-down', css_class: 'gl-text-gray-500') - .dropdown-menu.dropdown-menu-right - %ul - - if can_update_merge_request - %li= link_to _('Edit'), edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request) - - if @merge_request.opened? - %li - = link_to @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft'), toggle_draft_merge_request_path(@merge_request), method: :put, class: "js-draft-toggle-button" - %li{ class: [merge_request_button_visibility(@merge_request, true), 'js-close-item'] } - = link_to _('Close'), merge_request_path(@merge_request, merge_request: { state_event: :close }), method: :put, title: 'Close merge request' - - if can_reopen_merge_request - %li{ class: merge_request_button_visibility(@merge_request, false) } - = link_to _('Reopen'), merge_request_path(@merge_request, merge_request: { state_event: :reopen }), method: :put, title: 'Reopen merge request' - - unless @merge_request.merged? || current_user == @merge_request.author - %li= link_to _('Report abuse'), new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)) + - if can_update_merge_request + = link_to _('Edit'), edit_project_merge_request_path(@project, @merge_request), class: "gl-display-none gl-md-display-block btn gl-button btn-default btn-grouped js-issuable-edit", data: { qa_selector: "edit_button" } - - if can_update_merge_request - = link_to _('Edit'), edit_project_merge_request_path(@project, @merge_request), class: "gl-display-none gl-md-display-block btn gl-button btn-default btn-grouped js-issuable-edit", data: { qa_selector: "edit_button" } - - - if can_update_merge_request && !are_close_and_open_buttons_hidden - = render 'projects/merge_requests/close_reopen_draft_report_toggle' - - elsif !@merge_request.merged? - = link_to _('Report abuse'), new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)), class: 'gl-display-none gl-md-display-block gl-button btn btn-default gl-float-right gl-ml-3', title: _('Report abuse') + - if current_user + = render 'projects/merge_requests/close_reopen_draft_report_toggle' diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 0d727e3945ae0de9fb6f8fa6c197f6df3ff8d549..028e5399373fd3e6d213d477debe530487588577 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -23778,6 +23778,9 @@ msgstr "" msgid "Merge request %{mr_link} was reviewed by %{mr_author}" msgstr "" +msgid "Merge request actions" +msgstr "" + msgid "Merge request analytics" msgstr "" @@ -31661,9 +31664,6 @@ msgstr "" msgid "Repo by URL" msgstr "" -msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam." -msgstr "" - msgid "Report abuse" msgstr "" diff --git a/spec/features/merge_request/close_reopen_report_toggle_spec.rb b/spec/features/merge_request/close_reopen_report_toggle_spec.rb index 8a4277d87c9b500dd500d2748854c4f536816eb1..dea9a10a4ec31ffdf45f0dd4ac69b9df8cbc1c70 100644 --- a/spec/features/merge_request/close_reopen_report_toggle_spec.rb +++ b/spec/features/merge_request/close_reopen_report_toggle_spec.rb @@ -28,7 +28,6 @@ expect(container).to have_link("Close merge request") expect(container).to have_link('Report abuse') - expect(container).to have_text("Report merge requests that are abusive, inappropriate or spam.") end it 'links to Report Abuse' do @@ -43,10 +42,12 @@ let(:issuable) { create(:merge_request, :opened, source_project: project) } it 'shows the `Edit` and `Mark as draft` buttons' do + click_button 'Toggle dropdown' + expect(container).to have_link('Edit') expect(container).to have_link('Mark as draft') - expect(container).not_to have_button('Report abuse') - expect(container).not_to have_button('Close merge request') + expect(container).to have_link('Close merge request') + expect(container).to have_link('Report abuse') expect(container).not_to have_link('Reopen merge request') end end @@ -55,21 +56,24 @@ let(:issuable) { create(:merge_request, :closed, source_project: project) } it 'shows both the `Edit` and `Reopen` button' do + click_button 'Toggle dropdown' + expect(container).to have_link('Edit') - expect(container).not_to have_button('Report abuse') - expect(container).not_to have_button('Close merge request') + expect(container).to have_link('Report abuse') expect(container).to have_link('Reopen merge request') + expect(container).not_to have_link('Close merge request') end context 'when the merge request author is the current user' do let(:issuable) { create(:merge_request, :closed, source_project: project, author: user) } it 'shows both the `Edit` and `Reopen` button' do + click_button 'Toggle dropdown' + expect(container).to have_link('Edit') - expect(container).not_to have_link('Report abuse') - expect(container).not_to have_selector('button.dropdown-toggle') - expect(container).not_to have_button('Close merge request') expect(container).to have_link('Reopen merge request') + expect(container).not_to have_link('Close merge request') + expect(container).not_to have_link('Report abuse') end end end diff --git a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb index f5bca7cf01535c8780a6b48890b0cd55621c9fa8..c3a614764428651fd758a6a1031e4c84a4e385c0 100644 --- a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb +++ b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb @@ -16,10 +16,13 @@ end it 'toggles draft status' do + click_button 'Toggle dropdown' click_link 'Mark as draft' expect(page).to have_content("Draft: #{merge_request.title}") + click_button 'Toggle dropdown' + page.within('.detail-page-header-actions') do click_link 'Mark as ready' end diff --git a/spec/views/projects/merge_requests/show.html.haml_spec.rb b/spec/views/projects/merge_requests/show.html.haml_spec.rb index 6ffd0936003f990813389617966ba0d2d498962b..86a4b25f7467b56129e87fc3a2f38d0f8144bd6e 100644 --- a/spec/views/projects/merge_requests/show.html.haml_spec.rb +++ b/spec/views/projects/merge_requests/show.html.haml_spec.rb @@ -16,7 +16,6 @@ render expect(rendered).to have_css('a', visible: true, text: 'Mark as draft') - expect(rendered).to have_css('a', visible: false, text: 'Reopen') expect(rendered).to have_css('a', visible: true, text: 'Close') end end @@ -31,7 +30,6 @@ expect(rendered).not_to have_css('a', visible: true, text: 'Mark as draft') expect(rendered).to have_css('a', visible: true, text: 'Reopen') - expect(rendered).to have_css('a', visible: false, text: 'Close') end context 'when source project does not exist' do @@ -40,8 +38,7 @@ render - expect(rendered).to have_css('a', visible: false, text: 'Reopen') - expect(rendered).to have_css('a', visible: false, text: 'Close') + expect(rendered).not_to have_css('a', visible: false, text: 'Reopen') end end end