Moved the members (project_members)option to a single controller called members
This controller is going to contain both the project members and groups options for the settings gear. Generated the route and modified the routing to point to the new members setting path
This commit is contained in:
		
							parent
							
								
									365612ce36
								
							
						
					
					
						commit
						4cd139e948
					
				| 
						 | 
				
			
			@ -216,6 +216,7 @@
 | 
			
		|||
          new UsersSelect();
 | 
			
		||||
          break;
 | 
			
		||||
        case 'projects:project_members:index':
 | 
			
		||||
        case 'projects:members:show':
 | 
			
		||||
          new gl.MemberExpirationDate();
 | 
			
		||||
          new gl.Members();
 | 
			
		||||
          new UsersSelect();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,7 +53,7 @@ class Projects::ProjectMembersController < Projects::ApplicationController
 | 
			
		|||
  def create
 | 
			
		||||
    status = Members::CreateService.new(@project, current_user, params).execute
 | 
			
		||||
 | 
			
		||||
    redirect_url = namespace_project_project_members_path(@project.namespace, @project)
 | 
			
		||||
    redirect_url = namespace_project_settings_members_path(@project.namespace, @project)
 | 
			
		||||
 | 
			
		||||
    if status
 | 
			
		||||
      redirect_to redirect_url, notice: 'Users were successfully added.'
 | 
			
		||||
| 
						 | 
				
			
			@ -76,14 +76,14 @@ class Projects::ProjectMembersController < Projects::ApplicationController
 | 
			
		|||
 | 
			
		||||
    respond_to do |format|
 | 
			
		||||
      format.html do
 | 
			
		||||
        redirect_to namespace_project_project_members_path(@project.namespace, @project)
 | 
			
		||||
        redirect_to namespace_project_settings_members_path(@project.namespace, @project)
 | 
			
		||||
      end
 | 
			
		||||
      format.js { head :ok }
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def resend_invite
 | 
			
		||||
    redirect_path = namespace_project_project_members_path(@project.namespace, @project)
 | 
			
		||||
    redirect_path = namespace_project_settings_members_path(@project.namespace, @project)
 | 
			
		||||
 | 
			
		||||
    @project_member = @project.project_members.find(params[:id])
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +106,7 @@ class Projects::ProjectMembersController < Projects::ApplicationController
 | 
			
		|||
      return render_404
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    redirect_to(namespace_project_project_members_path(project.namespace, project),
 | 
			
		||||
    redirect_to(namespace_project_settings_members_path(project.namespace, project),
 | 
			
		||||
                notice: notice)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,52 @@
 | 
			
		|||
module Projects
 | 
			
		||||
  module Settings
 | 
			
		||||
    class MembersController < Projects::ApplicationController
 | 
			
		||||
      include SortingHelper
 | 
			
		||||
      
 | 
			
		||||
      def show
 | 
			
		||||
        @sort = params[:sort].presence || sort_value_name
 | 
			
		||||
        @group_links = @project.project_group_links
 | 
			
		||||
 | 
			
		||||
        @project_members = @project.project_members
 | 
			
		||||
        @project_members = @project_members.non_invite unless can?(current_user, :admin_project, @project)
 | 
			
		||||
 | 
			
		||||
        group = @project.group
 | 
			
		||||
 | 
			
		||||
        if group
 | 
			
		||||
          # We need `.where.not(user_id: nil)` here otherwise when a group has an
 | 
			
		||||
          # invitee, it would make the following query return 0 rows since a NULL
 | 
			
		||||
          # user_id would be present in the subquery
 | 
			
		||||
          # See http://stackoverflow.com/questions/129077/not-in-clause-and-null-values
 | 
			
		||||
          # FIXME: This whole logic should be moved to a finder!
 | 
			
		||||
          non_null_user_ids = @project_members.where.not(user_id: nil).select(:user_id)
 | 
			
		||||
          group_members = group.group_members.where.not(user_id: non_null_user_ids)
 | 
			
		||||
          group_members = group_members.non_invite unless can?(current_user, :admin_group, @group)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        if params[:search].present?
 | 
			
		||||
          user_ids = @project.users.search(params[:search]).select(:id)
 | 
			
		||||
          @project_members = @project_members.where(user_id: user_ids)
 | 
			
		||||
 | 
			
		||||
          if group_members
 | 
			
		||||
            user_ids = group.users.search(params[:search]).select(:id)
 | 
			
		||||
            group_members = group_members.where(user_id: user_ids)
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          @group_links = @project.project_group_links.where(group_id: @project.invited_groups.search(params[:search]).select(:id))
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        wheres = ["members.id IN (#{@project_members.select(:id).to_sql})"]
 | 
			
		||||
        wheres << "members.id IN (#{group_members.select(:id).to_sql})" if group_members
 | 
			
		||||
 | 
			
		||||
        @project_members = Member.
 | 
			
		||||
          where(wheres.join(' OR ')).
 | 
			
		||||
          sort(@sort).
 | 
			
		||||
          page(params[:page])
 | 
			
		||||
 | 
			
		||||
        @requesters = AccessRequestsFinder.new(@project).execute(current_user)
 | 
			
		||||
 | 
			
		||||
        @project_member = @project.project_members.new
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -206,4 +206,9 @@ module GitlabRoutingHelper
 | 
			
		|||
      file_namespace_project_build_artifacts_path(*args)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Settings
 | 
			
		||||
  def project_settings_members_path(project, *args)
 | 
			
		||||
    namespace_project_settings_members_path(project.namespace, project, *args)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -75,7 +75,7 @@ module SearchHelper
 | 
			
		|||
        { category: "Current Project", label: "Merge Requests", url: namespace_project_merge_requests_path(@project.namespace, @project) },
 | 
			
		||||
        { category: "Current Project", label: "Milestones",     url: namespace_project_milestones_path(@project.namespace, @project) },
 | 
			
		||||
        { category: "Current Project", label: "Snippets",       url: namespace_project_snippets_path(@project.namespace, @project) },
 | 
			
		||||
        { category: "Current Project", label: "Members",        url: namespace_project_project_members_path(@project.namespace, @project) },
 | 
			
		||||
        { category: "Current Project", label: "Members",        url: namespace_project_settings_members_path(@project.namespace, @project) },
 | 
			
		||||
        { category: "Current Project", label: "Wiki",           url: namespace_project_wikis_path(@project.namespace, @project) },
 | 
			
		||||
      ]
 | 
			
		||||
    else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
- if project_nav_tab? :team
 | 
			
		||||
  = nav_link(controller: [:project_members, :teams]) do
 | 
			
		||||
    = link_to namespace_project_project_members_path(@project.namespace, @project), title: 'Members', class: 'team-tab tab' do
 | 
			
		||||
  = nav_link(controller: [:members, :teams]) do
 | 
			
		||||
    = link_to namespace_project_settings_members_path(@project.namespace, @project), title: 'Members', class: 'team-tab tab' do
 | 
			
		||||
      %span
 | 
			
		||||
        Members
 | 
			
		||||
- if can_edit
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
.row.prepend-top-default
 | 
			
		||||
  .col-lg-3.settings-sidebar
 | 
			
		||||
    %h4.prepend-top-0
 | 
			
		||||
      Members
 | 
			
		||||
      = link_to "Import", import_namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-default hidden-xs visible-sm pull-right", title: "Import members from another project"
 | 
			
		||||
    - if can?(current_user, :admin_project_member, @project)
 | 
			
		||||
      %p
 | 
			
		||||
        Add new user to
 | 
			
		||||
        %strong= @project.name
 | 
			
		||||
  .col-lg-9
 | 
			
		||||
    .light.prepend-top-default
 | 
			
		||||
      - if can?(current_user, :admin_project_member, @project)
 | 
			
		||||
        = render "projects/project_members/new_project_member"
 | 
			
		||||
 | 
			
		||||
        = render 'shared/members/requests', membership_source: @project, requesters: @requesters
 | 
			
		||||
        .append-bottom-default.clearfix
 | 
			
		||||
          %h5.member.existing-title
 | 
			
		||||
            Existing users and groups
 | 
			
		||||
        - if @group_links.any?
 | 
			
		||||
          = render 'groups', group_links: @group_links
 | 
			
		||||
 | 
			
		||||
    .append-bottom-default.clearfix
 | 
			
		||||
    - if @group_links.any?
 | 
			
		||||
      = render 'groups', group_links: @group_links
 | 
			
		||||
 | 
			
		||||
    = render 'projects/project_members/team', members: @project_members
 | 
			
		||||
    = paginate @project_members, theme: "gitlab"
 | 
			
		||||
| 
						 | 
				
			
			@ -1,17 +1,17 @@
 | 
			
		|||
= form_for @project_member, as: :project_member, url: namespace_project_project_members_path(@project.namespace, @project), html: { class: 'users-project-form' } do |f|
 | 
			
		||||
= form_for @project_member, as: :project_member, url: namespace_project_settings_members_path(@project.namespace, @project), html: { class: 'users-project-form' } do |f|
 | 
			
		||||
  .row
 | 
			
		||||
    .col-md-4.col-lg-6
 | 
			
		||||
    .col-md-5.col-lg-5
 | 
			
		||||
      = users_select_tag(:user_ids, multiple: true, class: "input-clamp", scope: :all, email_user: true)
 | 
			
		||||
      .help-block.append-bottom-10
 | 
			
		||||
        Search for users by name, username, or email, or invite new ones using their email address.
 | 
			
		||||
 | 
			
		||||
    .col-md-3.col-lg-2
 | 
			
		||||
    .col-md-2.col-lg-2
 | 
			
		||||
      = select_tag :access_level, options_for_select(ProjectMember.access_level_roles, @project_member.access_level), class: "form-control project-access-select"
 | 
			
		||||
      .help-block.append-bottom-10
 | 
			
		||||
        = link_to "Read more", help_page_path("user/permissions"), class: "vlink"
 | 
			
		||||
        about role permissions
 | 
			
		||||
 | 
			
		||||
    .col-md-3.col-lg-2
 | 
			
		||||
    .col-md-2
 | 
			
		||||
      .clearable-input
 | 
			
		||||
        = text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date', placeholder: 'Expiration date'
 | 
			
		||||
        %i.clear-icon.js-clear-input
 | 
			
		||||
| 
						 | 
				
			
			@ -20,3 +20,5 @@
 | 
			
		|||
 | 
			
		||||
    .col-md-2
 | 
			
		||||
      = f.submit "Add to project", class: "btn btn-create btn-block"
 | 
			
		||||
    .col-md-1
 | 
			
		||||
      = link_to "Import", import_namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-default hidden-xs hidden-sm pull-right", title: "Import members from another project"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,5 +3,11 @@
 | 
			
		|||
    Users with access to
 | 
			
		||||
    %strong #{@project.name}
 | 
			
		||||
    %span.badge= @project_members.total_count
 | 
			
		||||
    = form_tag namespace_project_settings_members_path(@project.namespace, @project), method: :get, class: 'form-inline member-search-form'  do
 | 
			
		||||
      .form-group
 | 
			
		||||
        = search_field_tag :search, params[:search], { placeholder: 'Find existing members by name', class: 'form-control', spellcheck: false }
 | 
			
		||||
        %button.member-search-btn{ type: "submit", "aria-label" => "Submit search" }
 | 
			
		||||
          = icon("search")
 | 
			
		||||
        = render 'shared/members/sort_dropdown'
 | 
			
		||||
  %ul.content-list
 | 
			
		||||
    = render partial: 'shared/members/member', collection: members, as: :member
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,5 +12,4 @@
 | 
			
		|||
 | 
			
		||||
  .form-actions
 | 
			
		||||
    = button_tag 'Import project members', class: "btn btn-create"
 | 
			
		||||
    = link_to "Cancel", namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-cancel"
 | 
			
		||||
 | 
			
		||||
    = link_to "Cancel", namespace_project_settings_members_path(@project.namespace, @project), class: "btn btn-cancel"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,29 +0,0 @@
 | 
			
		|||
- page_title "Members"
 | 
			
		||||
 | 
			
		||||
.project-members-page.prepend-top-default
 | 
			
		||||
  %h4.project-members-title.clearfix
 | 
			
		||||
    Members
 | 
			
		||||
    = link_to "Import", import_namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-default pull-right hidden-xs", title: "Import members from another project"
 | 
			
		||||
  - if can?(current_user, :admin_project_member, @project)
 | 
			
		||||
    .project-members-new.append-bottom-default
 | 
			
		||||
      %p.clearfix
 | 
			
		||||
        Add new user to
 | 
			
		||||
        %strong= @project.name
 | 
			
		||||
      = render "new_project_member"
 | 
			
		||||
 | 
			
		||||
      = render 'shared/members/requests', membership_source: @project, requesters: @requesters
 | 
			
		||||
 | 
			
		||||
  .append-bottom-default.clearfix
 | 
			
		||||
    %h5.member.existing-title
 | 
			
		||||
      Existing users and groups
 | 
			
		||||
    = form_tag namespace_project_project_members_path(@project.namespace, @project), method: :get, class: 'form-inline member-search-form'  do
 | 
			
		||||
      .form-group
 | 
			
		||||
        = search_field_tag :search, params[:search], { placeholder: 'Find existing members by name', class: 'form-control', spellcheck: false }
 | 
			
		||||
        %button.member-search-btn{ type: "submit", "aria-label" => "Submit search" }
 | 
			
		||||
          = icon("search")
 | 
			
		||||
        = render 'shared/members/sort_dropdown'
 | 
			
		||||
  - if @group_links.any?
 | 
			
		||||
    = render 'groups', group_links: @group_links
 | 
			
		||||
 | 
			
		||||
  = render 'team', members: @project_members
 | 
			
		||||
  = paginate @project_members, theme: "gitlab"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
- page_title "Members"
 | 
			
		||||
 | 
			
		||||
=render "projects/project_members/index"
 | 
			
		||||
| 
						 | 
				
			
			@ -307,6 +307,10 @@ constraints(ProjectUrlConstrainer.new) do
 | 
			
		|||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      namespace :settings do
 | 
			
		||||
        resource :members, only: [:show]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      # Since both wiki and repository routing contains wildcard characters
 | 
			
		||||
      # its preferable to keep it below all other project routes
 | 
			
		||||
      draw :wiki
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ feature 'Projects > Members > User requests access', feature: true do
 | 
			
		|||
    open_project_settings_menu
 | 
			
		||||
    click_link 'Members'
 | 
			
		||||
 | 
			
		||||
    visit namespace_project_project_members_path(project.namespace, project)
 | 
			
		||||
    visit namespace_project_settings_members_path(project.namespace, project)
 | 
			
		||||
    page.within('.content') do
 | 
			
		||||
      expect(page).not_to have_content(user.name)
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue