diff --git a/app/assets/javascripts/users/settings/teams/invite_users_modal.js b/app/assets/javascripts/users/settings/teams/invite_users_modal.js index f664381d6..c75296469 100644 --- a/app/assets/javascripts/users/settings/teams/invite_users_modal.js +++ b/app/assets/javascripts/users/settings/teams/invite_users_modal.js @@ -143,11 +143,11 @@ switch (type) { case 'invite_to_team': data.team_ids = [modal.attr('data-team-id')]; - data.role = $(this).attr('data-team-role'); + data.role_id = $(this).attr('data-team-role-id'); break; case 'invite_to_team_with_role': data.team_ids = [modal.attr('data-team-id')]; - data.role = modal.attr('data-team-role'); + data.role_id = modal.attr('data-team-role-id'); break; case 'invite': data.team_ids = []; @@ -155,13 +155,13 @@ case 'invite_with_team_selector': if (teamSelectorCheckbox.is(':checked')) { data.team_ids = [teamSelectorDropdown.val()]; - data.role = $(this).attr('data-team-role'); + data.role_id = $(this).attr('data-team-role-id'); } break; case 'invite_with_team_selector_and_role': if (teamSelectorCheckbox.is(':checked')) { data.team_ids = [teamSelectorDropdown.val()]; - data.role = modal.attr('data-team-role'); + data.role_id = modal.attr('data-team-role-id'); } break; default: diff --git a/app/controllers/users/invitations_controller.rb b/app/controllers/users/invitations_controller.rb index e89d49277..3a4fa9b6e 100644 --- a/app/controllers/users/invitations_controller.rb +++ b/app/controllers/users/invitations_controller.rb @@ -25,12 +25,6 @@ module Users if user.errors.blank? @team.created_by = user @team.save - - UserTeam.create( - user: user, - team: @team, - role: 'admin' - ) end end end @@ -77,7 +71,7 @@ module Users next end # Check if user already exists - user = User.find_by_email(email) + user = User.find_by(email: email) if user result[:status] = :user_exists @@ -101,24 +95,19 @@ module Users end if @teams.any? && user + @user_role ||= UserRole.find_by(name: UserRole.public_send('normal_user_role').name) @teams.each do |team| - user_team = UserTeam.find_by(user_id: user.id, team_id: team.id) - if user_team + if team.user_assignments.exists?(user: user) result[:status] = :user_exists_and_in_team else # Also generate user team relation - user_team = UserTeam.new( - user: user, - team: team, - role: @role || 'normal_user' - ) - user_team.save + team.user_assignments.create(user: user, user_role: @user_role, assigned_by: current_user) generate_notification( @user, user, - user_team.team, - user_team.role_str + team, + @user_role.name ) Activities::CreateActivityService @@ -129,7 +118,7 @@ module Users message_items: { team: team.id, user_invited: user.id, - role: user_team.role_str + role: @user_role.name }) result[:status] = if result[:status] == :user_exists && !user.confirmed? @@ -141,8 +130,8 @@ module Users end end - result[:user_team] = user_team - result[:team] = team + result[:user_role_name] = @user_role.name + result[:team_name] = team.name end end @@ -163,8 +152,9 @@ module Users def invitable_teams teams = current_user.teams .select(:id, :name) - .joins(:user_teams) - .where('user_teams.role': UserTeam.roles[:admin]) + .joins(user_assignments: :user_role) + .where(user_assignments: { user: current_user }) + .where('? = ANY(user_roles.permissions)', TeamPermissions::USERS_MANAGE) .distinct teams = teams.where_attributes_like(:name, params[:query]) if params[:query].present? @@ -207,10 +197,9 @@ module Users @teams = Team.where(id: params[:team_ids]).select { |team| can_manage_team_users?(team) } return render_403 if params[:team_ids].present? && @teams.blank? - @role = params['role'] + @user_role = UserRole.find_by(id: params[:role_id]) return render_403 if @emails.blank? # We must have at least one email - return render_403 if @role && !UserTeam.roles.key?(@role) # if we select role, we must check that this role exist end end end diff --git a/app/helpers/user_roles_helper.rb b/app/helpers/user_roles_helper.rb index d0abfd844..4d0508e11 100644 --- a/app/helpers/user_roles_helper.rb +++ b/app/helpers/user_roles_helper.rb @@ -6,4 +6,14 @@ module UserRolesHelper @user_roles_collection ||= UserRole.order(id: :asc).pluck(:name, :id) end end + + def team_user_roles_collection + team_permissions = + PermissionExtends::TeamPermissions.constants.map { |const| TeamPermissions.const_get(const) } + + ProtocolPermissions.constants.map { |const| ProtocolPermissions.const_get(const) } + + RepositoryPermissions.constants.map { |const| RepositoryPermissions.const_get(const) } + UserRole.where('permissions && ARRAY[?]::varchar[]', team_permissions) + .sort_by { |user_role| (user_role.permissions & team_permissions).length } + .reverse! + end end diff --git a/app/views/shared/_invite_users_modal.html.erb b/app/views/shared/_invite_users_modal.html.erb index 3ef15f11b..80959c47e 100644 --- a/app/views/shared/_invite_users_modal.html.erb +++ b/app/views/shared/_invite_users_modal.html.erb @@ -157,15 +157,13 @@ invite_with_team_selector = type.in?(%w(invite_new_members invite_with_team_sele diff --git a/app/views/shared/_invite_users_modal_results.html.erb b/app/views/shared/_invite_users_modal_results.html.erb index 47394191f..1dc576389 100644 --- a/app/views/shared/_invite_users_modal_results.html.erb +++ b/app/views/shared/_invite_users_modal_results.html.erb @@ -15,24 +15,24 @@ <%= result[:email] %>  -  <%= t('invite_users.results.user_exists_and_in_team', - team: result[:team].name, - role: t("user_teams.enums.role.#{result[:user_team].role}")) %> + team: result[:team_name], + role: result[:user_role_name]) %> <% elsif result[:status] == :user_exists_unconfirmed_invited_to_team %> <% elsif result[:status] == :user_exists_invited_to_team %> <% elsif result[:status] == :user_created %> <% elsif result[:status] == :user_invalid %>