opal-jquery 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/.travis.yml +8 -0
- data/Gemfile +11 -0
- data/LICENSE +19 -0
- data/README.md +297 -0
- data/Rakefile +57 -0
- data/docs/post.html +3 -0
- data/docs/pre.html +18 -0
- data/lib/opal-jquery.rb +4 -0
- data/lib/opal-jquery/document.rb +47 -0
- data/lib/opal-jquery/element.rb +380 -0
- data/lib/opal-jquery/event.rb +39 -0
- data/lib/opal-jquery/http.rb +113 -0
- data/lib/opal-jquery/kernel.rb +6 -0
- data/lib/opal-jquery/local_storage.rb +25 -0
- data/opal-jquery.gemspec +16 -0
- data/spec/data/simple.txt +1 -0
- data/spec/data/user.json +4 -0
- data/spec/document_spec.rb +91 -0
- data/spec/element/after_spec.rb +33 -0
- data/spec/element/animations_spec.rb +50 -0
- data/spec/element/append_spec.rb +36 -0
- data/spec/element/append_to_spec.rb +25 -0
- data/spec/element/at_spec.rb +41 -0
- data/spec/element/attributes_spec.rb +202 -0
- data/spec/element/before_spec.rb +33 -0
- data/spec/element/class_name_spec.rb +82 -0
- data/spec/element/css_spec.rb +52 -0
- data/spec/element/display_spec.rb +45 -0
- data/spec/element/inspect_spec.rb +26 -0
- data/spec/element/length_spec.rb +5 -0
- data/spec/element/traversing_spec.rb +150 -0
- data/spec/element_spec.rb +107 -0
- data/spec/event_spec.rb +66 -0
- data/spec/http_spec.rb +49 -0
- data/spec/index.html +13 -0
- data/spec/local_storage_spec.rb +51 -0
- data/spec/spec_helper.rb +1 -0
- data/vendor/jquery.js +4 -0
- metadata +105 -0
@@ -0,0 +1,380 @@
|
|
1
|
+
# Instances of Element are just jquery instances, and wrap 1 or more
|
2
|
+
# native dom elements.
|
3
|
+
class Element < `jQuery`
|
4
|
+
def self.find(selector)
|
5
|
+
`$(selector)`
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.id(id)
|
9
|
+
Document.id(id)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.new(tag = 'div')
|
13
|
+
`$(document.createElement(tag))`
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.parse(str)
|
17
|
+
`$(str)`
|
18
|
+
end
|
19
|
+
|
20
|
+
def [](name)
|
21
|
+
`#{self}.attr(name) || ""`
|
22
|
+
end
|
23
|
+
|
24
|
+
alias_native :[]=, :attr
|
25
|
+
|
26
|
+
# Add the given content to inside each element in the receiver. The
|
27
|
+
# content may be a HTML string or a `DOM` instance. The inserted
|
28
|
+
# content is added to the end of the receiver.
|
29
|
+
#
|
30
|
+
# @example Given HTML String
|
31
|
+
#
|
32
|
+
# DOM.find('ul').append '<li>list content</li>'
|
33
|
+
#
|
34
|
+
# @example Given an existing DOM node
|
35
|
+
#
|
36
|
+
# DOM.id('checkout') << Dom.id('total-price-label')
|
37
|
+
#
|
38
|
+
# @param [String, DOM] content HTML string or DOM content
|
39
|
+
# @return [DOM] returns receiver
|
40
|
+
alias_native :<<, :append
|
41
|
+
|
42
|
+
alias_native :add_class, :addClass
|
43
|
+
|
44
|
+
# Add the given content after each element in the receiver. The given
|
45
|
+
# content may be a HTML string, or a `DOM` instance.
|
46
|
+
#
|
47
|
+
# @example Given HTML String
|
48
|
+
#
|
49
|
+
# DOM.find('.label').after '<p>Content after label</>'
|
50
|
+
#
|
51
|
+
# @example Given existing DOM nodes
|
52
|
+
#
|
53
|
+
# DOM.find('.price').after DOM.id('checkout-link')
|
54
|
+
#
|
55
|
+
# @param [String, DOM] content HTML string or dom content
|
56
|
+
# @return [DOM] returns self
|
57
|
+
alias_native :after, :after
|
58
|
+
|
59
|
+
alias append <<
|
60
|
+
|
61
|
+
# Appends the elements in #{self} object into the target element. #{self}
|
62
|
+
# method is the reverse of using `#append` on the target with #{self}
|
63
|
+
# instance as the argument.
|
64
|
+
#
|
65
|
+
# @example
|
66
|
+
#
|
67
|
+
# DOM.parse('<p>Hello</p>').append_to DOM.id('foo')
|
68
|
+
#
|
69
|
+
# @param [DOM] target the target to insert into
|
70
|
+
# @return [DOM] returns the receiver
|
71
|
+
alias_native :append_to, :appendTo
|
72
|
+
|
73
|
+
def append_to_body
|
74
|
+
`#{self}.appendTo(document.body)`
|
75
|
+
end
|
76
|
+
|
77
|
+
def append_to_head
|
78
|
+
`#{self}.appendTo(document.head)`
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns the element at the given index as a new `DOM` instance.
|
82
|
+
# Negative indexes can be used and are counted from the end. If the
|
83
|
+
# given index is outside the range then `nil` is returned.
|
84
|
+
#
|
85
|
+
# @example
|
86
|
+
#
|
87
|
+
# DOM('.foo')[0] # => first element in collection
|
88
|
+
# DOM('.foo')[-1] # => last element from collection
|
89
|
+
# DOM('.foo')[100] # => returns nil if index outside range
|
90
|
+
#
|
91
|
+
# @param [Numeric] index the index to get
|
92
|
+
# @return [DOM, nil] returns new collection with returned element
|
93
|
+
def at(index)
|
94
|
+
%x{
|
95
|
+
var length = #{self}.length;
|
96
|
+
|
97
|
+
if (index < 0) {
|
98
|
+
index += length;
|
99
|
+
}
|
100
|
+
|
101
|
+
if (index < 0 || index >= length) {
|
102
|
+
return nil;
|
103
|
+
}
|
104
|
+
|
105
|
+
return $(#{self}[index]);
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
# Insert the given content into the DOM before each element in #{self}
|
110
|
+
# collection. The content may be a raw HTML string or a `DOM`
|
111
|
+
# instance containing elements.
|
112
|
+
#
|
113
|
+
# @example
|
114
|
+
#
|
115
|
+
# # Given a string
|
116
|
+
# DOM('.foo').before '<p class="title"></p>'
|
117
|
+
#
|
118
|
+
# # Using an existing element
|
119
|
+
# DOM('.bar').before DOM('#other-title')
|
120
|
+
#
|
121
|
+
# @param [DOM, String] content the content to insert before
|
122
|
+
# @return [DOM] returns the receiver
|
123
|
+
alias_native :before, :before
|
124
|
+
|
125
|
+
# Returns a new collection containing the immediate children of each
|
126
|
+
# element in #{self} collection. The result may be empty if no children
|
127
|
+
# are present.
|
128
|
+
#
|
129
|
+
# @example
|
130
|
+
#
|
131
|
+
# DOM('#foo').children # => DOM instance
|
132
|
+
#
|
133
|
+
# @return [DOM] returns new DOM collection
|
134
|
+
alias_native :children, :children
|
135
|
+
|
136
|
+
# Returns the CSS class name of the firt element in #{self} collection.
|
137
|
+
# If the collection is empty then an empty string is returned. Only
|
138
|
+
# the class name of the first element will ever be returned.
|
139
|
+
#
|
140
|
+
# @example
|
141
|
+
#
|
142
|
+
# DOM('<p class="foo"></p>').class_name
|
143
|
+
# # => "foo"
|
144
|
+
#
|
145
|
+
# @return [String] the class name
|
146
|
+
def class_name
|
147
|
+
%x{
|
148
|
+
var first = #{self}[0];
|
149
|
+
|
150
|
+
if (!first) {
|
151
|
+
return "";
|
152
|
+
}
|
153
|
+
|
154
|
+
return first.className || "";
|
155
|
+
}
|
156
|
+
end
|
157
|
+
|
158
|
+
# Sets the CSS class name of every element in #{self} collection to the
|
159
|
+
# given string. #{self} does not append the class names, it replaces
|
160
|
+
# the entire current class name.
|
161
|
+
#
|
162
|
+
# @example
|
163
|
+
#
|
164
|
+
# DOM('#foo').class_name = "title"
|
165
|
+
#
|
166
|
+
# @param [String] name the class name to set on each element
|
167
|
+
# @return [DOM] returns the receiver
|
168
|
+
def class_name=(name)
|
169
|
+
%x{
|
170
|
+
for (var i = 0, length = #{self}.length; i < length; i++) {
|
171
|
+
#{self}[i].className = name;
|
172
|
+
}
|
173
|
+
}
|
174
|
+
self
|
175
|
+
end
|
176
|
+
|
177
|
+
# Get or set css properties on each element in #{self} collection. If
|
178
|
+
# only the `name` is given, then that css property name is read from
|
179
|
+
# the first element in the collection and returned. If the `value`
|
180
|
+
# property is also given then the given css property is set to the
|
181
|
+
# given value for each of the elements in #{self} collection. The
|
182
|
+
# property can also be a hash of properties and values.
|
183
|
+
#
|
184
|
+
# @example
|
185
|
+
#
|
186
|
+
# foo = DOM '#foo'
|
187
|
+
# foo.css 'background-color' # => "red"
|
188
|
+
# foo.css 'background-color', 'green'
|
189
|
+
# foo.css 'background-color' # => "green"
|
190
|
+
# foo.css :width => '200px'
|
191
|
+
#
|
192
|
+
# @param [String] name the css property to get/set
|
193
|
+
# @param [String] value optional value to set
|
194
|
+
# @param [Hash] set of css properties and values
|
195
|
+
# @return [String, DOM] returns css value or the receiver
|
196
|
+
def css(name, value=nil)
|
197
|
+
if value.nil? && name.is_a?(String)
|
198
|
+
return `$(#{self}).css(name)`
|
199
|
+
else
|
200
|
+
name.is_a?(Hash) ? `$(#{self}).css(#{name.to_native})` : `$(#{self}).css(name, value)`
|
201
|
+
end
|
202
|
+
self
|
203
|
+
end
|
204
|
+
|
205
|
+
# Set css values over time to create animations. The first parameter is a
|
206
|
+
# set of css properties and values to animate to. The first parameter
|
207
|
+
# also accepts a special :speed value to set animation speed. If a block
|
208
|
+
# is given, the block is run as a callback when the animation finishes.
|
209
|
+
#
|
210
|
+
# @example
|
211
|
+
#
|
212
|
+
# foo = DOM "#foo"
|
213
|
+
# foo.animate :height => "200px", "margin-left" => "10px"
|
214
|
+
# bar.animate :top => "30px", :speed => 100 do
|
215
|
+
# bar.add_class "finished"
|
216
|
+
# end
|
217
|
+
#
|
218
|
+
# @param [Hash] css properties and and values. Also accepts speed param.
|
219
|
+
# @return [DOM] receiver
|
220
|
+
def animate(params, &block)
|
221
|
+
speed = params.has_key?(:speed) ? params.delete(:speed) : 400
|
222
|
+
%x{
|
223
|
+
$(#{self}).animate(#{params.to_native}, #{speed}, function() {
|
224
|
+
#{block.call if block_given?}
|
225
|
+
})
|
226
|
+
}
|
227
|
+
end
|
228
|
+
|
229
|
+
# Yields each element in #{self} collection in turn. The yielded element
|
230
|
+
# is wrapped as a `DOM` instance.
|
231
|
+
#
|
232
|
+
# @example
|
233
|
+
#
|
234
|
+
# DOM('.foo').each { |e| puts "The element id: #{e.id}" }
|
235
|
+
#
|
236
|
+
# @return returns the receiver
|
237
|
+
def each
|
238
|
+
`for (var i = 0, length = #{self}.length; i < length; i++) {`
|
239
|
+
yield `$(#{self}[i])`
|
240
|
+
`}`
|
241
|
+
self
|
242
|
+
end
|
243
|
+
|
244
|
+
# Find all the elements that match the given `selector` within the
|
245
|
+
# scope of elements in #{self} given collection. Might return an empty
|
246
|
+
# collection if no elements match.
|
247
|
+
#
|
248
|
+
# @example
|
249
|
+
#
|
250
|
+
# form = DOM('#login-form')
|
251
|
+
# form.find 'input, select'
|
252
|
+
#
|
253
|
+
# @param [String] selector the selector to match elements against
|
254
|
+
# @return [DOM] returns new collection
|
255
|
+
alias_native :find, :find
|
256
|
+
|
257
|
+
def first
|
258
|
+
`#{self}.length ? #{self}.first() : nil`
|
259
|
+
end
|
260
|
+
|
261
|
+
alias_native :focus, :focus
|
262
|
+
|
263
|
+
alias_native :has_class?, :hasClass
|
264
|
+
|
265
|
+
def html
|
266
|
+
`#{self}.html() || ""`
|
267
|
+
end
|
268
|
+
|
269
|
+
alias_native :html=, :html
|
270
|
+
|
271
|
+
def id
|
272
|
+
%x{
|
273
|
+
var first = #{self}[0];
|
274
|
+
|
275
|
+
if (!first) {
|
276
|
+
return "";
|
277
|
+
}
|
278
|
+
|
279
|
+
return first.id || "";
|
280
|
+
}
|
281
|
+
end
|
282
|
+
|
283
|
+
def id=(id)
|
284
|
+
%x{
|
285
|
+
var first = #{self}[0];
|
286
|
+
|
287
|
+
if (first) {
|
288
|
+
first.id = id;
|
289
|
+
}
|
290
|
+
|
291
|
+
return #{self};
|
292
|
+
}
|
293
|
+
end
|
294
|
+
|
295
|
+
def inspect
|
296
|
+
%x{
|
297
|
+
var val, el, str, result = [];
|
298
|
+
|
299
|
+
for (var i = 0, length = #{self}.length; i < length; i++) {
|
300
|
+
el = #{self}[i];
|
301
|
+
str = "<" + el.tagName.toLowerCase();
|
302
|
+
|
303
|
+
if (val = el.id) str += (' id="' + val + '"');
|
304
|
+
if (val = el.className) str += (' class="' + val + '"');
|
305
|
+
|
306
|
+
result.push(str + '>');
|
307
|
+
}
|
308
|
+
|
309
|
+
return '[' + result.join(', ') + ']';
|
310
|
+
}
|
311
|
+
end
|
312
|
+
|
313
|
+
def length
|
314
|
+
`#{self}.length`
|
315
|
+
end
|
316
|
+
|
317
|
+
alias_native :next, :next
|
318
|
+
|
319
|
+
def off(event_name, selector, handler=nil)
|
320
|
+
%x{
|
321
|
+
if (handler === nil) {
|
322
|
+
handler = selector;
|
323
|
+
#{self}.off(event_name, handler._jq);
|
324
|
+
}
|
325
|
+
else {
|
326
|
+
#{self}.off(event_name, selector, handler._jq);
|
327
|
+
}
|
328
|
+
}
|
329
|
+
|
330
|
+
handler
|
331
|
+
end
|
332
|
+
|
333
|
+
def on(event_name, selector=nil, &block)
|
334
|
+
return unless block_given?
|
335
|
+
|
336
|
+
%x{
|
337
|
+
var handler = function(e) { return #{ block.call `e` } };
|
338
|
+
block._jq = handler;
|
339
|
+
|
340
|
+
if (selector === nil) {
|
341
|
+
#{self}.on(event_name, handler);
|
342
|
+
}
|
343
|
+
else {
|
344
|
+
#{self}.on(event_name, selector, handler);
|
345
|
+
}
|
346
|
+
}
|
347
|
+
|
348
|
+
block
|
349
|
+
end
|
350
|
+
|
351
|
+
alias_native :parent, :parent
|
352
|
+
|
353
|
+
alias_native :prev, :prev
|
354
|
+
|
355
|
+
alias_native :remove, :remove
|
356
|
+
|
357
|
+
alias_native :remove_class, :removeClass
|
358
|
+
|
359
|
+
alias size length
|
360
|
+
|
361
|
+
alias succ next
|
362
|
+
|
363
|
+
alias_native :text=, :text
|
364
|
+
|
365
|
+
alias_native :toggle_class, :toggleClass
|
366
|
+
|
367
|
+
alias_native :trigger, :trigger
|
368
|
+
|
369
|
+
def value
|
370
|
+
`#{self}.val() || ""`
|
371
|
+
end
|
372
|
+
|
373
|
+
alias_native :value=, :val
|
374
|
+
|
375
|
+
# display functions
|
376
|
+
alias_native :hide, :hide
|
377
|
+
alias_native :show, :show
|
378
|
+
alias_native :toggle, :toggle
|
379
|
+
|
380
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class Event < `$.Event`
|
2
|
+
def current_target
|
3
|
+
`$(#{self}.currentTarget)`
|
4
|
+
end
|
5
|
+
|
6
|
+
alias_native :default_prevented?, :isDefaultPrevented
|
7
|
+
|
8
|
+
alias_native :prevent_default, :preventDefault
|
9
|
+
|
10
|
+
def page_x
|
11
|
+
`#{self}.pageX`
|
12
|
+
end
|
13
|
+
|
14
|
+
def page_y
|
15
|
+
`#{self}.pageY`
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_native :propagation_stopped?, :propagationStopped
|
19
|
+
|
20
|
+
alias_native :stop_propagation, :stopPropagation
|
21
|
+
|
22
|
+
def target
|
23
|
+
%x{
|
24
|
+
if (#{self}._opalTarget) {
|
25
|
+
return #{self}._opalTarget;
|
26
|
+
}
|
27
|
+
|
28
|
+
return #{self}._opalTarget = $(#{self}.target);
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def type
|
33
|
+
`#{self}.type`
|
34
|
+
end
|
35
|
+
|
36
|
+
def which
|
37
|
+
`#{self}.which`
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# Wraps jQuery's ajax request into a ruby class.
|
2
|
+
#
|
3
|
+
# HTTP.get("/users/1.json") do |response|
|
4
|
+
# puts "Got response!"
|
5
|
+
# end
|
6
|
+
#
|
7
|
+
class HTTP
|
8
|
+
attr_reader :body
|
9
|
+
attr_reader :error_message
|
10
|
+
attr_reader :method
|
11
|
+
attr_reader :status_code
|
12
|
+
attr_reader :url
|
13
|
+
|
14
|
+
def self.get(url, opts={}, &block)
|
15
|
+
self.new(url, :GET, opts, block).send!
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.post(url, opts={}, &block)
|
19
|
+
self.new(url, :POST, opts, block).send!
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(url, method, options, handler=nil)
|
23
|
+
@url = url
|
24
|
+
@method = method
|
25
|
+
@ok = true
|
26
|
+
http = self
|
27
|
+
settings = options.to_native
|
28
|
+
|
29
|
+
if handler
|
30
|
+
@callback = @errback = handler
|
31
|
+
end
|
32
|
+
|
33
|
+
%x{
|
34
|
+
settings.data = settings.payload;
|
35
|
+
settings.url = url;
|
36
|
+
settings.type = method;
|
37
|
+
|
38
|
+
settings.success = function(str) {
|
39
|
+
http.body = str;
|
40
|
+
|
41
|
+
if (typeof(str) === 'object') {
|
42
|
+
http.json = #{ JSON.from_object `str` };
|
43
|
+
}
|
44
|
+
|
45
|
+
return #{ http.succeed };
|
46
|
+
};
|
47
|
+
|
48
|
+
settings.error = function(xhr, str) {
|
49
|
+
return #{ http.fail };
|
50
|
+
};
|
51
|
+
}
|
52
|
+
|
53
|
+
@settings = settings
|
54
|
+
end
|
55
|
+
|
56
|
+
def callback(&block)
|
57
|
+
@callback = block
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
def errback(&block)
|
62
|
+
@errback = block
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
def fail
|
67
|
+
@ok = false
|
68
|
+
@errback.call self if @errback
|
69
|
+
end
|
70
|
+
|
71
|
+
# Parses the http response body through json. If the response is not
|
72
|
+
# valid JSON then an error will very likely be thrown.
|
73
|
+
#
|
74
|
+
# @example
|
75
|
+
# # Getting JSON content
|
76
|
+
# HTTP.get("api.json") do |response|
|
77
|
+
# puts response.json
|
78
|
+
# end
|
79
|
+
#
|
80
|
+
# # => {"key" => 1, "bar" => 2, ... }
|
81
|
+
#
|
82
|
+
# @return [Object] returns the parsed json
|
83
|
+
def json
|
84
|
+
@json || JSON.parse(@body)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Returns true if the request succeeded, false otherwise.
|
88
|
+
#
|
89
|
+
# @example
|
90
|
+
# HTTP.get("/some/url") do |response|
|
91
|
+
# if response.ok?
|
92
|
+
# alert "Yay!"
|
93
|
+
# else
|
94
|
+
# alert "Aww :("
|
95
|
+
# end
|
96
|
+
#
|
97
|
+
# @return [Boolean] true if request was successful
|
98
|
+
def ok?
|
99
|
+
@ok
|
100
|
+
end
|
101
|
+
|
102
|
+
# Actually send this request
|
103
|
+
#
|
104
|
+
# @return [HTTP] returns self
|
105
|
+
def send!
|
106
|
+
`$.ajax(#{ @settings })`
|
107
|
+
self
|
108
|
+
end
|
109
|
+
|
110
|
+
def succeed
|
111
|
+
@callback.call self if @callback
|
112
|
+
end
|
113
|
+
end
|