From b21024684b7c8f9fdef524873434e057de7a2713 Mon Sep 17 00:00:00 2001
From: James Gregory <james.gregory@epigenesys.org.uk>
Date: Wed, 28 Dec 2016 22:22:57 +0000
Subject: [PATCH] Merged the 'groups' and 'projects' tabs when viewing user
 profiles

---
 app/assets/stylesheets/framework/common.scss  |  1 +
 app/controllers/admin/users_controller.rb     |  3 ---
 app/views/admin/users/_head.html.haml         |  4 +---
 app/views/admin/users/groups.html.haml        | 20 -------------------
 app/views/admin/users/projects.html.haml      | 16 ++++++++++-----
 ...eature-admin-merge-groups-and-projects.yml |  4 ++++
 config/routes/admin.rb                        |  1 -
 spec/features/admin/admin_users_spec.rb       | 17 ++++++++++++++++
 8 files changed, 34 insertions(+), 32 deletions(-)
 delete mode 100644 app/views/admin/users/groups.html.haml
 create mode 100644 changelogs/unreleased/feature-admin-merge-groups-and-projects.yml

diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss
index 34757c57acf..67b5aa37ae7 100644
--- a/app/assets/stylesheets/framework/common.scss
+++ b/app/assets/stylesheets/framework/common.scss
@@ -26,6 +26,7 @@
 .append-bottom-default { margin-bottom: $gl-padding; }
 .inline { display: inline-block; }
 .center { text-align: center; }
+.vertical-align-middle { vertical-align: middle; }
 
 .underlined-link { text-decoration: underline; }
 .hint { font-style: italic; color: $hint-color; }
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index bb912ed10cc..df9039b16b2 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -16,9 +16,6 @@ class Admin::UsersController < Admin::ApplicationController
     @joined_projects = user.projects.joined(@user)
   end
 
-  def groups
-  end
-
   def keys
     @keys = user.keys
   end
diff --git a/app/views/admin/users/_head.html.haml b/app/views/admin/users/_head.html.haml
index ce5e21e54cc..9984e733956 100644
--- a/app/views/admin/users/_head.html.haml
+++ b/app/views/admin/users/_head.html.haml
@@ -15,10 +15,8 @@
 %ul.nav-links
   = nav_link(path: 'users#show') do
     = link_to "Account", admin_user_path(@user)
-  = nav_link(path: 'users#groups') do
-    = link_to "Groups", groups_admin_user_path(@user)
   = nav_link(path: 'users#projects') do
-    = link_to "Projects", projects_admin_user_path(@user)
+    = link_to "Groups and projects", projects_admin_user_path(@user)
   = nav_link(path: 'users#keys') do
     = link_to "SSH keys", keys_admin_user_path(@user)
   = nav_link(controller: :identities) do
diff --git a/app/views/admin/users/groups.html.haml b/app/views/admin/users/groups.html.haml
deleted file mode 100644
index 8f6d13b881a..00000000000
--- a/app/views/admin/users/groups.html.haml
+++ /dev/null
@@ -1,20 +0,0 @@
-- page_title "Groups", @user.name, "Users"
-= render 'admin/users/head'
-
-- group_members = @user.group_members.includes(:source)
-- if group_members.any?
-  .panel.panel-default
-    .panel-heading Groups:
-    %ul.well-list
-      - group_members.each do |group_member|
-        - group = group_member.group
-        %li.group_member
-          %span{class: ("list-item-name" unless group_member.owner?)}
-            %strong= link_to group.name, admin_group_path(group)
-          .pull-right
-            %span.light= group_member.human_access
-            - unless group_member.owner?
-              = link_to group_group_member_path(group, group_member), data: { confirm: remove_member_message(group_member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from group' do
-                %i.fa.fa-times.fa-inverse
-- else
-  .nothing-here-block This user has no groups.
diff --git a/app/views/admin/users/projects.html.haml b/app/views/admin/users/projects.html.haml
index dd6b7303493..15eaf1c0e67 100644
--- a/app/views/admin/users/projects.html.haml
+++ b/app/views/admin/users/projects.html.haml
@@ -1,15 +1,21 @@
-- page_title "Projects", @user.name, "Users"
+- page_title "Groups and projects", @user.name, "Users"
 = render 'admin/users/head'
 
 - if @user.groups.any?
   .panel.panel-default
     .panel-heading Group projects
     %ul.well-list
-      - @user.groups.each do |group|
-        %li
+      - @user.group_members.includes(:source).each do |group_member|
+        - group = group_member.group
+        %li.group_member
           %strong= link_to group.name, admin_group_path(group)
           &ndash; access to
           #{pluralize(group.projects.count, 'project')}
+          .pull-right
+            %span.light.vertical-align-middle= group_member.human_access
+            - unless group_member.owner?
+              = link_to group_group_member_path(group, group_member), data: { confirm: remove_member_message(group_member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove prepend-left-10", title: 'Remove user from group' do
+                %i.fa.fa-times.fa-inverse
 
 .row
   .col-md-6
@@ -35,8 +41,8 @@
                 - if member.owner?
                   %span.light Owner
                 - else
-                  %span.light= member.human_access
+                  %span.light.vertical-align-middle= member.human_access
 
                   - if member.respond_to? :project
-                    = link_to namespace_project_project_member_path(project.namespace, project, member), data: { confirm: remove_member_message(member) }, remote: true, method: :delete, class: "btn-xs btn btn-remove", title: 'Remove user from project' do
+                    = link_to namespace_project_project_member_path(project.namespace, project, member), data: { confirm: remove_member_message(member) }, remote: true, method: :delete, class: "btn-xs btn btn-remove prepend-left-10", title: 'Remove user from project' do
                       %i.fa.fa-times
diff --git a/changelogs/unreleased/feature-admin-merge-groups-and-projects.yml b/changelogs/unreleased/feature-admin-merge-groups-and-projects.yml
new file mode 100644
index 00000000000..0c0b74b686a
--- /dev/null
+++ b/changelogs/unreleased/feature-admin-merge-groups-and-projects.yml
@@ -0,0 +1,4 @@
+---
+title: Merged the 'Groups' and 'Projects' tabs when viewing user profiles
+merge_request: 8323
+author: James Gregory
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 23295b43c92..8e99239f350 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -6,7 +6,6 @@ namespace :admin do
     member do
       get :projects
       get :keys
-      get :groups
       put :block
       put :unblock
       put :unlock
diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb
index e31325ce47b..55ffc6761f8 100644
--- a/spec/features/admin/admin_users_spec.rb
+++ b/spec/features/admin/admin_users_spec.rb
@@ -1,6 +1,8 @@
 require 'spec_helper'
 
 describe "Admin::Users", feature: true  do
+  include WaitForAjax
+
   before { login_as :admin }
 
   describe "GET /admin/users" do
@@ -252,5 +254,20 @@ describe "Admin::Users", feature: true  do
       end
       expect(page).to have_content @project.name
     end
+
+    it 'shows the group access level' do
+      within(:css, '.append-bottom-default + .panel') do
+        expect(page).to have_content 'Developer'
+      end
+    end
+
+    it 'allows group membership to be revoked', js: true do
+      page.within(first('.group_member')) do
+        find('.btn-remove').click
+      end
+      wait_for_ajax
+
+      expect(page).not_to have_selector('.group_member')
+    end
   end
 end
-- 
GitLab