- @hide_top_links = true - @hide_breadcrumbs = true - @no_container = true - page_title user_display_name(@user) - page_description @user.bio_html - header_title @user.name, user_path(@user) - page_itemtype 'http://schema.org/Person' - link_classes = "flex-grow-1 mx-1 " = content_for :meta_tags do = auto_discovery_link_tag(:atom, user_url(@user, format: :atom), title: "#{@user.name} activity") .user-profile .cover-block.user-cover-block{ class: [('border-bottom' if profile_tabs.empty?)] } = render layout: 'users/cover_controls' do - if @user == current_user = link_to profile_path, class: link_classes + 'btn gl-button btn-default btn-icon has-tooltip', title: s_('UserProfile|Edit profile'), 'aria-label': 'Edit profile', data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do = sprite_icon('pencil') - elsif current_user - if @user.abuse_report %button{ class: link_classes + 'btn gl-button btn-danger btn-icon', title: s_('UserProfile|Already reported for abuse'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } }> = sprite_icon('error') - else = link_to new_abuse_report_path(user_id: @user.id, ref_url: request.referer), class: link_classes + 'btn gl-button btn-default btn-icon', title: s_('UserProfile|Report abuse'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do = sprite_icon('error') - if can?(current_user, :read_user_profile, @user) = link_to user_path(@user, rss_url_options), class: link_classes + 'btn gl-button btn-default btn-icon has-tooltip', title: s_('UserProfile|Subscribe'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do = sprite_icon('rss', css_class: 'qa-rss-icon') - if current_user && current_user.admin? = link_to [:admin, @user], class: link_classes + 'btn gl-button btn-default btn-icon', title: s_('UserProfile|View user in admin area'), data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = sprite_icon('user') - if current_user && current_user.id != @user.id - if current_user.following?(@user) = link_to user_unfollow_path(@user, :json) , class: link_classes + 'btn gl-button btn-default', method: :post do = _('Unfollow') - else = link_to user_follow_path(@user, :json) , class: link_classes + 'btn gl-button btn-confirm', method: :post, data: { qa_selector: 'follow_user_link' } do = _('Follow') .profile-header{ class: [('with-no-profile-tabs' if profile_tabs.empty?)] } .avatar-holder = link_to avatar_icon_for_user(@user, 400), target: '_blank', rel: 'noopener noreferrer' do = image_tag avatar_icon_for_user(@user, 90), class: "avatar s90", alt: '', itemprop: 'image' - if @user.blocked? || !@user.confirmed? .user-info .cover-title = user_display_name(@user) = render "users/profile_basic_info" - else .user-info .cover-title{ itemprop: 'name' } = @user.name - if @user.pronouns.present? %span.gl-font-base.gl-text-gray-500.gl-vertical-align-middle = "(#{@user.pronouns})" - if @user&.status && user_status_set_to_busy?(@user.status) %span.gl-font-base.gl-text-gray-500.gl-vertical-align-middle= s_("UserProfile|(Busy)") - if show_status_emoji?(@user.status) .cover-status.gl-display-inline-flex.gl-align-items-center = emoji_icon(@user.status.emoji, class: 'gl-mr-2') = markdown_field(@user.status, :message) = render "users/profile_basic_info" .cover-desc.cgray.mb-1.mb-sm-2 - unless @user.location.blank? .profile-link-holder.middle-dot-divider-sm.d-block.d-sm-inline.mb-1.mb-sm-0{ itemprop: 'address', itemscope: true, itemtype: 'https://schema.org/PostalAddress' } = sprite_icon('location', css_class: 'fgray') %span{ itemprop: 'addressLocality' } = @user.location .profile-link-holder.middle-dot-divider-sm.d-block.d-sm-inline.mb-1.mb-sm-0 = sprite_icon('clock', css_class: 'fgray') %span = local_time(@user.timezone) - unless work_information(@user).blank? .profile-link-holder.middle-dot-divider-sm.d-block.d-sm-inline = sprite_icon('work', css_class: 'fgray') %span = work_information(@user, with_schema_markup: true) .cover-desc.cgray.mb-1.mb-sm-2 - unless @user.skype.blank? .profile-link-holder.middle-dot-divider = link_to "skype:#{@user.skype}", title: "Skype" do = sprite_icon('skype') - unless @user.linkedin.blank? .profile-link-holder.middle-dot-divider = link_to linkedin_url(@user), title: "LinkedIn", target: '_blank', rel: 'noopener noreferrer nofollow' do = sprite_icon('linkedin') - unless @user.twitter.blank? .profile-link-holder.middle-dot-divider-sm = link_to twitter_url(@user), title: "Twitter", target: '_blank', rel: 'noopener noreferrer nofollow' do = sprite_icon('twitter') - unless @user.website_url.blank? .profile-link-holder.middle-dot-divider-sm.d-block.d-sm-inline.mt-1.mt-sm-0 - if Feature.enabled?(:security_auto_fix) && @user.bot? = sprite_icon('question', css_class: 'gl-text-blue-600') = link_to @user.short_website_url, @user.full_website_url, class: 'text-link', target: '_blank', rel: 'me noopener noreferrer nofollow', itemprop: 'url' - unless @user.public_email.blank? .profile-link-holder.middle-dot-divider-sm.d-block.d-sm-inline.mt-1.mt-sm-0 = link_to @user.public_email, "mailto:#{@user.public_email}", class: 'text-link', itemprop: 'email' .cover-desc.gl-text-gray-900.gl-mb-2.mb-sm-2 = sprite_icon('users', css_class: 'gl-vertical-align-middle gl-text-gray-500') .profile-link-holder.middle-dot-divider = link_to user_followers_path, class: 'text-link' do - count = @user.followers.count = n_('1 follower', '%{count} followers', count) % { count: count } .profile-link-holder.middle-dot-divider = link_to user_following_path, class: 'text-link', data: { qa_selector: 'following_link' } do = @user.followees.count = _('following') - if @user.bio.present? .cover-desc.cgray .profile-user-bio = markdown(@user.bio_html) - unless profile_tabs.empty? .scrolling-tabs-container .fade-left= sprite_icon('chevron-lg-left', size: 12) .fade-right= sprite_icon('chevron-lg-right', size: 12) %ul.nav-links.user-profile-nav.scrolling-tabs.nav.nav-tabs - if profile_tab?(:overview) %li.js-overview-tab = link_to user_path, data: { target: 'div#js-overview', action: 'overview', toggle: 'tab' } do = s_('UserProfile|Overview') - if profile_tab?(:activity) %li.js-activity-tab = link_to user_activity_path, data: { target: 'div#activity', action: 'activity', toggle: 'tab' } do = s_('UserProfile|Activity') - unless Feature.enabled?(:security_auto_fix) && @user.bot? - if profile_tab?(:groups) %li.js-groups-tab = link_to user_groups_path, data: { target: 'div#groups', action: 'groups', toggle: 'tab', endpoint: user_groups_path(format: :json) } do = s_('UserProfile|Groups') - if profile_tab?(:contributed) %li.js-contributed-tab = link_to user_contributed_projects_path, data: { target: 'div#contributed', action: 'contributed', toggle: 'tab', endpoint: user_contributed_projects_path(format: :json) } do = s_('UserProfile|Contributed projects') - if profile_tab?(:projects) %li.js-projects-tab = link_to user_projects_path, data: { target: 'div#projects', action: 'projects', toggle: 'tab', endpoint: user_projects_path(format: :json) } do = s_('UserProfile|Personal projects') - if profile_tab?(:starred) %li.js-starred-tab = link_to user_starred_projects_path, data: { target: 'div#starred', action: 'starred', toggle: 'tab', endpoint: user_starred_projects_path(format: :json) } do = s_('UserProfile|Starred projects') - if profile_tab?(:snippets) %li.js-snippets-tab = link_to user_snippets_path, data: { target: 'div#snippets', action: 'snippets', toggle: 'tab', endpoint: user_snippets_path(format: :json) } do = s_('UserProfile|Snippets') - if profile_tab?(:followers) %li.js-followers-tab = link_to user_followers_path, data: { target: 'div#followers', action: 'followers', toggle: 'tab', endpoint: user_followers_path(format: :json) } do = s_('UserProfile|Followers') - if profile_tab?(:following) %li.js-following-tab = link_to user_following_path, data: { target: 'div#following', action: 'following', toggle: 'tab', endpoint: user_following_path(format: :json) } do = s_('UserProfile|Following') %div{ class: container_class } .tab-content - if profile_tab?(:overview) #js-overview.tab-pane = render "users/overview" - if profile_tab?(:activity) #activity.tab-pane .flash-container - if can?(current_user, :read_cross_project) %h4.prepend-top-20 = s_('UserProfile|Most Recent Activity') .content_list{ data: { href: user_activity_path } } .loading .gl-spinner.gl-spinner-md - unless @user.bot? - if profile_tab?(:groups) #groups.tab-pane -# This tab is always loaded via AJAX - if profile_tab?(:contributed) #contributed.tab-pane -# This tab is always loaded via AJAX - if profile_tab?(:projects) #projects.tab-pane -# This tab is always loaded via AJAX - if profile_tab?(:starred) #starred.tab-pane -# This tab is always loaded via AJAX - if profile_tab?(:snippets) #snippets.tab-pane -# This tab is always loaded via AJAX - if profile_tab?(:followers) #followers.tab-pane -# This tab is always loaded via AJAX - if profile_tab?(:following) #following.tab-pane -# This tab is always loaded via AJAX .loading.hide .gl-spinner.gl-spinner-md - if profile_tabs.empty? .svg-content = image_tag 'illustrations/profile_private_mode.svg' .text-content.text-center %h4 - if @user.blocked? = s_('UserProfile|This user is blocked') - else = s_('UserProfile|This user has a private profile')