Merge branch 'move-project-dropdown-async' into 'master'

Loads move issue dropdown async

To keep the style of the dropdown the same as the other dropdowns in the issue form, it uses select2 rather than our new dropdowns.

![dropdown](/uploads/e80d5f48440b2a49fd3ac13e74c1ba55/dropdown.gif)

Closes #16563

See merge request !4160
This commit is contained in:
Jacob Schatz 2016-05-26 18:28:01 +00:00
commit 1a848d8354
5 changed files with 47 additions and 9 deletions

View File

@ -19,6 +19,7 @@ class @IssuableForm
@form.on "click", ".btn-cancel", @resetAutosave @form.on "click", ".btn-cancel", @resetAutosave
@initWip() @initWip()
@initMoveDropdown()
$issuableDueDate = $('#issuable-due-date') $issuableDueDate = $('#issuable-due-date')
@ -89,3 +90,19 @@ class @IssuableForm
addWip: -> addWip: ->
@titleField.val "WIP: #{@titleField.val()}" @titleField.val "WIP: #{@titleField.val()}"
initMoveDropdown: ->
$moveDropdown = $('.js-move-dropdown')
if $moveDropdown.length
$('.js-move-dropdown').select2
ajax:
url: $moveDropdown.data('projects-url')
results: (data) ->
return {
results: data
}
formatResult: (project) ->
project.name_with_namespace
formatSelection: (project) ->
project.name_with_namespace

View File

@ -31,6 +31,24 @@ class AutocompleteController < ApplicationController
render json: @user, only: [:name, :username, :id], methods: [:avatar_url] render json: @user, only: [:name, :username, :id], methods: [:avatar_url]
end end
def projects
project = Project.find_by_id(params[:project_id])
projects = current_user.authorized_projects
projects = projects.select do |project|
current_user.can?(:admin_issue, project)
end
no_project = {
id: 0,
name_with_namespace: 'No project',
}
projects.unshift(no_project)
projects.delete(project)
render json: projects.to_json(only: [:id, :name_with_namespace], methods: :name_with_namespace)
end
private private
def find_users def find_users

View File

@ -98,9 +98,7 @@
= label_tag :move_to_project_id, 'Move', class: 'control-label' = label_tag :move_to_project_id, 'Move', class: 'control-label'
.col-sm-10 .col-sm-10
.issuable-form-select-holder .issuable-form-select-holder
- projects = project_options(issuable, current_user, ability: :admin_issue) = hidden_field_tag :move_to_project_id, nil, class: 'js-move-dropdown', data: { placeholder: 'Select project', projects_url: autocomplete_projects_path(project_id: @project.id) }
= select_tag(:move_to_project_id, projects, include_blank: true,
class: 'select2', data: { placeholder: 'Select project' })
&nbsp; &nbsp;
%span{ data: { toggle: 'tooltip', placement: 'auto top' }, style: 'cursor: default', %span{ data: { toggle: 'tooltip', placement: 'auto top' }, style: 'cursor: default',
title: 'Moving an issue will copy the discussion to a different project and close it here. All participants will be notified of the new location.' } title: 'Moving an issue will copy the discussion to a different project and close it here. All participants will be notified of the new location.' }

View File

@ -56,6 +56,7 @@ Rails.application.routes.draw do
# Autocomplete # Autocomplete
get '/autocomplete/users' => 'autocomplete#users' get '/autocomplete/users' => 'autocomplete#users'
get '/autocomplete/users/:id' => 'autocomplete#user' get '/autocomplete/users/:id' => 'autocomplete#user'
get '/autocomplete/projects' => 'autocomplete#projects'
# Emojis # Emojis
resources :emojis, only: :index resources :emojis, only: :index

View File

@ -19,7 +19,7 @@ feature 'issue move to another project' do
end end
scenario 'moving issue to another project not allowed' do scenario 'moving issue to another project not allowed' do
expect(page).to have_no_select('move_to_project_id') expect(page).to have_no_selector('#move_to_project_id')
end end
end end
@ -37,7 +37,7 @@ feature 'issue move to another project' do
end end
scenario 'moving issue to another project' do scenario 'moving issue to another project' do
select(new_project.name_with_namespace, from: 'move_to_project_id') first('#move_to_project_id', visible: false).set(new_project.id)
click_button('Save changes') click_button('Save changes')
expect(current_url).to include project_path(new_project) expect(current_url).to include project_path(new_project)
@ -47,14 +47,18 @@ feature 'issue move to another project' do
expect(page).to have_content(issue.title) expect(page).to have_content(issue.title)
end end
context 'projects user does not have permission to move issue to exist' do context 'user does not have permission to move the issue to a project', js: true do
let!(:private_project) { create(:project, :private) } let!(:private_project) { create(:project, :private) }
let(:another_project) { create(:project) } let(:another_project) { create(:project) }
background { another_project.team << [user, :guest] } background { another_project.team << [user, :guest] }
scenario 'browsing projects in projects select' do scenario 'browsing projects in projects select' do
options = [ '', 'No project', new_project.name_with_namespace ] click_link 'Select project'
expect(page).to have_select('move_to_project_id', options: options)
page.within '.select2-results' do
expect(page).to have_content 'No project'
expect(page).to have_content new_project.name_with_namespace
end
end end
end end
@ -65,7 +69,7 @@ feature 'issue move to another project' do
end end
scenario 'user wants to move issue that has already been moved' do scenario 'user wants to move issue that has already been moved' do
expect(page).to have_no_select('move_to_project_id') expect(page).to have_no_selector('#move_to_project_id')
end end
end end
end end