1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
- add_page_specific_style 'page_bundles/members'
- add_to_breadcrumbs _("Groups"), admin_groups_path
- breadcrumb_title @group.name
- page_title @group.name, _("Groups")
- current_user_is_group_owner = @group && @group.has_owner?(current_user)
- list_item_classes = '!gl-grid md:gl-grid-cols-3 gl-gap-x-3'
= render ::Layouts::PageHeadingComponent.new(@group.full_name) do |c|
- c.with_actions do
= render Pajamas::ButtonComponent.new(href: admin_group_edit_path(@group),
button_options: { data: { testid: 'edit-group-link' }}) do
= _('Edit')
.gl-grid.md:gl-grid-cols-2.gl-gap-5
.gl-flex.gl-flex-col.gl-gap-5
= render ::Layouts::CrudComponent.new(_('Group information')) do |c|
- c.with_body do
%ul.content-list.content-list-items-padding
%li
= render Pajamas::AvatarComponent.new(@group, size: 64, alt: '')
%li{ class: list_item_classes }
%span.gl-text-secondary= _('Name:')
.gl-col-span-2
%strong= link_to @group.name, group_path(@group)
%li{ class: list_item_classes }
%span.gl-text-secondary= _('Path:')
.gl-col-span-2
%strong= @group.path
%li{ class: list_item_classes }
%span.gl-text-secondary= _('Description:')
.gl-col-span-2
%strong= @group.description
%li{ class: list_item_classes }
%span.gl-text-secondary= _('Visibility level:')
.gl-col-span-2
%strong= visibility_level_label(@group.visibility_level)
%li{ class: list_item_classes }
%span.gl-text-secondary= _('Created on:')
.gl-col-span-2
%strong= @group.created_at.to_fs(:medium)
%li{ class: list_item_classes }
%span.gl-text-secondary= _('ID:')
.gl-col-span-2
%strong= @group.id
= render_if_exists 'admin/namespace_plan_info', namespace: @group
%li{ class: list_item_classes }
= render 'shared/storage_counter_statistics', storage_size: @group.storage_size, storage_details: @group, namespace: @group
%li{ class: list_item_classes }
%span.gl-text-secondary= _('Group Git LFS status:')
.gl-col-span-2
%strong
= group_lfs_status(@group)
= link_to sprite_icon('question-o', css_class: 'gl-text-blue-600'), help_page_path('topics/git/lfs/index.md')
= render_if_exists 'namespaces/shared_runner_status', namespace: @group
= render_if_exists 'namespaces/additional_minutes_status', namespace: @group
= render ::Layouts::CrudComponent.new(_('Projects'),
icon: 'project',
count: @group.projects.count) do |c|
- c.with_body do
- if @projects.any?
%ul.content-list.content-list-items-padding
- @projects.each do |project|
%li{ class: '!gl-flex gl-flex-col' }
%strong
= link_to project.full_name, [:admin, project]
= gl_badge_tag storage_counter(project.statistics.storage_size)
%span.gl-font-monospace.gl-text-secondary.gl-text-sm
= project.full_path + '.git'
- else
%p.gl-text-center= _('No projects')
- unless @projects.size < Kaminari.config.default_per_page
- c.with_footer do
= paginate @projects, param_name: 'projects_page', theme: 'gitlab'
- shared_projects = @group.shared_projects.sort_by(&:name)
- unless shared_projects.empty?
= render ::Layouts::CrudComponent.new(_('Projects shared with %{group_name}') % { group_name: @group.name },
icon: 'project',
count: shared_projects.size) do |c|
- c.with_body do
%ul.content-list.content-list-items-padding
- shared_projects.each do |project|
%li{ class: '!gl-flex gl-flex-col' }
%strong
= link_to project.full_name, [:admin, project]
= gl_badge_tag storage_counter(project.statistics.storage_size)
%span.gl-font-monospace.gl-text-secondary.gl-text-sm
= project.full_path + '.git'
- if can?(current_user, :admin_group_member, @group)
= render 'shared/members/requests', membership_source: @group, group: @group, requesters: @requesters, force_mobile_view: true
.gl-flex.gl-flex-col.gl-gap-5
= render 'shared/admin/admin_note'
= render ::Layouts::CrudComponent.new(_('Group members'),
icon: 'user',
count: @group.users_count) do |c|
- c.with_description do
- direct_members_link = link_to('', help_page_path('user/project/members/index.md', anchor: 'membership-types'))
- direct_members_message = s_('The number of direct members in the current group. Members in subgroups are not included. %{link_start}What is a direct member%{link_end}?')
- if @group.root?
= safe_format(direct_members_message, tag_pair(direct_members_link, :link_start, :link_end))
- c.with_actions do
= render 'shared/members/manage_access_button', path: group_group_members_path(@group)
- c.with_body do
%ul.content-list.group-users-list.members-list
= render partial: 'shared/members/member',
collection: @members, as: :member,
locals: { membership_source: @group,
group: @group,
current_user_is_group_owner: current_user_is_group_owner }
- unless @members.size < Kaminari.config.default_per_page
- c.with_footer do
= paginate @members, param_name: 'members_page', theme: 'gitlab'
= render 'shared/custom_attributes', custom_attributes: @group.custom_attributes
= render_if_exists 'ldap_group_links/ldap_group_links_show', group: @group
|