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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
module ActionView
module Helpers
module AjaxHelper
include UrlHelper
def link_to_remote(name, url, options = {})
html = options.delete(:html) || {}
update = options.delete(:update)
if update.is_a?(Hash)
html["data-update-success"] = update[:success]
html["data-update-failure"] = update[:failure]
else
html["data-update-success"] = update
end
html["data-update-position"] = options.delete(:position)
html["data-method"] = options.delete(:method)
html["data-remote"] = "true"
html.merge!(options)
url = url_for(url) if url.is_a?(Hash)
link_to(name, url, html)
end
def button_to_remote(name, options = {}, html_options = {})
url = options.delete(:url)
url = url_for(url) if url.is_a?(Hash)
html_options.merge!(:type => "button", :value => name,
:"data-url" => url)
tag(:input, html_options)
end
def observe_field(name, options = {})
if options[:url]
options[:url] = options[:url].is_a?(Hash) ? url_for(options[:url]) : options[:url]
end
if options[:frequency]
case options[:frequency]
when 0
options.delete(:frequency)
else
options[:frequency] = options[:frequency].to_i
end
end
if options[:with]
if options[:with] !~ /[\{=(.]/
options[:with] = "'#{options[:with]}=' + encodeURIComponent(value)"
else
options[:with] ||= 'value' unless options[:function]
end
end
if options[:function]
statements = options[:function] # || remote_function(options) # TODO: Need to implement remote function - BR
options[:function] = JSFunction.new(statements, "element", "value")
end
options[:name] = name
<<-SCRIPT
<script type="application/json" data-rails-type="observe_field">
//<![CDATA[
#{options.to_json}
// ]]>
</script>
SCRIPT
end
# TODO: Move to javascript helpers - BR
class JSFunction
def initialize(statements, *arguments)
@statements, @arguments = statements, arguments
end
def as_json(options = nil)
"function(#{@arguments.join(", ")}) {#{@statements}}"
end
end
module Rails2Compatibility
def set_callbacks(options, html)
[:complete, :failure, :success, :interactive, :loaded, :loading].each do |type|
html["data-#{type}-code"] = options.delete(type.to_sym)
end
options.each do |option, value|
if option.is_a?(Integer)
html["data-#{option}-code"] = options.delete(option)
end
end
end
def link_to_remote(name, url, options = nil)
if !options && url.is_a?(Hash) && url.key?(:url)
url, options = url.delete(:url), url
end
set_callbacks(options, options[:html] ||= {})
super
end
def button_to_remote(name, options = {}, html_options = {})
set_callbacks(options, html_options)
super
end
end
end
end
end
|