module CamaleonCms
module HtmlHelper
def cama_html_helpers_init
@_pre_assets_content = [] # Assets contents before the libraries import
@_assets_libraries = {}
@_assets_content = []
end
# register a new asset library to be included on demand calling by: cama_load_libraries(...)
# sample: cama_assets_library_register("my_library", {js: ["url_js", "url_js2"], css: ["url_css1", "url_css2"]})
# cama_load_libraries("my_library")
def cama_assets_library_register(key, assets = {})
key = key.to_sym
cama_assets_libraries
@_cama_assets_libraries[key] = { css: [], js: [] } unless @_cama_assets_libraries[key].present?
@_cama_assets_libraries[key][:css] += assets[:css] if assets[:css].present?
@_cama_assets_libraries[key][:js] += assets[:js] if assets[:js].present?
end
# enable to load admin or registered libraries (colorpicker, datepicker, tinymce, form_ajax, cropper)
# sample: add_asset_library("datepicker", "colorpicker")
# This will add this assets library in the admin head or in a custom place by calling: cama_draw_custom_assets()
def cama_load_libraries(*keys)
keys.each do |key|
library = cama_assets_libraries[key.to_sym]
@_assets_libraries[key.to_sym] = library if library.present?
end
end
alias add_asset_library cama_load_libraries
# add custom asset libraries (js, css or both) for the current request, also you can add extra css or js files for existent libraries
# sample: (add new library)
# append_asset_libraries({"my_library_key"=> { js: [plugin_asset("js/my_js"), "plugins/myplugin/assets/js/my_js2"], css: [plugin_asset("css/my_css"), "plugins/myplugin/assets/css/my_css2"] }})
# sample: (update existent library)
# append_asset_libraries({"colorpicker"=>{js: [plugin_asset("js/my_custom_js")] } })
# return nil
def append_asset_libraries(libraries)
libraries.each do |key, library|
@_assets_libraries[key.to_sym] = if @_assets_libraries.include?(key)
@_assets_libraries[key.to_sym].merge(library)
else
library
end
end
end
alias cama_load_custom_assets append_asset_libraries
# add asset content into custom assets
# content may be:
# content may be:
# this will be printed with <%raw cama_draw_custom_assets %>
def append_asset_content(content)
@_assets_content << content
end
# add pre asset content into custom assets
# content may be:
# content may be:
# this will be printed before assets_library with <%raw cama_draw_pre_asset_contents %>
def append_pre_asset_content(content)
@_pre_assets_content << content
end
# return all scripts to be executed before import the js libraries(cama_draw_custom_assets)
def cama_draw_pre_asset_contents
(@_pre_assets_content || []).join('').html_safe
end
# return all js libraries added [aa.js, bb,js, ..]
# def get_assets_js
def cama_draw_custom_assets
cama_html_helpers_init unless @_assets_libraries.present?
libs = []
@_assets_libraries.each do |_key, assets|
libs += assets[:css] if assets[:css].present?
end
stylesheets = libs.uniq
css = stylesheet_link_tag(*stylesheets, media: 'all')
libs = []
@_assets_libraries.each do |_key, assets|
libs += assets[:js] if assets[:js].present?
end
javascripts = libs.uniq
js = javascript_include_tag(*javascripts)
args = { stylesheets: stylesheets, javascripts: javascripts, js_html: js, css_html: css }
hooks_run('draw_custom_assets', args)
"#{args[:css_html]}\n#{args[:js_html]}\n#{@_assets_content.join('').html_safe}"
end
# return category tree for category dropdown
# each level is prefixed with -
# level: internal recursive control
def cama_get_options_html_from_items(terms, level = 0)
options = []
terms.all.each do |term|
options << [('—' * level) + term.name, term.id] unless @term.id == term.id
children = term.children
options += cama_get_options_html_from_items(children, level + 1) if children.size.positive?
end
options
end
# create a html tooltip to include anywhere
# text: text of the tooltip
# location: location of the tooltip (left | right | top |bottom)
def cama_html_tooltip(text = 'Tooltip', location = 'left')
""
end
private
def cama_assets_libraries
return @_cama_assets_libraries if @_cama_assets_libraries.present?
libs = {}
libs[:colorpicker] =
{ js: ['camaleon_cms/admin/bootstrap-colorpicker'], css: ['camaleon_cms/admin/colorpicker.css'] }
libs[:datepicker] = { js: [] }
libs[:datetimepicker] = { js: [], css: [] }
libs[:tinymce] =
{ js: ['camaleon_cms/admin/tinymce/tinymce.min', 'camaleon_cms/admin/tinymce/plugins/filemanager/plugin.min'],
css: ['camaleon_cms/admin/tinymce/skins/lightgray/content.min'] }
libs[:form_ajax] = { js: ['camaleon_cms/admin/form/jquery.form'] }
libs[:cropper] = {} # loaded by default
libs[:post] =
{ js: ['camaleon_cms/admin/jquery.tagsinput.min', 'camaleon_cms/admin/post'],
css: ['camaleon_cms/admin/jquery.tagsinput'] }
libs[:multiselect] = { js: ['camaleon_cms/admin/bootstrap-select.js'] }
libs[:validate] = { js: ['camaleon_cms/admin/jquery.validate'] }
libs[:nav_menu] =
{ css: ['camaleon_cms/admin/nestable/jquery.nestable'],
js: ['camaleon_cms/admin/jquery.nestable', 'camaleon_cms/admin/nav_menu'] }
libs[:admin_intro] =
{ js: ['camaleon_cms/admin/introjs/intro.min'], css: ['camaleon_cms/admin/introjs/introjs.min'] }
@_cama_assets_libraries = libs
end
# execute translation for value if this value is like: t(admin.my_text) ==> My Text
def cama_print_i18n_value(value)
value.start_with?('t(') ? eval(value.sub('t(', 'I18n.t(')) : value
end
end
end