app/views/users/show.html.haml (60 lines of code) (raw):
- @hide_top_links = true
- @no_container = true
- breadcrumb_title user_display_name(@user)
- page_title user_display_name(@user)
- page_description @user.bio unless @user.blocked? || !@user.confirmed?
- page_itemtype 'http://schema.org/Person'
- add_page_specific_style 'page_bundles/profile'
- add_page_specific_style 'page_bundles/projects'
- @force_desktop_expanded_sidebar = true
- nav "user_profile"
- allowable_actions = profile_actions(@user)
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, user_url(@user, format: :atom), title: "#{@user.name} activity")
%div{ class: container_class }
.user-profile-header.gl-flex.gl-justify-between.gl-flex-col.md:gl-flex-row-reverse.gl-my-5{ 'data-testid': 'user-profile-header' }
%div
.cover-controls.gl-flex.gl-gap-3.gl-mb-4.md:gl-justify-end.md:gl-flex-row-reverse
.js-user-profile-actions{ data: user_profile_actions_data(@user) }
= render 'users/follow_user'
-# The following edit button is mutually exclusive to the follow user button, they won't be shown together
- if @user == current_user
= render Pajamas::ButtonComponent.new(href: user_settings_profile_path,
button_options: { title: s_('UserProfile|Edit profile') }) do
= s_("UserProfile|Edit profile")
= render 'users/view_gpg_keys'
= render 'users/view_user_in_admin_area'
.gl-flex.gl-flex-row.gl-items-center.gl-gap-x-5.gl-mt-2.sm:gl-mt-0
.user-image.gl-relative.gl-md-py-3
= link_to avatar_icon_for_user(@user, 400, current_user: current_user), target: '_blank', rel: 'noopener noreferrer', title: s_('UserProfile|View large avatar') do
= render Pajamas::AvatarComponent.new(@user, alt: s_('UserProfile|User profile picture'), size: 96, avatar_options: { itemprop: "image" })
- if @user.status&.busy?
= render Pajamas::BadgeComponent.new(s_('UserProfile|Busy'), variant: 'warning', class: 'gl-absolute gl-flex gl-justify-center gl-items-center gl-left-1/2 gl-border gl-border-white -gl-translate-x-1/2 gl-top-full -gl-mt-3')
%div
%h1.gl-heading-1.gl-leading-1.gl-mr-2{ class: '!gl-my-0', itemprop: 'name' }
= user_display_name(@user)
.gl-text-size-h2.gl-text-subtle.gl-font-normal.gl-my-0
= @user.to_reference
- if !@user.blocked? && @user.confirmed? && @user.status&.customized?
.gl-my-2.cover-status.gl-text-sm.gl-pt-2.gl-flex.gl-flex-col
.gl-inline-flex.gl-gap-3.gl-items-baseline
= emoji_icon(@user.status.emoji)
= markdown_field(@user.status, :message)
.user-profile{ class: @user.blocked? ? '' : 'user-profile-with-sidebar' }
.user-profile-content
- if allowable_actions.any?
- if Feature.enabled?(:profile_tabs_vue, current_user)
#js-user-profile-app{ data: user_profile_app_data(@user) }
- else
= render 'users/legacy_tabs', action: @action, endpoint: @endpoint, allowable_actions: allowable_actions
.loading.hide
= render Pajamas::SpinnerComponent.new(size: :md)
- else
- if @user.blocked?
= render Pajamas::EmptyStateComponent.new(svg_path: 'illustrations/empty-state/empty-access-md.svg',
title: s_('UserProfile|This user is blocked'))
- else
= render Pajamas::EmptyStateComponent.new(svg_path: 'illustrations/empty-state/empty-private-md.svg',
title: s_('UserProfile|This user has a private profile'))
- unless @user.blocked?
= render 'users/profile_sidebar'