debian-mirror-gitlab/app/helpers/page_layout_helper.rb

198 lines
5.1 KiB
Ruby
Raw Normal View History

2018-12-05 23:21:45 +05:30
# frozen_string_literal: true
2015-09-11 14:41:01 +05:30
module PageLayoutHelper
2021-01-29 00:20:46 +05:30
include Gitlab::Utils::StrongMemoize
2015-09-11 14:41:01 +05:30
def page_title(*titles)
@page_title ||= []
@page_title.push(*titles.compact) if titles.any?
2018-03-17 18:26:18 +05:30
if titles.any? && !defined?(@breadcrumb_title)
2017-09-10 17:25:29 +05:30
@breadcrumb_title = @page_title.last
end
2018-12-13 13:39:08 +05:30
# Segments are separated by middot
2018-03-17 18:26:18 +05:30
@page_title.join(" · ")
2015-09-11 14:41:01 +05:30
end
# Define or get a description for the current page
#
# description - String (default: nil)
#
# If this helper is called multiple times with an argument, only the last
# description will be returned when called without an argument. Descriptions
# have newlines replaced with spaces and all HTML tags are sanitized.
#
# Examples:
#
# page_description # => "GitLab Community Edition"
# page_description("Foo")
# page_description # => "Foo"
#
# page_description("<b>Bar</b>\nBaz")
# page_description # => "Bar Baz"
#
# Returns an HTML-safe String.
def page_description(description = nil)
if description.present?
@page_description = description.squish
elsif @page_description.present?
2019-09-04 21:01:54 +05:30
sanitize(@page_description.truncate_words(30), tags: [])
end
end
2021-01-03 14:25:43 +05:30
def page_canonical_link(link = nil)
if link
@page_canonical_link = link
else
2021-01-29 00:20:46 +05:30
@page_canonical_link ||= generic_canonical_url
2021-01-03 14:25:43 +05:30
end
end
2017-08-17 22:00:37 +05:30
def favicon
2018-11-08 19:23:39 +05:30
Gitlab::Favicon.main
2017-08-17 22:00:37 +05:30
end
def page_image
default = image_url('gitlab_logo.png')
subject = @project || @user || @group
2021-01-29 00:20:46 +05:30
image = subject.avatar_url(only_path: false) if subject.present?
image || default
end
# Define or get attributes to be used as Twitter card metadata
#
# map - Hash of label => data pairs. Keys become labels, values become data
#
# Raises ArgumentError if given more than two attributes
def page_card_attributes(map = {})
raise ArgumentError, 'cannot provide more than two attributes' if map.length > 2
@page_card_attributes ||= {}
2016-08-24 12:49:21 +05:30
@page_card_attributes = map.reject { |_, v| v.blank? } if map.present?
@page_card_attributes
end
def page_card_meta_tags
2018-12-05 23:21:45 +05:30
tags = []
page_card_attributes.each_with_index do |pair, i|
tags << tag(:meta, property: "twitter:label#{i + 1}", content: pair[0])
tags << tag(:meta, property: "twitter:data#{i + 1}", content: pair[1])
end
2018-12-05 23:21:45 +05:30
tags.join.html_safe
end
2015-09-11 14:41:01 +05:30
def header_title(title = nil, title_url = nil)
if title
@header_title = title
@header_title_url = title_url
else
2018-03-17 18:26:18 +05:30
return @header_title unless @header_title_url
breadcrumb_list_item(link_to(@header_title, @header_title_url))
2015-09-11 14:41:01 +05:30
end
end
def sidebar(name = nil)
if name
@sidebar = name
else
@sidebar
end
end
2015-09-25 12:07:36 +05:30
2016-06-02 11:05:42 +05:30
def nav(name = nil)
if name
@nav = name
else
@nav
end
end
2020-06-23 00:09:42 +05:30
# This helper ensures there is always a default `Gitlab::SearchContext` available
# to all controller that use the application layout.
def search_context
strong_memoize(:search_context) do
next super if defined?(super)
Gitlab::SearchContext::Builder.new(controller.view_context).build!
end
end
2016-11-03 12:29:30 +05:30
def fluid_layout
current_user && current_user.layout == "fluid"
2015-09-25 12:07:36 +05:30
end
def blank_container(enabled = false)
if @blank_container.nil?
@blank_container = enabled
else
@blank_container
end
end
def container_class
2018-12-05 23:21:45 +05:30
css_class = ["container-fluid"]
2015-09-25 12:07:36 +05:30
unless fluid_layout
2018-12-05 23:21:45 +05:30
css_class << "container-limited"
2015-09-25 12:07:36 +05:30
end
if blank_container
2018-12-05 23:21:45 +05:30
css_class << "container-blank"
2015-09-25 12:07:36 +05:30
end
2018-12-05 23:21:45 +05:30
css_class.join(' ')
2015-09-25 12:07:36 +05:30
end
2021-01-29 00:20:46 +05:30
def page_itemtype(itemtype = nil)
if itemtype
@page_itemtype = { itemscope: true, itemtype: itemtype }
else
@page_itemtype || {}
end
end
def user_status_properties(user)
2021-03-08 18:12:59 +05:30
default_properties = { current_emoji: '', current_message: '', can_set_user_availability: Feature.enabled?(:set_user_availability_status, user, default_enabled: :yaml), default_emoji: UserStatus::DEFAULT_EMOJI }
2021-01-29 00:20:46 +05:30
return default_properties unless user&.status
default_properties.merge({
current_emoji: user.status.emoji.to_s,
current_message: user.status.message.to_s,
current_availability: user.status.availability.to_s
})
end
private
def generic_canonical_url
strong_memoize(:generic_canonical_url) do
next unless request.get? || request.head?
next unless generate_generic_canonical_url?
# Request#url builds the url without the trailing slash
request.url
end
end
def generate_generic_canonical_url?
# For the main domain it doesn't matter whether there is
# a trailing slash or not, they're not considered different
# pages
return false if request.path == '/'
# We only need to generate the canonical url when the request has a trailing
# slash. In the request object, only the `original_fullpath` and
# `original_url` keep the slash if it's present. Both `path` and
# `fullpath` would return the path without the slash.
# Therefore, we need to process `original_fullpath`
request.original_fullpath.sub(request.path, '')[0] == '/'
end
2015-09-11 14:41:01 +05:30
end