From 1dd279d83335de71c69d0acfdcdd7eb0ebe7f3dd Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 15 Mar 2016 15:01:26 +0100 Subject: [PATCH] Use helper to create list of projects issue can be moved to This also adds confirmation message if issue move has been requested. --- app/assets/javascripts/issuable_form.js.coffee | 11 ++++++++++- app/helpers/issues_helper.rb | 11 +++++++++++ app/views/shared/issuable/_form.html.haml | 6 +++--- spec/services/issues/move_service_spec.rb | 15 +++++++++++++-- 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/issuable_form.js.coffee b/app/assets/javascripts/issuable_form.js.coffee index 48c249943f2..9b939985b33 100644 --- a/app/assets/javascripts/issuable_form.js.coffee +++ b/app/assets/javascripts/issuable_form.js.coffee @@ -1,4 +1,6 @@ class @IssuableForm + ISSUE_MOVE_CONFIRM_MSG = 'Are you sure you want to move this issue to another project?' + constructor: (@form) -> GitLab.GfmAutoComplete.setup() new UsersSelect() @@ -6,12 +8,13 @@ class @IssuableForm @titleField = @form.find("input[name*='[title]']") @descriptionField = @form.find("textarea[name*='[description]']") + @issueMoveField = @form.find("#move_to_project_id") return unless @titleField.length && @descriptionField.length @initAutosave() - @form.on "submit", @resetAutosave + @form.on "submit", @handleSubmit @form.on "click", ".btn-cancel", @resetAutosave initAutosave: -> @@ -27,6 +30,12 @@ class @IssuableForm "description" ] + handleSubmit: (e) => + @resetAutosave + + if (parseInt(@issueMoveField?.val()) ? 0) > 0 + e.preventDefault() unless confirm(ISSUE_MOVE_CONFIRM_MSG) + resetAutosave: => @titleField.data("autosave").reset() @descriptionField.data("autosave").reset() diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index ae4ebc0854a..62479b8d1ce 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -57,6 +57,17 @@ module IssuesHelper options_from_collection_for_select(milestones, 'id', 'title', object.milestone_id) end + def project_options(issuable, current_user, ability: :read_project) + projects = current_user.authorized_projects + projects = projects.select do |project| + current_user.can?(ability, project) && project != issuable.project + end + + projects.unshift(OpenStruct.new(id: 0, name_with_namespace: 'No project')) + + options_from_collection_for_select(projects, :id, :name_with_namespace, 0) + end + def status_box_class(item) if item.respond_to?(:expired?) && item.expired? 'status-box-expired' diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index f9160a46093..11b8b9d44af 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -72,9 +72,9 @@ .form-group = f.label :move_to_project_id, 'Move', class: 'control-label' .col-sm-10 - = project_select_tag(:move_to_project_id, placeholder: 'Select project', - class: 'custom-form-control', data: { 'select-id' => 'id', - 'access-level' => Gitlab::Access::REPORTER, 'without-id' => issuable.project.id }) + - projects = project_options(issuable, current_user, ability: :admin_issue) + = select_tag(:move_to_project_id, projects, include_blank: true, + class: 'select2', data: { placeholder: 'Select project' }) - if issuable.is_a?(MergeRequest) %hr diff --git a/spec/services/issues/move_service_spec.rb b/spec/services/issues/move_service_spec.rb index b71ce311afd..cb02b8721ac 100644 --- a/spec/services/issues/move_service_spec.rb +++ b/spec/services/issues/move_service_spec.rb @@ -28,7 +28,7 @@ describe Issues::MoveService, services: true do new_project.team << [user, :reporter] end end - + context 'issue movable' do include_context 'issue move requested' include_context 'user can move issue' @@ -162,6 +162,18 @@ describe Issues::MoveService, services: true do end end + context 'moving to same project' do + let(:new_project) { old_project } + + include_context 'issue move requested' + include_context 'user can move issue' + + it 'raises error' do + expect { move_service } + .to raise_error(StandardError, /Cannot move issue/) + end + end + context 'issue move not requested' do let(:new_project_id) { nil } @@ -179,7 +191,6 @@ describe Issues::MoveService, services: true do end end - describe 'move permissions' do include_context 'issue move requested'