diff --git a/src/api/app/assets/javascripts/webui2/request.js b/src/api/app/assets/javascripts/webui2/request.js index f52c6ded937..23662843eed 100644 --- a/src/api/app/assets/javascripts/webui2/request.js +++ b/src/api/app/assets/javascripts/webui2/request.js @@ -58,15 +58,15 @@ function setupRequestDialog() { // jshint ignore:line function requestAddReviewAutocomplete() { // jshint ignore:line $('.modal').on('shown.bs.modal', function() { - $('.hideable input:not(:visible)').removeAttr('required'); + $('.hideable input:not(:visible)').attr('disabled', true); }); $('#review_type').change(function () { $('.hideable').addClass('d-none'); - $('.hideable input:not(:visible)').removeAttr('required'); + $('.hideable input:not(:visible)').attr('disabled', true); var selected = $('#review_type option:selected').attr('value'); $('.' + selected).removeClass('d-none'); - $('.hideable input:visible').attr('required', true); + $('.hideable input:visible').removeAttr('disabled'); }); } diff --git a/src/api/app/controllers/webui/request_controller.rb b/src/api/app/controllers/webui/request_controller.rb index 16c0ff37cc2..74d677b84de 100644 --- a/src/api/app/controllers/webui/request_controller.rb +++ b/src/api/app/controllers/webui/request_controller.rb @@ -217,7 +217,7 @@ def set_bugowner_request_dialog end def set_bugowner_request - required_parameters :project, :user, :group + required_parameters :project request = nil begin request = BsRequest.create!( diff --git a/src/api/app/views/webui/request/_set_bugowner_request_dialog.html.erb b/src/api/app/views/webui/request/_set_bugowner_request_dialog.html.erb index b97c91c1e3a..33b27082af9 100644 --- a/src/api/app/views/webui/request/_set_bugowner_request_dialog.html.erb +++ b/src/api/app/views/webui/request/_set_bugowner_request_dialog.html.erb @@ -5,8 +5,7 @@ <%= form_tag({:action => "set_bugowner_request"}, :name => 'bugowner') do %>
<%= label_tag(:user, "User:") %>
-
- <%= text_field_tag(:user, nil, :onclick => "javascript:document.getElementById('group').disabled=true", :name => 'user' ) %>
+ <%= text_field_tag(:user, nil, :onclick => "javascript:document.getElementById('group').disabled=true", :name => 'user', required: true) %>
<%= javascript_tag do %>
$("#user").autocomplete({source: '<%= url_for :controller => 'user', :action => 'autocomplete' %>', search: function(event, ui) {
$(this).addClass('loading-spinner');
@@ -16,8 +15,7 @@
}, minLength: 2});
<% end %>
<%= label_tag(:user, "Group:") %>
-
- <%= text_field_tag(:group, nil, :onclick => "javascript:document.getElementById('user').disabled=true", :name => 'group' ) %>
+ <%= text_field_tag(:group, nil, :onclick => "javascript:document.getElementById('user').disabled=true", :name => 'group', required: true) %>
<%= javascript_tag do %>
$("#group").autocomplete({source: '<%= url_for :controller => 'groups', :action => 'autocomplete' %>', search: function(event, ui) {
$(this).addClass('loading-spinner');
diff --git a/src/api/app/views/webui2/webui/request/_add_reviewer_dialog.html.haml b/src/api/app/views/webui2/webui/request/_add_reviewer_dialog.html.haml
index b3e016cbbd0..58a50ab1385 100644
--- a/src/api/app/views/webui2/webui/request/_add_reviewer_dialog.html.haml
+++ b/src/api/app/views/webui2/webui/request/_add_reviewer_dialog.html.haml
@@ -11,18 +11,18 @@
= select_tag(:review_type, options_for_select([%w[User review-user], %w[Group review-group],
%w[Project review-project], %w[Package review-package]]), class: 'custom-select')
.hideable.review-user
- = render partial: 'webui/autocomplete', locals: { html_id: 'review_user', label: 'User:',
+ = render partial: 'webui/autocomplete', locals: { html_id: 'review_user', label: 'User:', required: true,
data: { source: autocomplete_users_path } }
.hideable.review-group.d-none
- = render partial: 'webui/autocomplete', locals: { html_id: 'review_group', label: 'Group:',
+ = render partial: 'webui/autocomplete', locals: { html_id: 'review_group', label: 'Group:', required: true,
data: { source: autocomplete_groups_path } }
.hideable.review-project.review-package.d-none
- = render partial: 'webui/autocomplete', locals: { html_id: 'review_project', label: 'Project:',
+ = render partial: 'webui/autocomplete', locals: { html_id: 'review_project', label: 'Project:', required: true,
data: { source: autocomplete_projects_path } }
.hideable.review-package.d-none
- = render partial: 'webui/autocomplete', locals: { html_id: 'review_package', label: 'Package:',
+ = render partial: 'webui/autocomplete', locals: { html_id: 'review_package', label: 'Package:', required: true,
data: { source: autocomplete_packages_path } }
.form-group
diff --git a/src/api/app/views/webui2/webui/search/_request_bugowner_change_dialog.html.haml b/src/api/app/views/webui2/webui/search/_request_bugowner_change_dialog.html.haml
index 240c3c5d165..7972287dbc3 100644
--- a/src/api/app/views/webui2/webui/search/_request_bugowner_change_dialog.html.haml
+++ b/src/api/app/views/webui2/webui/search/_request_bugowner_change_dialog.html.haml
@@ -5,13 +5,15 @@
.modal-header
%h5.modal-title#request-bugowner-change-modal-label Submit Request to Change Bugowner
.modal-body
- %p.font-italic
- A user or a group is required.
.form-group
- = render partial: 'webui/autocomplete', locals: { html_id: 'user', label: 'User:', required: false,
+ = label_tag(:review_type, 'Bugowner can be a user or a group:')
+ = select_tag(:review_type, options_for_select([%w[User review-user], %w[Group review-group]], 'review-user'), class: 'custom-select')
+
+ .hideable.review-user
+ = render partial: 'webui/autocomplete', locals: { html_id: 'user', label: 'User:', required: true,
data: { source: autocomplete_users_path } }
- .form-group
- = render partial: 'webui/autocomplete', locals: { html_id: 'group', label: 'Group:', required: false,
+ .hideable.review-group.d-none
+ = render partial: 'webui/autocomplete', locals: { html_id: 'group', label: 'Group:', required: true,
data: { source: autocomplete_groups_path } }
.form-group
For:
@@ -37,3 +39,6 @@
.modal-footer
= render partial: 'webui2/shared/dialog_action_buttons', locals: { submit_tag_text: 'Submit' }
+
+- content_for :ready_function do
+ requestAddReviewAutocomplete();
diff --git a/src/api/spec/bootstrap/features/webui/change_bugowner_spec.rb b/src/api/spec/bootstrap/features/webui/change_bugowner_spec.rb
new file mode 100644
index 00000000000..06587112453
--- /dev/null
+++ b/src/api/spec/bootstrap/features/webui/change_bugowner_spec.rb
@@ -0,0 +1,60 @@
+require 'browser_helper'
+
+RSpec.feature 'Bootstrap_ChangeBugowner', type: :feature, js: true do
+ let!(:bugowner) { create(:confirmed_user, :with_home, login: 'Iggy') }
+ let!(:package) { create(:package, name: 'TestPack', project: project) }
+ let(:project) { Project.find_by(name: 'home:Iggy') }
+ let!(:new_bugowner) { create(:confirmed_user, :with_home, login: 'Milo') }
+ let!(:group) { create(:group, title: 'Heroes') }
+
+ let!(:collection) do
+ file_fixture('owner_search_collection.xml').read
+ end
+ let!(:bug_collection) do
+ file_fixture('owner_search_bugownership_collection.xml').read
+ end
+
+ before do
+ login bugowner
+ create(:attrib, attrib_type: AttribType.where(name: 'OwnerRootProject').first, project: Project.find_by(name: 'home:Iggy'))
+ create(:relationship_package_user, package: package, user: bugowner, role: Role.find_by_title('bugowner'))
+ allow(Backend::Api::Search).to receive(:binary).and_return(collection)
+
+ visit search_owner_path
+ fill_in :search_input, with: package.name
+ click_button 'Search'
+ click_link 'Request bugowner change'
+ end
+
+ context 'with a user as new bugowner' do
+ scenario 'the bugowner is changed' do
+ fill_in :user, with: 'Milo'
+ fill_in :description, with: 'Replace current bugowner by Milo'
+ click_button 'Submit'
+ expect(page).to have_text("#{bugowner.name} (#{bugowner.login}) wants the user #{new_bugowner.name} (#{new_bugowner.login}) to become bugowner (previous bugowners will be deleted)")
+ end
+ end
+
+ context 'with a group as new bugowner' do
+ scenario 'the bugowner is changed by a group' do
+ find(:id, 'review_type').select('Group')
+ fill_in :group, with: 'Heroes'
+ fill_in :description, with: 'Replace current bugowner by group Heroes'
+ click_button 'Submit'
+ expect(page).to have_text("#{bugowner.name} (#{bugowner.login}) wants the group #{group.title} to become bugowner (previous bugowners will be deleted)")
+ end
+ end
+
+ context 'forcing to add both user and group as bugowner' do
+ scenario 'only the visible one before submitting is added' do
+ find(:id, 'review_type').select('Group')
+ fill_in :group, with: 'Heroes'
+ find(:id, 'review_type').select('User')
+ fill_in :user, with: 'Milo'
+ fill_in :description, with: 'Replace current bugowner by something else'
+ click_button 'Submit'
+ expect(page).to have_text("#{bugowner.name} (#{bugowner.login}) wants the user #{new_bugowner.name} (#{new_bugowner.login}) to become bugowner (previous bugowners will be deleted)")
+ expect(page).not_to have_text('Heroes')
+ end
+ end
+end
diff --git a/src/api/spec/fixtures/files/owner_search_bugownership_collection.xml b/src/api/spec/fixtures/files/owner_search_bugownership_collection.xml
new file mode 100644
index 00000000000..92e502f6b43
--- /dev/null
+++ b/src/api/spec/fixtures/files/owner_search_bugownership_collection.xml
@@ -0,0 +1,5 @@
+