unpoly-rails 0.28.1 → 0.29.0
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.
Potentially problematic release.
This version of unpoly-rails might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -1
- data/dist/unpoly.js +376 -259
- data/dist/unpoly.min.js +3 -3
- data/lib/assets/javascripts/unpoly/browser.js.coffee +2 -2
- data/lib/assets/javascripts/unpoly/bus.js.coffee +40 -13
- data/lib/assets/javascripts/unpoly/flow.js.coffee +9 -9
- data/lib/assets/javascripts/unpoly/form.js.coffee +18 -18
- data/lib/assets/javascripts/unpoly/history.js.coffee +1 -1
- data/lib/assets/javascripts/unpoly/layout.js.coffee +9 -9
- data/lib/assets/javascripts/unpoly/link.js.coffee +34 -24
- data/lib/assets/javascripts/unpoly/modal.js.coffee +38 -37
- data/lib/assets/javascripts/unpoly/motion.js.coffee +20 -23
- data/lib/assets/javascripts/unpoly/navigation.js.coffee +101 -37
- data/lib/assets/javascripts/unpoly/popup.js.coffee +24 -16
- data/lib/assets/javascripts/unpoly/proxy.js.coffee +3 -3
- data/lib/assets/javascripts/unpoly/syntax.js.coffee +29 -37
- data/lib/assets/javascripts/unpoly/tooltip.js.coffee +18 -9
- data/lib/assets/javascripts/unpoly/util.js.coffee +15 -7
- data/lib/unpoly/rails/version.rb +1 -1
- data/spec_app/Gemfile.lock +1 -1
- data/spec_app/spec/javascripts/helpers/trigger.js.coffee +6 -0
- data/spec_app/spec/javascripts/up/bus_spec.js.coffee +9 -8
- data/spec_app/spec/javascripts/up/form_spec.js.coffee +10 -10
- data/spec_app/spec/javascripts/up/link_spec.js.coffee +25 -20
- data/spec_app/spec/javascripts/up/modal_spec.js.coffee +53 -44
- data/spec_app/spec/javascripts/up/navigation_spec.js.coffee +8 -8
- data/spec_app/spec/javascripts/up/popup_spec.js.coffee +92 -44
- data/spec_app/spec/javascripts/up/tooltip_spec.js.coffee +46 -4
- metadata +2 -2
@@ -150,7 +150,7 @@ up.proxy = (($) ->
|
|
150
150
|
Only requests with a method of `GET`, `OPTIONS` and `HEAD`
|
151
151
|
are considered to be read-only.
|
152
152
|
|
153
|
-
|
153
|
+
\#\#\# Example
|
154
154
|
|
155
155
|
up.ajax('/search', data: { query: 'sunshine' }).then(function(data, status, xhr) {
|
156
156
|
console.log('The response body is %o', data);
|
@@ -158,7 +158,7 @@ up.proxy = (($) ->
|
|
158
158
|
console.error('The request failed');
|
159
159
|
});
|
160
160
|
|
161
|
-
|
161
|
+
\#\#\# Events
|
162
162
|
|
163
163
|
If a network connection is attempted, the proxy will emit
|
164
164
|
a [`up:proxy:load`](/up:proxy:load) event with the `request` as its argument.
|
@@ -296,7 +296,7 @@ up.proxy = (($) ->
|
|
296
296
|
waiting, **no** additional `up:proxy:slow` events will be triggered.
|
297
297
|
|
298
298
|
|
299
|
-
|
299
|
+
\#\#\# Spinners
|
300
300
|
|
301
301
|
You can [listen](/up.on) to the `up:proxy:slow`
|
302
302
|
and [`up:proxy:recover`](/up:proxy:recover) events to implement a spinner
|
@@ -1,34 +1,21 @@
|
|
1
1
|
###*
|
2
|
-
|
3
|
-
|
2
|
+
Custom Javascript
|
3
|
+
=================
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
only run during the initial page load. Subsequently [inserted](/up.replace)
|
8
|
-
page fragments will not be compiled.
|
5
|
+
Every app needs a way to pair Javascript snippets with certain HTML elements,
|
6
|
+
in order to integrate libraries or implement custom behavior.
|
9
7
|
|
10
|
-
|
11
|
-
on links that should open a lightbox. You decide to
|
12
|
-
do this for all links with an `lightbox` class:
|
8
|
+
Unpoly lets you organize your Javascript snippets using [compilers](/up.compiler).
|
13
9
|
|
14
|
-
|
15
|
-
|
10
|
+
For instance, to activate the [Masonry](http://masonry.desandro.com/) jQuery plugin for every element
|
11
|
+
with a `grid` class, use this compiler:
|
16
12
|
|
17
|
-
|
18
|
-
|
19
|
-
$(document).on('ready', function() {
|
20
|
-
$('a.lightbox').lightboxify();
|
21
|
-
});
|
22
|
-
|
23
|
-
Instead you should register a [`compiler`](/up.compiler) for the `a.lightbox` selector:
|
24
|
-
|
25
|
-
up.compiler('a.lightbox', function($element) {
|
26
|
-
$element.lightboxify();
|
13
|
+
up.compiler('.grid', function($element) {
|
14
|
+
$element.masonry();
|
27
15
|
});
|
28
16
|
|
29
|
-
The compiler function will be called on matching elements when
|
30
|
-
|
31
|
-
later.
|
17
|
+
The compiler function will be called on matching elements when the page loads
|
18
|
+
or when a matching fragment is [inserted via AJAX](/up.link) later.
|
32
19
|
|
33
20
|
@class up.syntax
|
34
21
|
###
|
@@ -58,7 +45,7 @@ up.syntax = (($) ->
|
|
58
45
|
[Angular directives](https://docs.angularjs.org/guide/directive).
|
59
46
|
|
60
47
|
|
61
|
-
|
48
|
+
\#\#\# Integrating jQuery plugins
|
62
49
|
|
63
50
|
`up.compiler` is a great way to integrate jQuery plugins.
|
64
51
|
Let's say your Javascript plugin wants you to call `lightboxify()`
|
@@ -75,7 +62,7 @@ up.syntax = (($) ->
|
|
75
62
|
});
|
76
63
|
|
77
64
|
|
78
|
-
|
65
|
+
\#\#\# Custom elements
|
79
66
|
|
80
67
|
You can use `up.compiler` to implement custom elements like this:
|
81
68
|
|
@@ -89,7 +76,7 @@ up.syntax = (($) ->
|
|
89
76
|
});
|
90
77
|
|
91
78
|
|
92
|
-
|
79
|
+
\#\#\# Cleaning up after yourself
|
93
80
|
|
94
81
|
If your compiler returns a function, Unpoly will use this as a *destructor* to
|
95
82
|
clean up if the element leaves the DOM. Note that in Unpoly the same DOM ad Javascript environment
|
@@ -98,7 +85,7 @@ up.syntax = (($) ->
|
|
98
85
|
|
99
86
|
You should clean up after yourself whenever your compilers have global
|
100
87
|
side effects, like a [`setInterval`](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval)
|
101
|
-
or event handlers bound to the document root.
|
88
|
+
or [event handlers bound to the document root](/up.on).
|
102
89
|
|
103
90
|
Here is a version of `<clock>` that updates
|
104
91
|
the time every second, and cleans up once it's done. Note how it returns
|
@@ -124,7 +111,7 @@ up.syntax = (($) ->
|
|
124
111
|
of `<clock>` elements.
|
125
112
|
|
126
113
|
|
127
|
-
|
114
|
+
\#\#\# Attaching structured data
|
128
115
|
|
129
116
|
In case you want to attach structured data to the event you're observing,
|
130
117
|
you can serialize the data to JSON and put it into an `[up-data]` attribute.
|
@@ -154,7 +141,7 @@ up.syntax = (($) ->
|
|
154
141
|
});
|
155
142
|
|
156
143
|
|
157
|
-
|
144
|
+
\#\#\# Migrating jQuery event handlers to `up.compiler`
|
158
145
|
|
159
146
|
Within the compiler, Unpoly will bind `this` to the
|
160
147
|
native DOM element to help you migrate your existing jQuery code to
|
@@ -201,9 +188,12 @@ up.syntax = (($) ->
|
|
201
188
|
|
202
189
|
The function may return a destructor function that destroys the compiled
|
203
190
|
object before it is removed from the DOM. The destructor is supposed to
|
204
|
-
clear global state
|
191
|
+
[clear global state](/up.compiler#cleaning-up-after-yourself)
|
192
|
+
such as timeouts and event handlers bound to the document.
|
205
193
|
The destructor is *not* expected to remove the element from the DOM, which
|
206
194
|
is already handled by [`up.destroy`](/up.destroy).
|
195
|
+
|
196
|
+
The function may also return an array of destructor functions.
|
207
197
|
@stable
|
208
198
|
###
|
209
199
|
compiler = (args...) ->
|
@@ -214,7 +204,7 @@ up.syntax = (($) ->
|
|
214
204
|
|
215
205
|
You can use `up.macro` to register a compiler that sets other UJS attributes.
|
216
206
|
|
217
|
-
|
207
|
+
\#\#\# Example
|
218
208
|
|
219
209
|
You will sometimes find yourself setting the same combination of UJS attributes again and again:
|
220
210
|
|
@@ -281,14 +271,16 @@ up.syntax = (($) ->
|
|
281
271
|
value = if u.isString(compiler.keep) then compiler.keep else ''
|
282
272
|
$jqueryElement.attr('up-keep', value)
|
283
273
|
returnValue = compiler.callback.apply(nativeElement, [$jqueryElement, data($jqueryElement)])
|
284
|
-
|
274
|
+
for destructor in discoverDestructors(returnValue)
|
285
275
|
addDestructor($jqueryElement, destructor)
|
286
276
|
|
287
|
-
|
277
|
+
discoverDestructors = (returnValue) ->
|
288
278
|
if u.isFunction(returnValue)
|
289
|
-
returnValue
|
279
|
+
[returnValue]
|
290
280
|
else if u.isArray(returnValue) && u.all(returnValue, u.isFunction)
|
291
|
-
|
281
|
+
returnValue
|
282
|
+
else
|
283
|
+
[]
|
292
284
|
|
293
285
|
addDestructor = ($jqueryElement, destructor) ->
|
294
286
|
$jqueryElement.addClass(DESTRUCTABLE_CLASS)
|
@@ -348,7 +340,7 @@ up.syntax = (($) ->
|
|
348
340
|
|
349
341
|
Returns an empty object if the element has no `up-data` attribute.
|
350
342
|
|
351
|
-
|
343
|
+
\#\#\# Example
|
352
344
|
|
353
345
|
You have an element with JSON data serialized into an `up-data` attribute:
|
354
346
|
|
@@ -10,7 +10,7 @@ You can an [`up-tooltip`](/up-tooltip) attribute to any HTML tag to show a toolt
|
|
10
10
|
<a href="/decks" up-tooltip="Show all decks">Decks</a>
|
11
11
|
|
12
12
|
|
13
|
-
|
13
|
+
\#\#\# Styling
|
14
14
|
|
15
15
|
The [default styles](https://github.com/unpoly/unpoly/blob/master/lib/assets/stylesheets/up/tooltip.css.sass)
|
16
16
|
show a simple tooltip with white text on a gray background.
|
@@ -125,8 +125,16 @@ up.tooltip = (($) ->
|
|
125
125
|
|
126
126
|
@function up.tooltip.attach
|
127
127
|
@param {Element|jQuery|String} elementOrSelector
|
128
|
+
@param {String} [options.text]
|
129
|
+
The text to display in the tooltip.
|
130
|
+
|
131
|
+
Any HTML control characters will be escaped.
|
132
|
+
If you need to use HTML formatting in the tooltip, use `options.html` instead.
|
128
133
|
@param {String} [options.html]
|
129
|
-
The HTML to display in the tooltip.
|
134
|
+
The HTML to display in the tooltip unescaped.
|
135
|
+
|
136
|
+
Make sure to escape any user-provided text before passing it as this option,
|
137
|
+
or use `options.text` (which automatically escapes).
|
130
138
|
@param {String} [options.position='top']
|
131
139
|
The position of the tooltip.
|
132
140
|
Can be `'top'`, `'right'`, `'bottom'` or `'left'`.
|
@@ -228,20 +236,21 @@ up.tooltip = (($) ->
|
|
228
236
|
@selector [up-tooltip-html]
|
229
237
|
@stable
|
230
238
|
###
|
231
|
-
up.compiler
|
239
|
+
up.compiler '[up-tooltip], [up-tooltip-html]', ($opener) ->
|
232
240
|
# Don't register these events on document since *every*
|
233
241
|
# mouse move interaction bubbles up to the document.
|
234
242
|
$opener.on('mouseenter', -> attachAsap($opener))
|
235
243
|
$opener.on('mouseleave', -> closeAsap())
|
236
|
-
)
|
237
244
|
|
238
|
-
#
|
239
|
-
up
|
245
|
+
# We close the tooltip when someone clicks on the document.
|
246
|
+
# We also need to listen to up:action:consumed in case an [up-instant] link
|
247
|
+
# was followed on mousedown.
|
248
|
+
up.on 'click up:action:consumed', (event) ->
|
240
249
|
closeAsap()
|
241
|
-
|
250
|
+
# Do not halt the event chain here. The user is allowed to directly activate
|
251
|
+
# a link in the background, even with a (now closing) tooltip open.
|
242
252
|
|
243
|
-
# The framework is reset between tests, so also close
|
244
|
-
# a currently open tooltip.
|
253
|
+
# The framework is reset between tests, so also close a currently open tooltip.
|
245
254
|
up.on 'up:framework:reset', reset
|
246
255
|
|
247
256
|
# Close the tooltip when the user presses ESC.
|
@@ -829,8 +829,8 @@ up.util = (($) ->
|
|
829
829
|
position: 'absolute'
|
830
830
|
top: '0'
|
831
831
|
left: '0'
|
832
|
-
width: '
|
833
|
-
height: '
|
832
|
+
width: '100px'
|
833
|
+
height: '100px' # Firefox needs at least 100px to show a scrollbar
|
834
834
|
overflowY: 'scroll'
|
835
835
|
$outer.appendTo(document.body)
|
836
836
|
outer = $outer.get(0)
|
@@ -1668,19 +1668,26 @@ up.util = (($) ->
|
|
1668
1668
|
data
|
1669
1669
|
|
1670
1670
|
###*
|
1671
|
-
Throws
|
1671
|
+
Throws a [Javascript error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)
|
1672
1672
|
with the given message.
|
1673
1673
|
|
1674
|
-
The message will also be printed to the [error log](/up.log.error).
|
1674
|
+
The message will also be printed to the [error log](/up.log.error). Also a notification will be shown at the bottom of the screen.
|
1675
1675
|
|
1676
|
-
|
1676
|
+
The message may contain [substitution marks](https://developer.mozilla.org/en-US/docs/Web/API/console#Using_string_substitutions).
|
1677
1677
|
|
1678
|
-
|
1678
|
+
\#\#\# Examples
|
1679
1679
|
|
1680
1680
|
up.fail('Division by zero')
|
1681
1681
|
up.fail('Unexpected result %o', result)
|
1682
1682
|
|
1683
1683
|
@function up.fail
|
1684
|
+
@param {String} message
|
1685
|
+
A message with details about the error.
|
1686
|
+
|
1687
|
+
The message can contain [substitution marks](https://developer.mozilla.org/en-US/docs/Web/API/console#Using_string_substitutions)
|
1688
|
+
like `%s` or `%o`.
|
1689
|
+
@param {Array<String>} vars...
|
1690
|
+
A list of variables to replace any substitution marks in the error message.
|
1684
1691
|
@experimental
|
1685
1692
|
###
|
1686
1693
|
fail = (args...) ->
|
@@ -1833,7 +1840,7 @@ up.util = (($) ->
|
|
1833
1840
|
@function up.util.sequence
|
1834
1841
|
@internal
|
1835
1842
|
###
|
1836
|
-
sequence
|
1843
|
+
sequence = (functions...) ->
|
1837
1844
|
->
|
1838
1845
|
map functions, (f) -> f()
|
1839
1846
|
|
@@ -1944,6 +1951,7 @@ up.util = (($) ->
|
|
1944
1951
|
escapeHtml: escapeHtml
|
1945
1952
|
DivertibleChain: DivertibleChain
|
1946
1953
|
submittedValue: submittedValue
|
1954
|
+
sequence: sequence
|
1947
1955
|
|
1948
1956
|
)($)
|
1949
1957
|
|
data/lib/unpoly/rails/version.rb
CHANGED
data/spec_app/Gemfile.lock
CHANGED
@@ -18,6 +18,11 @@
|
|
18
18
|
event = createMouseEvent('click', options)
|
19
19
|
dispatch($element, event)
|
20
20
|
|
21
|
+
clickSequence = ($element, options) ->
|
22
|
+
mousedown($element, options)
|
23
|
+
mouseup($element, options)
|
24
|
+
click($element, options)
|
25
|
+
|
21
26
|
# Can't use the new MouseEvent constructor in IE11 because computer.
|
22
27
|
# http://www.codeproject.com/Tips/893254/JavaScript-Triggering-Event-Manually-in-Internet-E
|
23
28
|
createMouseEvent = (type, options) ->
|
@@ -64,5 +69,6 @@
|
|
64
69
|
mousedown: mousedown
|
65
70
|
mouseup: mouseup
|
66
71
|
click: click
|
72
|
+
clickSequence: clickSequence
|
67
73
|
|
68
74
|
)()
|
@@ -11,8 +11,8 @@ describe 'up.bus', ->
|
|
11
11
|
up.on 'click', '.child', (event, $element) ->
|
12
12
|
observeClass($element.attr('class'))
|
13
13
|
|
14
|
-
$('.container')
|
15
|
-
$('.child')
|
14
|
+
Trigger.click($('.container'))
|
15
|
+
Trigger.click($('.child'))
|
16
16
|
|
17
17
|
expect(observeClass).not.toHaveBeenCalledWith('container')
|
18
18
|
expect(observeClass).toHaveBeenCalledWith('child')
|
@@ -21,9 +21,10 @@ describe 'up.bus', ->
|
|
21
21
|
$child = affix('.child')
|
22
22
|
clickSpy = jasmine.createSpy()
|
23
23
|
unsubscribe = up.on 'click', '.child', clickSpy
|
24
|
-
$('.child')
|
24
|
+
Trigger.click($('.child'))
|
25
|
+
expect(clickSpy.calls.count()).toEqual(1)
|
25
26
|
unsubscribe()
|
26
|
-
$('.child')
|
27
|
+
Trigger.click($('.child'))
|
27
28
|
expect(clickSpy.calls.count()).toEqual(1)
|
28
29
|
|
29
30
|
it 'parses an up-data attribute as JSON and passes the parsed object as a third argument to the initializer', ->
|
@@ -35,7 +36,7 @@ describe 'up.bus', ->
|
|
35
36
|
data = { key1: 'value1', key2: 'value2' }
|
36
37
|
$tag = affix(".child").attr('up-data', JSON.stringify(data))
|
37
38
|
|
38
|
-
$('.child')
|
39
|
+
Trigger.click($('.child'))
|
39
40
|
expect(observeArgs).toHaveBeenCalledWith('child', data)
|
40
41
|
|
41
42
|
it 'passes an empty object as a second argument to the listener if there is no up-data attribute', ->
|
@@ -44,7 +45,7 @@ describe 'up.bus', ->
|
|
44
45
|
up.on 'click', '.child', (event, $element, data) ->
|
45
46
|
observeArgs($element.attr('class'), data)
|
46
47
|
|
47
|
-
$('.child')
|
48
|
+
Trigger.click($('.child'))
|
48
49
|
expect(observeArgs).toHaveBeenCalledWith('child', {})
|
49
50
|
|
50
51
|
describe 'up.off', ->
|
@@ -53,9 +54,9 @@ describe 'up.bus', ->
|
|
53
54
|
$child = affix('.child')
|
54
55
|
clickSpy = jasmine.createSpy()
|
55
56
|
up.on 'click', '.child', clickSpy
|
56
|
-
$('.child')
|
57
|
+
Trigger.click($('.child'))
|
57
58
|
up.off 'click', '.child', clickSpy
|
58
|
-
$('.child')
|
59
|
+
Trigger.click($('.child'))
|
59
60
|
expect(clickSpy.calls.count()).toEqual(1)
|
60
61
|
|
61
62
|
it 'throws an error if the given event listener was not registered through up.on', ->
|
@@ -69,11 +69,11 @@ describe 'up.form', ->
|
|
69
69
|
callback = jasmine.createSpy('change callback')
|
70
70
|
up.observe($checkbox, callback)
|
71
71
|
expect($checkbox.is(':checked')).toBe(false)
|
72
|
-
$checkbox
|
72
|
+
Trigger.clickSequence($checkbox)
|
73
73
|
u.nextFrame ->
|
74
74
|
expect($checkbox.is(':checked')).toBe(true)
|
75
75
|
expect(callback.calls.count()).toEqual(1)
|
76
|
-
$checkbox
|
76
|
+
Trigger.clickSequence($checkbox)
|
77
77
|
u.nextFrame ->
|
78
78
|
expect($checkbox.is(':checked')).toBe(false)
|
79
79
|
expect(callback.calls.count()).toEqual(2)
|
@@ -86,11 +86,11 @@ describe 'up.form', ->
|
|
86
86
|
callback = jasmine.createSpy('change callback')
|
87
87
|
up.observe($checkbox, callback)
|
88
88
|
expect($checkbox.is(':checked')).toBe(false)
|
89
|
-
$label
|
89
|
+
Trigger.clickSequence($label)
|
90
90
|
u.nextFrame ->
|
91
91
|
expect($checkbox.is(':checked')).toBe(true)
|
92
92
|
expect(callback.calls.count()).toEqual(1)
|
93
|
-
$label
|
93
|
+
Trigger.clickSequence($label)
|
94
94
|
u.nextFrame ->
|
95
95
|
expect($checkbox.is(':checked')).toBe(false)
|
96
96
|
expect(callback.calls.count()).toEqual(2)
|
@@ -106,11 +106,11 @@ describe 'up.form', ->
|
|
106
106
|
callback = jasmine.createSpy('change callback')
|
107
107
|
up.observe($group, callback)
|
108
108
|
expect($radio1.is(':checked')).toBe(false)
|
109
|
-
$radio1
|
109
|
+
Trigger.clickSequence($radio1)
|
110
110
|
u.nextFrame ->
|
111
111
|
expect($radio1.is(':checked')).toBe(true)
|
112
112
|
expect(callback.calls.count()).toEqual(1)
|
113
|
-
$radio2
|
113
|
+
Trigger.clickSequence($radio2)
|
114
114
|
u.nextFrame ->
|
115
115
|
expect($radio1.is(':checked')).toBe(false)
|
116
116
|
expect(callback.calls.count()).toEqual(2)
|
@@ -126,11 +126,11 @@ describe 'up.form', ->
|
|
126
126
|
callback = jasmine.createSpy('change callback')
|
127
127
|
up.observe($group, callback)
|
128
128
|
expect($radio1.is(':checked')).toBe(false)
|
129
|
-
$radio1Label
|
129
|
+
Trigger.clickSequence($radio1Label)
|
130
130
|
u.nextFrame ->
|
131
131
|
expect($radio1.is(':checked')).toBe(true)
|
132
132
|
expect(callback.calls.count()).toEqual(1)
|
133
|
-
$radio2Label
|
133
|
+
Trigger.clickSequence($radio2Label)
|
134
134
|
u.nextFrame ->
|
135
135
|
expect($radio1.is(':checked')).toBe(false)
|
136
136
|
expect(callback.calls.count()).toEqual(2)
|
@@ -145,14 +145,14 @@ describe 'up.form', ->
|
|
145
145
|
up.observe($group, callback)
|
146
146
|
expect($radio1.is(':checked')).toBe(true)
|
147
147
|
expect($radio2.is(':checked')).toBe(false)
|
148
|
-
$radio1
|
148
|
+
Trigger.clickSequence($radio1)
|
149
149
|
u.nextFrame ->
|
150
150
|
# Since the radio button was already checked, the click doesn't do anything
|
151
151
|
expect($radio1.is(':checked')).toBe(true)
|
152
152
|
expect($radio2.is(':checked')).toBe(false)
|
153
153
|
# Since the radio button was already checked, clicking it again won't trigger the callback
|
154
154
|
expect(callback.calls.count()).toEqual(0)
|
155
|
-
$radio2
|
155
|
+
Trigger.clickSequence($radio2)
|
156
156
|
u.nextFrame ->
|
157
157
|
expect($radio1.is(':checked')).toBe(false)
|
158
158
|
expect($radio2.is(':checked')).toBe(true)
|