From e33bd810ed01e11079fc0b4a76f1503915fd7065 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 6 Sep 2016 15:51:52 +0100 Subject: [PATCH 1/9] Add groups to project from project_members --- app/assets/javascripts/gl_dropdown.js | 12 +- app/assets/javascripts/members.js.es6 | 110 ++++++++++++++++++ .../_new_project_member.html.haml | 8 +- config/routes.rb | 1 + 4 files changed, 125 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/gl_dropdown.js b/app/assets/javascripts/gl_dropdown.js index bea141bae516..f40c5ce4c96b 100644 --- a/app/assets/javascripts/gl_dropdown.js +++ b/app/assets/javascripts/gl_dropdown.js @@ -524,8 +524,7 @@ return _.template('')({ header: data.header }); } if (this.options.renderRow) { - // Call the render function - html = this.options.renderRow.call(this.options, data, this); + html = this.options.renderRow.call(this.options, data, group, index, this); } else { if (!selected) { value = this.options.id ? this.options.id(data) : data.id; @@ -607,7 +606,7 @@ } else { field = this.dropdown.parent().find("input[name='" + fieldName + "'][value='" + escape(value) + "']"); } - if (el.hasClass(ACTIVE_CLASS)) { + if (el.hasClass(ACTIVE_CLASS) && !(isInput && this.options.multiSelect)) { el.removeClass(ACTIVE_CLASS); if (isInput) { field.val(''); @@ -633,8 +632,11 @@ if (value == null) { field.remove(); } - // Toggle active class for the tick mark - el.addClass(ACTIVE_CLASS); + if (el.hasClass(ACTIVE_CLASS) && isInput && this.options.multiSelect) { + el.removeClass(ACTIVE_CLASS); + } else { + el.addClass(ACTIVE_CLASS); + } if (value != null) { if (!field.length && fieldName) { this.addInput(fieldName, value, selectedObject); diff --git a/app/assets/javascripts/members.js.es6 b/app/assets/javascripts/members.js.es6 index 1b4b3f388387..43b27620038e 100644 --- a/app/assets/javascripts/members.js.es6 +++ b/app/assets/javascripts/members.js.es6 @@ -5,6 +5,7 @@ constructor() { this.removeListeners(); this.addListeners(); + this.createDropdown(); } removeListeners() { @@ -40,6 +41,115 @@ formSuccess() { $(this).find('.js-member-update-control').enable(); } + + createDropdown() { + const $userInput = $('#js-member-user-ids'), + $groupInput = $('#js-member-group-ids'), + self = this; + + $('.js-member-dropdown').each(function () { + const $this = $(this), + selected = [], + user_ids = [], + group_ids = []; + + $this.glDropdown({ + data(term, callback) { + term = term.replace(selected.join(','), ''); + + if (term.match(/^[^@]+@[^@]+$/)) { + callback([{ inviteEmail: term }]); + } else { + self.getData($this.attr('data-url'), term, callback); + } + }, + filterable: true, + filterRemote: true, + filterInput: '.js-member-dropdown', + selectable: true, + multiSelect: true, + fieldName: 'user_ids[]', + id(item, $el) { + const val = item.inviteEmail || item.name, + id = item.inviteEmail || item.id; + + if ($el.hasClass('is-active')) { + const itemIndex = selected.indexOf(val); + selected.splice(itemIndex, 1); + + if ($el.attr('data-group') === 'Groups' && !item.inviteEmail) { + const groupIdIndex = group_ids.indexOf(item.id); + group_ids.splice(groupIdIndex, 1); + } else { + const userIdIndex = user_ids.indexOf(id); + user_ids.splice(userIdIndex, 1); + } + } else { + selected.push(val); + + if ($el.attr('data-group') === 'Groups' && !item.inviteEmail) { + group_ids.push(item.id); + } else { + user_ids.push(id); + } + } + + $userInput.val(user_ids.join(',')); + $groupInput.val(group_ids.join(',')); + + return selected; + }, + renderRow(item, group, index) { + const listItem = document.createElement('li'), + link = document.createElement('a'); + + link.href = '#'; + + if (item.inviteEmail) { + link.innerHTML = `Invite: ${item.inviteEmail}`; + } else { + const avatar = document.createElement('img'), + name = document.createElement('span') + + listItem.className = 'clearfix'; + avatar.className = 'avatar s36'; + avatar.src = item.avatar_url || gon.default_avatar_url; + + name.innerHTML = item.name; + + if (item.username) { + name.innerHTML += `
@${item.username}`; + } + + if (group) { + link.dataset.group = group; + link.dataset.index = index; + } + + if (selected.indexOf(item.name) > -1) { + link.className = 'is-active'; + } + + link.appendChild(avatar); + link.appendChild(name); + } + + listItem.appendChild(link); + + return listItem; + } + }); + }); + } + + getData(endpoint, term, callback) { + $.ajax({ + url: endpoint, + data: { + search: term + } + }).then(callback); + } } gl.Members = Members; diff --git a/app/views/projects/project_members/_new_project_member.html.haml b/app/views/projects/project_members/_new_project_member.html.haml index 79dcd7a6ee9a..6614b99a184c 100644 --- a/app/views/projects/project_members/_new_project_member.html.haml +++ b/app/views/projects/project_members/_new_project_member.html.haml @@ -1,7 +1,13 @@ = form_for @project_member, as: :project_member, url: namespace_project_project_members_path(@project.namespace, @project), html: { class: 'users-project-form' } do |f| .row .col-md-4.col-lg-6 - = users_select_tag(:user_ids, multiple: true, class: "input-clamp", scope: :all, email_user: true) + .dropdown + %input{ type: "hidden", name: "user_ids", id: "js-member-user-ids" } + %input{ type: "hidden", name: "group_ids", id: "js-member-group-ids" } + %input.form-control.js-member-dropdown{ type: "text", placeholder: "Search for users or groups", data: { toggle: "dropdown", url: options_namespace_project_project_members_path(@project.namespace, @project, :json) } } + .dropdown-menu.dropdown-menu-full-width.dropdown-menu-selectable + .dropdown-content + = dropdown_loading .help-block.append-bottom-10 Search for users by name, username, or email, or invite new ones using their email address. diff --git a/config/routes.rb b/config/routes.rb index 441f7249aa86..af9ca1caa6f0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -854,6 +854,7 @@ resources :project_members, except: [:show, :new, :edit], constraints: { id: /[a-zA-Z.\/0-9_\-#%+]+/ }, concerns: :access_requestable do collection do + get :options delete :leave # Used for import team -- GitLab From a2aac4957af923ef4b8effe6b5aca2802f2b2492 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 6 Sep 2016 17:08:05 +0100 Subject: [PATCH 2/9] Updated selected values when deleting from the field --- app/assets/javascripts/members.js.es6 | 53 ++++++++++++++++--- app/assets/stylesheets/pages/members.scss | 4 ++ .../projects/project_members_controller.rb | 21 +++++--- .../_new_project_member.html.haml | 2 +- 4 files changed, 65 insertions(+), 15 deletions(-) diff --git a/app/assets/javascripts/members.js.es6 b/app/assets/javascripts/members.js.es6 index 43b27620038e..94a279729e78 100644 --- a/app/assets/javascripts/members.js.es6 +++ b/app/assets/javascripts/members.js.es6 @@ -46,15 +46,22 @@ const $userInput = $('#js-member-user-ids'), $groupInput = $('#js-member-group-ids'), self = this; + let selected = [], + user_ids = [], + group_ids = []; + + const updateIdInputs = () => { + $userInput.val(user_ids.join(',')); + $groupInput.val(group_ids.join(',')); + }; $('.js-member-dropdown').each(function () { - const $this = $(this), - selected = [], - user_ids = [], - group_ids = []; + const $this = $(this); $this.glDropdown({ data(term, callback) { + term = term.split(','); + term = term[term.length - 1]; term = term.replace(selected.join(','), ''); if (term.match(/^[^@]+@[^@]+$/)) { @@ -94,8 +101,7 @@ } } - $userInput.val(user_ids.join(',')); - $groupInput.val(group_ids.join(',')); + updateIdInputs(); return selected; }, @@ -126,7 +132,7 @@ link.dataset.index = index; } - if (selected.indexOf(item.name) > -1) { + if (selected.indexOf(item.id) > -1) { link.className = 'is-active'; } @@ -138,6 +144,39 @@ return listItem; } + }).on('input', function () { + const $this = $(this), + val = $this.val().split(','), + data = $this.data('glDropdown').fullData; + + if (data) { + // Reset the selected data + user_ids = []; + group_ids = []; + selected = []; + + // Loop through the rendered data + // This gets rid of any objects that have been removed when the user deletes in the field + for (const group in data) { + const groupData = data[group]; + + for (let i = 0, groupDataLength = groupData.length; i < groupDataLength; i++) { + const item = groupData[i]; + + if (val.indexOf(item.name) > -1) { + selected.push(item.name); + + if (group === 'Groups') { + group_ids.push(item.id); + } else { + user_ids.push(item.id); + } + } + } + } + + updateIdInputs(); + } }); }); } diff --git a/app/assets/stylesheets/pages/members.scss b/app/assets/stylesheets/pages/members.scss index 72f31cb1168a..209d5898ba5b 100644 --- a/app/assets/stylesheets/pages/members.scss +++ b/app/assets/stylesheets/pages/members.scss @@ -89,3 +89,7 @@ border: 0; outline: 0; } + +.is-loading.dropdown-members { + min-height: 200px; +} diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb index 4d27617608dc..59661caf3da6 100644 --- a/app/controllers/projects/project_members_controller.rb +++ b/app/controllers/projects/project_members_controller.rb @@ -102,18 +102,25 @@ def apply_import end def options - users = User.all - users = users.search(params[:search]) if params[:search].present? - users = users.page(1) + json = {} groups = Group.all groups = groups.search(params[:search]) if params[:search].present? groups = groups.page(1) - render json: { - Groups: groups.as_json(only: [:id, :name], methods: [:avatar_url]), - Users: users.as_json(only: [:id, :name, :username], methods: [:avatar_url]), - } + if groups.any? + json['Groups'] = groups.as_json(only: [:id, :name], methods: [:avatar_url]) + end + + users = User.all + users = users.search(params[:search]) if params[:search].present? + users = users.page(1) + + if users.any? + json['Users'] = users.as_json(only: [:id, :name, :username], methods: [:avatar_url]) + end + + render json: json.to_json end protected diff --git a/app/views/projects/project_members/_new_project_member.html.haml b/app/views/projects/project_members/_new_project_member.html.haml index 6614b99a184c..bbdc44f7fb0d 100644 --- a/app/views/projects/project_members/_new_project_member.html.haml +++ b/app/views/projects/project_members/_new_project_member.html.haml @@ -5,7 +5,7 @@ %input{ type: "hidden", name: "user_ids", id: "js-member-user-ids" } %input{ type: "hidden", name: "group_ids", id: "js-member-group-ids" } %input.form-control.js-member-dropdown{ type: "text", placeholder: "Search for users or groups", data: { toggle: "dropdown", url: options_namespace_project_project_members_path(@project.namespace, @project, :json) } } - .dropdown-menu.dropdown-menu-full-width.dropdown-menu-selectable + .dropdown-menu.dropdown-menu-full-width.dropdown-menu-selectable.dropdown-members .dropdown-content = dropdown_loading .help-block.append-bottom-10 -- GitLab From 6163655a76e36847e0d0e1211729bd3a00c2a45b Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 7 Sep 2016 14:17:21 +0100 Subject: [PATCH 3/9] Added new dropdown to group_members#index --- app/controllers/groups/group_members_controller.rb | 8 ++++++++ .../groups/group_members/_new_group_member.html.haml | 7 ++++++- config/routes.rb | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/controllers/groups/group_members_controller.rb b/app/controllers/groups/group_members_controller.rb index 272164cd0ccc..8bf6a56aafaa 100644 --- a/app/controllers/groups/group_members_controller.rb +++ b/app/controllers/groups/group_members_controller.rb @@ -65,6 +65,14 @@ def resend_invite end end + def options + users = User.all + users = users.search(params[:search]) if params[:search].present? + users = users.page(1) + + render json: users.as_json(only: [:id, :name, :username], methods: [:avatar_url]) + end + protected def member_params diff --git a/app/views/groups/group_members/_new_group_member.html.haml b/app/views/groups/group_members/_new_group_member.html.haml index b185b81db7ff..72130b7e5b3b 100644 --- a/app/views/groups/group_members/_new_group_member.html.haml +++ b/app/views/groups/group_members/_new_group_member.html.haml @@ -1,7 +1,12 @@ = form_for @group_member, url: group_group_members_path(@group), html: { class: 'users-project-form users-group-form' } do |f| .row .col-md-4.col-lg-6 - = users_select_tag(:user_ids, multiple: true, class: 'input-clamp', scope: :all, email_user: true) + .dropdown + %input{ type: "hidden", name: "user_ids", id: "js-member-user-ids" } + %input.form-control.js-member-dropdown{ type: "text", placeholder: "Search for users or groups", data: { toggle: "dropdown", url: options_group_group_members_path(@group, :json) } } + .dropdown-menu.dropdown-menu-full-width.dropdown-menu-selectable.dropdown-members + .dropdown-content + = dropdown_loading .help-block.append-bottom-10 Search for users by name, username, or email, or invite new ones using their email address. diff --git a/config/routes.rb b/config/routes.rb index af9ca1caa6f0..761538485ed7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -438,6 +438,7 @@ resources :group_members, only: [:index, :create, :update, :destroy], concerns: :access_requestable do post :resend_invite, on: :member delete :leave, on: :collection + get :options, on: :collection end resource :avatar, only: [:destroy] -- GitLab From 984a09a0b456d1c02bc78feb3e1e867d0b102555 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 9 Sep 2016 11:19:01 +0100 Subject: [PATCH 4/9] tests update --- .../project_members/_new_project_member.html.haml | 2 +- features/steps/admin/groups.rb | 6 +++--- features/steps/group/members.rb | 8 ++++---- features/steps/project/team_management.rb | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/views/projects/project_members/_new_project_member.html.haml b/app/views/projects/project_members/_new_project_member.html.haml index bbdc44f7fb0d..8dbe332b0b41 100644 --- a/app/views/projects/project_members/_new_project_member.html.haml +++ b/app/views/projects/project_members/_new_project_member.html.haml @@ -4,7 +4,7 @@ .dropdown %input{ type: "hidden", name: "user_ids", id: "js-member-user-ids" } %input{ type: "hidden", name: "group_ids", id: "js-member-group-ids" } - %input.form-control.js-member-dropdown{ type: "text", placeholder: "Search for users or groups", data: { toggle: "dropdown", url: options_namespace_project_project_members_path(@project.namespace, @project, :json) } } + %input.form-control.js-member-dropdown#js-members-input{ type: "text", placeholder: "Search for users or groups", data: { toggle: "dropdown", url: options_namespace_project_project_members_path(@project.namespace, @project, :json) } } .dropdown-menu.dropdown-menu-full-width.dropdown-menu-selectable.dropdown-members .dropdown-content = dropdown_loading diff --git a/features/steps/admin/groups.rb b/features/steps/admin/groups.rb index 9396a76f0a28..304472b7af2b 100644 --- a/features/steps/admin/groups.rb +++ b/features/steps/admin/groups.rb @@ -38,7 +38,7 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps end When 'I select user "John Doe" from user list as "Reporter"' do - select2(user_john.id, from: "#user_ids", multiple: true) + find('#js-member-user-ids', visible: true).set(user_john.id) page.within "#new_project_member" do select "Reporter", from: "access_level" end @@ -46,7 +46,7 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps end When 'I select user "johndoe@gitlab.com" from user list as "Reporter"' do - select2('johndoe@gitlab.com', from: "#user_ids", multiple: true) + find('#js-member-user-ids', visible: true).set('johndoe@gitlab.com') page.within "#new_project_member" do select "Reporter", from: "access_level" end @@ -101,7 +101,7 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps step 'I select current user as "Developer"' do page.within ".users-group-form" do - select2(current_user.id, from: "#user_ids", multiple: true) + find('#js-member-user-ids', visible: true).set(current_user.id) select "Developer", from: "access_level" end diff --git a/features/steps/group/members.rb b/features/steps/group/members.rb index cefc55d07abe..63a645696108 100644 --- a/features/steps/group/members.rb +++ b/features/steps/group/members.rb @@ -10,7 +10,7 @@ class Spinach::Features::GroupMembers < Spinach::FeatureSteps user = User.find_by(name: "Mike") page.within ".users-group-form" do - select2(user.id, from: "#user_ids", multiple: true) + find('#js-member-user-ids', visible: true).set(user.id) select "Reporter", from: "access_level" end @@ -21,7 +21,7 @@ class Spinach::Features::GroupMembers < Spinach::FeatureSteps user = User.find_by(name: "Mike") page.within ".users-group-form" do - select2(user.id, from: "#user_ids", multiple: true) + find('#js-member-user-ids', visible: true).set(user.id) select "Master", from: "access_level" end @@ -44,7 +44,7 @@ class Spinach::Features::GroupMembers < Spinach::FeatureSteps step 'I select "sjobs@apple.com" as "Reporter"' do page.within ".users-group-form" do - select2("sjobs@apple.com", from: "#user_ids", multiple: true) + find('#js-member-user-ids', visible: true).set("sjobs@apple.com") select "Reporter", from: "access_level" end @@ -63,7 +63,7 @@ class Spinach::Features::GroupMembers < Spinach::FeatureSteps user = User.find_by(name: "Mary Jane") || create(:user, name: "Mary Jane") page.within ".users-group-form" do - select2(user.id, from: "#user_ids", multiple: true) + find('#js-member-user-ids', visible: true).set(user.id) select "Reporter", from: "access_level" end diff --git a/features/steps/project/team_management.rb b/features/steps/project/team_management.rb index b21d0849ad1f..6ee59b37ced7 100644 --- a/features/steps/project/team_management.rb +++ b/features/steps/project/team_management.rb @@ -19,7 +19,7 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps user = User.find_by(name: "Mike") page.within ".users-project-form" do - select2(user.id, from: "#user_ids", multiple: true) + find('#js-member-user-ids', visible: true).set(user.id) select "Reporter", from: "access_level" end click_button "Add to project" @@ -36,7 +36,7 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps step 'I select "sjobs@apple.com" as "Reporter"' do page.within ".users-project-form" do - find('#user_ids', visible: false).set('sjobs@apple.com') + find('#js-member-user-ids', visible: true).set('sjobs@apple.com') select "Reporter", from: "access_level" end click_button "Add to project" -- GitLab From dcc683478702fdc7d11a6676c31e5e0e9460bc4e Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Mon, 12 Sep 2016 10:56:29 +0100 Subject: [PATCH 5/9] Fixed bulk assigne JS error --- app/assets/javascripts/labels_select.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index 29a967a35a0d..a808b0c663d3 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -143,7 +143,7 @@ return callback(data); }); }, - renderRow: function(label, instance) { + renderRow: function(label, group, index, instance) { var $a, $li, active, color, colorEl, indeterminate, removesAll, selectedClass, spacing; $li = $('
  • '); $a = $(''); -- GitLab From 287199e1952969b7929af352bf2f3d4b17605db6 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Mon, 12 Sep 2016 12:37:20 +0100 Subject: [PATCH 6/9] Tests update --- features/steps/admin/groups.rb | 6 +++--- features/steps/group/members.rb | 8 ++++---- features/steps/project/team_management.rb | 4 ++-- .../master_adds_member_with_expiration_date_spec.rb | 3 +-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/features/steps/admin/groups.rb b/features/steps/admin/groups.rb index 304472b7af2b..b5ae91e0680c 100644 --- a/features/steps/admin/groups.rb +++ b/features/steps/admin/groups.rb @@ -38,7 +38,7 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps end When 'I select user "John Doe" from user list as "Reporter"' do - find('#js-member-user-ids', visible: true).set(user_john.id) + find('#js-member-user-ids', visible: false).set(user_john.id) page.within "#new_project_member" do select "Reporter", from: "access_level" end @@ -46,7 +46,7 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps end When 'I select user "johndoe@gitlab.com" from user list as "Reporter"' do - find('#js-member-user-ids', visible: true).set('johndoe@gitlab.com') + find('#js-member-user-ids', visible: false).set('johndoe@gitlab.com') page.within "#new_project_member" do select "Reporter", from: "access_level" end @@ -101,7 +101,7 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps step 'I select current user as "Developer"' do page.within ".users-group-form" do - find('#js-member-user-ids', visible: true).set(current_user.id) + find('#js-member-user-ids', visible: false).set(current_user.id) select "Developer", from: "access_level" end diff --git a/features/steps/group/members.rb b/features/steps/group/members.rb index 63a645696108..2a4a4d2ef747 100644 --- a/features/steps/group/members.rb +++ b/features/steps/group/members.rb @@ -10,7 +10,7 @@ class Spinach::Features::GroupMembers < Spinach::FeatureSteps user = User.find_by(name: "Mike") page.within ".users-group-form" do - find('#js-member-user-ids', visible: true).set(user.id) + find('#js-member-user-ids', visible: false).set(user.id) select "Reporter", from: "access_level" end @@ -21,7 +21,7 @@ class Spinach::Features::GroupMembers < Spinach::FeatureSteps user = User.find_by(name: "Mike") page.within ".users-group-form" do - find('#js-member-user-ids', visible: true).set(user.id) + find('#js-member-user-ids', visible: false).set(user.id) select "Master", from: "access_level" end @@ -44,7 +44,7 @@ class Spinach::Features::GroupMembers < Spinach::FeatureSteps step 'I select "sjobs@apple.com" as "Reporter"' do page.within ".users-group-form" do - find('#js-member-user-ids', visible: true).set("sjobs@apple.com") + find('#js-member-user-ids', visible: false).set("sjobs@apple.com") select "Reporter", from: "access_level" end @@ -63,7 +63,7 @@ class Spinach::Features::GroupMembers < Spinach::FeatureSteps user = User.find_by(name: "Mary Jane") || create(:user, name: "Mary Jane") page.within ".users-group-form" do - find('#js-member-user-ids', visible: true).set(user.id) + find('#js-member-user-ids', visible: false).set(user.id) select "Reporter", from: "access_level" end diff --git a/features/steps/project/team_management.rb b/features/steps/project/team_management.rb index 6ee59b37ced7..7e7aa77fdda2 100644 --- a/features/steps/project/team_management.rb +++ b/features/steps/project/team_management.rb @@ -19,7 +19,7 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps user = User.find_by(name: "Mike") page.within ".users-project-form" do - find('#js-member-user-ids', visible: true).set(user.id) + find('#js-member-user-ids', visible: false).set(user.id) select "Reporter", from: "access_level" end click_button "Add to project" @@ -36,7 +36,7 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps step 'I select "sjobs@apple.com" as "Reporter"' do page.within ".users-project-form" do - find('#js-member-user-ids', visible: true).set('sjobs@apple.com') + find('#js-member-user-ids', visible: false).set('sjobs@apple.com') select "Reporter", from: "access_level" end click_button "Add to project" diff --git a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb index 27a83fdcd1f6..c00e3869cbb5 100644 --- a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb +++ b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb @@ -2,7 +2,6 @@ feature 'Projects > Members > Master adds member with expiration date', feature: true, js: true do include WaitForAjax - include Select2Helper include ActiveSupport::Testing::TimeHelpers let(:master) { create(:user) } @@ -19,7 +18,7 @@ visit namespace_project_project_members_path(project.namespace, project) page.within '.users-project-form' do - select2(new_member.id, from: '#user_ids', multiple: true) + find('#js-member-user-ids', visible: false).set(new_member.id) fill_in 'expires_at', with: '2016-08-10' click_on 'Add to project' end -- GitLab From 4cdfaef5450b1bb8b6cf35bc90ca8e06e3e831cf Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Mon, 12 Sep 2016 15:07:04 +0100 Subject: [PATCH 7/9] Revert admin group tests --- features/steps/admin/groups.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/steps/admin/groups.rb b/features/steps/admin/groups.rb index b5ae91e0680c..89d649d303e2 100644 --- a/features/steps/admin/groups.rb +++ b/features/steps/admin/groups.rb @@ -38,7 +38,7 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps end When 'I select user "John Doe" from user list as "Reporter"' do - find('#js-member-user-ids', visible: false).set(user_john.id) + select2(user_john.id, from: "#user_ids", multiple: true) page.within "#new_project_member" do select "Reporter", from: "access_level" end @@ -46,7 +46,7 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps end When 'I select user "johndoe@gitlab.com" from user list as "Reporter"' do - find('#js-member-user-ids', visible: false).set('johndoe@gitlab.com') + select2('johndoe@gitlab.com', from: "#user_ids", multiple: true) page.within "#new_project_member" do select "Reporter", from: "access_level" end -- GitLab From 7af46a3e5642d3821fcc4bc7fb71197a49b9293c Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Mon, 12 Sep 2016 15:58:00 +0100 Subject: [PATCH 8/9] Fixed project member test using select2 --- features/steps/admin/projects.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/steps/admin/projects.rb b/features/steps/admin/projects.rb index 2b8cd030acef..0186b93f0a58 100644 --- a/features/steps/admin/projects.rb +++ b/features/steps/admin/projects.rb @@ -66,7 +66,7 @@ class Spinach::Features::AdminProjects < Spinach::FeatureSteps step 'I select current user as "Developer"' do page.within ".users-project-form" do - select2(current_user.id, from: "#user_ids", multiple: true) + find('#js-member-user-ids', visible: false).set(current_user.id) select "Developer", from: "access_level" end -- GitLab From b0c01f637e6d2f761d8afc74f7efb8e300202f71 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 13 Sep 2016 09:50:15 +0100 Subject: [PATCH 9/9] Added dropdown test --- .../members/new_member_dropdown_spec.rb | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 spec/features/projects/members/new_member_dropdown_spec.rb diff --git a/spec/features/projects/members/new_member_dropdown_spec.rb b/spec/features/projects/members/new_member_dropdown_spec.rb new file mode 100644 index 000000000000..89d777c89bfc --- /dev/null +++ b/spec/features/projects/members/new_member_dropdown_spec.rb @@ -0,0 +1,87 @@ +require 'spec_helper' + +feature 'New project member dropdown', feature: true, js: true do + include WaitForAjax + + let(:user) { create(:user) } + let!(:user2) { create(:user) } + let!(:group) { create(:group) } + let!(:group2) { create(:group) } + let(:project) { create(:project) } + + background do + project.team << [user, :master] + login_as(user) + visit namespace_project_project_members_path(project.namespace, project) + end + + it 'displays list of groups and users' do + open_dropdown + + page.within '.dropdown-members' do + expect(page).to have_content(user2.name) + expect(page).to have_content(group.name) + expect(page).to have_content(group2.name) + end + end + + it 'adds a user' do + open_dropdown + + page.within '.dropdown-members' do + click_link user2.name + end + + expect(find('#js-members-input').value).to eq(user2.name) + + click_button 'Add to project' + expect(page).to have_selector('.project_member', count: 2) + end + + it 'adds a group' do + open_dropdown + + page.within '.dropdown-members' do + click_link group.name + end + + expect(find('#js-members-input').value).to eq group.name + + click_button 'Add to project' + expect(page).to have_selector('.group_member', count: 1) + end + + it 'adds multiple groups' do + open_dropdown + + page.within '.dropdown-members' do + click_link group.name + click_link group2.name + end + + expect(find('#js-members-input').value).to eq("#{group.name},#{group2.name}") + + click_button 'Add to project' + expect(page).to have_selector('.group_member', count: 2) + end + + it 'adds a user & a group' do + open_dropdown + + page.within '.dropdown-members' do + click_link user2.name + click_link group.name + end + + expect(find('#js-members-input').value).to eq("#{user2.name},#{group.name}") + + click_button 'Add to project' + expect(page).to have_selector('.project_member', count: 2) + expect(page).to have_selector('.group_member', count: 1) + end + + def open_dropdown + find('#js-members-input').click + wait_for_ajax + end +end -- GitLab