macros_helper.rb
2.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
module MacrosHelper
def macros_in_menu
@plugins.dispatch(:macros).reject{ |macro| macro.configuration[:icon_path] }
end
def macros_with_buttons
@plugins.dispatch(:macros).reject{ |macro| !macro.configuration[:icon_path] }
end
def macro_title(macro)
macro.configuration[:title] || macro.name.humanize
end
def generate_macro_config_dialog(macro)
if macro.configuration[:skip_dialog]
"function(){#{macro_generator(macro)}}"
else
"function(){
jQuery('<div>'+#{macro_configuration_dialog(macro).to_json}+'</div>').dialog({
title: #{macro_title(macro).to_json},
modal: true,
buttons: {
#{_('Ok').to_json}: function(){
tinyMCE.activeEditor.execCommand('mceInsertContent', false,
(function(dialog){ #{macro_generator(macro)} })(this));
jQuery(this).dialog('close');
},
#{_('Cancel').to_json}: function(){
jQuery(this).dialog('close');
}
}
});
}"
end.html_safe
end
def include_macro_js_files
plugins_javascripts = []
@plugins.dispatch(:macros).map do |macro|
if macro.configuration[:js_files]
[macro.configuration[:js_files]].flatten.map { |js| plugins_javascripts << macro.plugin.public_path(js) }
end
end
unless plugins_javascripts.empty?
javascript_include_tag *plugins_javascripts
end
end
def macro_css_files
plugins_css = []
@plugins.dispatch(:macros).map do |macro|
if macro.configuration[:css_files]
[macro.configuration[:css_files]].flatten.map { |css| plugins_css << macro.plugin.public_path(css) }
end
end
plugins_css.join(',')
end
protected
def macro_generator(macro)
if macro.configuration[:generator]
if macro.configuration[:generator].respond_to?(:call)
macro.configuration[:generator].call(macro)
else
macro.configuration[:generator]
end
else
macro_default_generator(macro)
end
end
def macro_default_generator(macro)
code = "var params = {};"
macro.configuration[:params].map do |field|
code += "params.#{field[:name]} = jQuery('*[name=#{field[:name]}]', dialog).val();"
end
code + "
var html = jQuery('<div class=\"macro mceNonEditable\" data-macro=\"#{macro.identifier}\">'+#{macro_title(macro).to_json}+'</div>')[0];
for(key in params) html.setAttribute('data-macro-'+key,params[key]);
return html.outerHTML;
"
end
def macro_configuration_dialog(macro)
macro.configuration[: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