# frozen_string_literal: true
module Decidim
# View helpers related to the layout.
module LayoutHelper
# Public: Generates a set of meta tags that generate the different favicon
# versions for an organization.
#
# Returns a safe String with the versions.
def favicon
return unless current_organization.favicon.present?
safe_join(Decidim::OrganizationFaviconUploader::SIZES.map do |version, size|
favicon_link_tag(current_organization.favicon.send(version).url, sizes: "#{size}x#{size}")
end)
end
# Outputs an SVG-based icon.
#
# name - The String with the icon name.
# options - The Hash options used to customize the icon (default {}):
# :width - The Number of width in pixels (optional).
# :height - The Number of height in pixels (optional).
# :aria_label - The String to set as aria label (optional).
# :aria_hidden - The Truthy value to enable aria_hidden (optional).
# :role - The String to set as the role (optional).
# :class - The String to add as a CSS class (optional).
#
# Returns a String.
def icon(name, options = {})
# Ugly hack to work around the issue of phantomjs not sending js events
# when clicking on a SVG element.
if Rails.env.test?
return content_tag(:span, "?", class: "icon icon--#{name}")
end
html_properties = {}
html_properties["width"] = options[:width]
html_properties["height"] = options[:height]
html_properties["aria-label"] = options[:aria_label]
html_properties["role"] = options[:role]
html_properties["aria-hidden"] = options[:aria_hidden]
html_properties["class"] = (["icon--#{name}"] + _icon_classes(options)).join(" ")
content_tag :svg, html_properties do
content_tag :use, nil, "xlink:href" => "#{asset_url("decidim/icons.svg")}#icon-#{name}"
end
end
# Outputs a SVG icon from an external file. It apparently renders an image
# tag, but then a JS script kicks in and replaces it with an inlined SVG
# version.
#
# path - The asset's path
#
# Returns an tag with the SVG icon.
def external_icon(path, options = {})
# Ugly hack to prevent PhantomJS from freaking out with SVGs.
classes = _icon_classes(options) + ["external-icon"]
return content_tag(:span, "?", class: classes.join(" "), "data-src" => path) if Rails.env.test?
if path.split(".").last == "svg"
asset = Rails.application.assets_manifest.find_sources(path).first
asset.gsub("