module MacrosHelper
def macros_in_menu
Environment.macros[@environment.id].reject{ |macro_name, plugin_instance| macro_configuration(macro_name)[:icon_path] }
end
def macros_with_buttons
Environment.macros[@environment.id].reject{ |macro_name, plugin_instance| !macro_configuration(macro_name)[:icon_path] }
end
def macro_configuration(macro_name)
plugin_instance = Environment.macros[@environment.id][macro_name]
plugin_instance.send("config_#{macro_name}")
end
def macro_title(macro_name)
macro_configuration(macro_name)[:title] || macro_name.to_s.humanize
end
def generate_macro_config_dialog(macro_name)
if macro_configuration(macro_name)[:skip_dialog]
"function(){#{macro_generator(macro_name)}}"
else
"function(){
jQuery('
'+#{macro_configuration_dialog(macro_name).to_json}+'
').dialog({
title: #{macro_title(macro_name).to_json},
modal: true,
buttons: [
{text: #{_('Ok').to_json}, click: function(){
tinyMCE.activeEditor.execCommand('mceInsertContent', false,
(function(dialog){ #{macro_generator(macro_name)} })(this));
jQuery(this).dialog('close');
}},
{text: #{_('Cancel').to_json}, click: function(){jQuery(this).dialog('close');}}
]
});
}"
end
end
def include_macro_js_files
plugins_javascripts = []
Environment.macros[environment.id].map do |macro_name, plugin_instance|
if macro_configuration(macro_name)[:js_files]
macro_configuration(macro_name)[:js_files].map { |js| plugins_javascripts << plugin_instance.class.public_path(js) }
end
end
javascript_include_tag(plugins_javascripts, :cache => 'cache/plugins-' + Digest::MD5.hexdigest(plugins_javascripts.to_s)) unless plugins_javascripts.empty?
end
def macro_css_files
plugins_css = []
Environment.macros[environment.id].map do |macro_name, plugin_instance|
if macro_configuration(macro_name)[:css_files]
macro_configuration(macro_name)[:css_files].map { |css| plugins_css << plugin_instance.class.public_path(css) }
end
end
plugins_css.join(',')
end
protected
def macro_generator(macro_name)
if macro_configuration(macro_name)[:generator]
macro_configuration(macro_name)[:generator]
else
macro_default_generator(macro_name)
end
end
def macro_default_generator(macro_name)
code = "var params = {};"
configuration = macro_configuration(macro_name)
configuration[:params].map do |field|
code += "params.#{field[:name]} = jQuery('*[name=#{field[:name]}]', dialog).val();"
end
code + "
var html = jQuery(''+#{macro_title(macro_name).to_json}+'
')[0];
for(key in params) html.setAttribute('data-macro-'+key,params[key]);
return html.outerHTML;
"
end
def macro_configuration_dialog(macro_name)
macro_configuration(macro_name)[:params].map do |field|
label_name = field[:label] || field[:name].to_s.humanize
case field[:type]
when 'text'
labelled_form_field(label_name, text_field_tag(field[:name], field[:default]))
when 'select'
labelled_form_field(label_name, select_tag(field[:name], options_for_select(field[:values], field[:default])))
end
end.join("\n")
end
end