module Alchemy
module Admin
module ContentsHelper
include Alchemy::Admin::BaseHelper
# Renders the name of elements content.
#
# Displays a warning icon if content is missing its description.
#
# Displays a mandatory field indicator, if the content has validations.
#
def render_content_name(content)
if content.blank?
warning('Content is nil')
return
else
content_name = content.name_for_label
end
if content.description.blank?
warning("Content #{content.name} is missing its description")
title = _t(:content_description_missing)
content_name = %( #{content_name}).html_safe
end
if content.has_validations?
"#{content_name}*".html_safe
else
content_name
end
end
# Renders a link to show the new content overlay that lets you add additional contents.
#
# See +render_create_content_link+ helper for examples on how to define additional contents.
#
def render_new_content_link(element)
link_to_dialog(
"#{render_icon(:create)} #{_t('add new content')}".html_safe,
alchemy.new_admin_element_content_path(element),
{
size: '310x115',
title: _t('Select an content'),
overflow: true
},
{
id: "add_content_for_element_#{element.id}",
class: 'button with_icon new_content_link'
}
)
end
# Renders a link that dynamically adds an additional content into your element editor view.
#
# NOTE: You have to define additional contents in your elements.yml file first.
#
# ==== Example:
#
# # config/alchemy/elements.yml
# - name: downloads:
# contents:
# - name: file
# type: EssenceFile
# additional_contents:
# - name: file
# type: EssenceFile
#
# Then add this helper into the elements editor view partial:
#
# <%= render_create_content_link(element, 'file') %>
#
# Optionally you can pass a label:
#
# <%= render_create_content_link(element, 'file', label: 'Add a file') %>
#
def render_create_content_link(element, content_name, options = {}, options_for_content = {})
defaults = {
label: _t('Add %{name}', name: _t(content_name, scope: :content_names))
}
options = defaults.merge(options)
link_to(render_icon(:create) + options[:label], alchemy.admin_contents_path(
content: {
name: content_name,
element_id: element.id
},
options: options_for_content.to_json
),
method: :post,
remote: true,
id: "add_content_for_element_#{element.id}",
class: 'button with_icon new_content_link'
)
end
# Renders a link for removing that content
def delete_content_link(content)
link_to_confirm_dialog(
render_icon('delete-small'),
_t('Do you really want to delete this content?'),
alchemy.admin_content_path(content),
class: 'icon_button small',
title: _t('Remove this content')
) if content.settings[:deletable]
end
# Renders the label and a remove link for a content.
def label_and_remove_link(content)
content_tag :label do
[render_hint_for(content), render_content_name(content), delete_content_link(content)].compact.join(' ').html_safe
end
end
end
end
end