diff --git a/app/assets/javascripts/admin/controllers/admin-groups-bulk-complete.js.es6 b/app/assets/javascripts/admin/controllers/admin-groups-bulk-complete.js.es6 new file mode 100644 index 00000000000..780543b7241 --- /dev/null +++ b/app/assets/javascripts/admin/controllers/admin-groups-bulk-complete.js.es6 @@ -0,0 +1,4 @@ +export default Ember.Controller.extend({ + adminGroupsBulk: Ember.inject.controller(), + bulkAddResponse: Ember.computed.alias('adminGroupsBulk.bulkAddResponse') +}); diff --git a/app/assets/javascripts/admin/controllers/admin-groups-bulk.js.es6 b/app/assets/javascripts/admin/controllers/admin-groups-bulk.js.es6 index bf60519c5b0..8f8b28f6b45 100644 --- a/app/assets/javascripts/admin/controllers/admin-groups-bulk.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-groups-bulk.js.es6 @@ -6,6 +6,7 @@ export default Ember.Controller.extend({ users: null, groupId: null, saving: false, + bulkAddResponse: null, @computed('saving', 'users', 'groupId') buttonDisabled(saving, users, groupId) { @@ -24,7 +25,8 @@ export default Ember.Controller.extend({ ajax('/admin/groups/bulk', { data: { users, group_id: this.get('groupId') }, method: 'PUT' - }).then(() => { + }).then(result => { + this.set('bulkAddResponse', result); this.transitionToRoute('adminGroups.bulkComplete'); }).catch(popupAjaxError).finally(() => { this.set('saving', false); diff --git a/app/assets/javascripts/admin/templates/groups-bulk-complete.hbs b/app/assets/javascripts/admin/templates/groups-bulk-complete.hbs index 51eb3e4394b..6a2d8b13e5b 100644 --- a/app/assets/javascripts/admin/templates/groups-bulk-complete.hbs +++ b/app/assets/javascripts/admin/templates/groups-bulk-complete.hbs @@ -1 +1,11 @@ -

{{i18n "admin.groups.bulk_complete"}}

+{{#if bulkAddResponse}} +

{{{bulkAddResponse.message}}}

+ {{#if bulkAddResponse.users_not_added}} +

{{i18n "admin.groups.bulk_complete_users_not_added"}}

+ {{#each bulkAddResponse.users_not_added as |user|}} + {{user}}
+ {{/each}} + {{/if}} +{{else}} +

{{i18n "admin.groups.bulk_complete"}}

+{{/if}} diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index e963e506ed5..e37ec691567 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -24,13 +24,22 @@ class Admin::GroupsController < Admin::AdminController def bulk_perform group = Group.find(params[:group_id].to_i) + users_added = 0 if group.present? users = (params[:users] || []).map {|u| u.downcase} - user_ids = User.where("username_lower in (:users) OR email IN (:users)", users: users).pluck(:id) - group.bulk_add(user_ids) if user_ids.present? + valid_emails = valid_usernames = {} + valid_users = User.where("username_lower IN (:users) OR email IN (:users)", users: users).pluck(:id, :username_lower, :email) + valid_users.each do |vu| + valid_emails[vu[1]] = valid_usernames[vu[2]] = vu[0] + vu.slice!(1..2) + end + invalid_users = users.reject! { |u| valid_emails[u] || valid_usernames[u] } + valid_users.flatten! + group.bulk_add(valid_users) if valid_users.present? + users_added = valid_users.count end - render json: success_json + render json: { success: true, message: I18n.t('groups.success.bulk_add', users_added: users_added), users_not_added: invalid_users } end def create diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 98265b0275a..1fe41dedfda 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -2600,6 +2600,7 @@ en: add_members: "Add members" custom: "Custom" bulk_complete: "The users have been added to the group." + bulk_complete_users_not_added: "These users were not added:" bulk: "Bulk Add to Group" bulk_paste: "Paste a list of usernames or emails, one per line:" bulk_select: "(select a group)" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 40617b68e0f..f01638a653c 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -255,6 +255,8 @@ en: delete_reason: "Deleted via post moderation queue" groups: + success: + bulk_add: "%{users_added} users have been added to the group." errors: can_not_modify_automatic: "You cannot modify an automatic group" member_already_exist: "'%{username}' is already a member of this group." diff --git a/spec/controllers/admin/groups_controller_spec.rb b/spec/controllers/admin/groups_controller_spec.rb index e818241514b..bb7ebbf71a3 100644 --- a/spec/controllers/admin/groups_controller_spec.rb +++ b/spec/controllers/admin/groups_controller_spec.rb @@ -69,6 +69,11 @@ describe Admin::GroupsController do expect(user2.primary_group).to eq(group) expect(user2.title).to eq("WAT") expect(user2.trust_level).to eq(4) + + # verify JSON response + json = ::JSON.parse(response.body) + expect(json['message']).to eq("2 users have been added to the group.") + expect(json['users_not_added'][0]).to eq("doesnt_exist") end end