unpoly-rails 0.36.2 → 0.37.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 +12 -0
- data/README.md +1 -1
- data/dist/unpoly.js +137 -73
- data/dist/unpoly.min.js +3 -3
- data/lib/assets/javascripts/unpoly/bus.coffee +2 -2
- data/lib/assets/javascripts/unpoly/dom/extract_plan.coffee +4 -2
- data/lib/assets/javascripts/unpoly/dom.coffee +26 -12
- data/lib/assets/javascripts/unpoly/form.coffee +19 -1
- data/lib/assets/javascripts/unpoly/layout.coffee +1 -1
- data/lib/assets/javascripts/unpoly/link.coffee +9 -2
- data/lib/assets/javascripts/unpoly/modal.coffee +1 -0
- data/lib/assets/javascripts/unpoly/popup.coffee +1 -0
- data/lib/assets/javascripts/unpoly/syntax.coffee +48 -29
- data/lib/assets/javascripts/unpoly/util.coffee +12 -5
- data/lib/unpoly/rails/version.rb +1 -1
- data/package.json +1 -1
- data/spec_app/Gemfile.lock +1 -1
- data/spec_app/app/assets/javascripts/integration_test.coffee +4 -0
- data/spec_app/app/controllers/replace_test_controller.rb +5 -0
- data/spec_app/app/views/pages/start.erb +4 -0
- data/spec_app/app/views/replace_test/_nav.erb +6 -0
- data/spec_app/app/views/replace_test/page1.erb +14 -0
- data/spec_app/app/views/replace_test/page2.erb +14 -0
- data/spec_app/config/routes.rb +1 -0
- data/spec_app/spec/javascripts/helpers/reset_path.js.coffee +1 -2
- data/spec_app/spec/javascripts/up/dom_spec.js.coffee +69 -1
- data/spec_app/spec/javascripts/up/feedback_spec.js.coffee +5 -3
- data/spec_app/spec/javascripts/up/history_spec.js.coffee +174 -153
- data/spec_app/spec/javascripts/up/link_spec.js.coffee +77 -19
- data/spec_app/spec/javascripts/up/syntax_spec.js.coffee +1 -1
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +34 -0
- metadata +6 -2
@@ -10,211 +10,243 @@ describe 'up.history', ->
|
|
10
10
|
|
11
11
|
describe 'up.history.url', ->
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
history.replaceState?({}, 'title', '/host/path/')
|
17
|
-
expect(up.history.url()).toEqualUrl('/host/path/')
|
13
|
+
it 'does not strip a trailing slash from the current URL', ->
|
14
|
+
history.replaceState?({}, 'title', '/host/path/')
|
15
|
+
expect(up.history.url()).toEqualUrl('/host/path/')
|
18
16
|
|
19
17
|
describe 'up.history.isUrl', ->
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
history.replaceState?({}, 'title', '/host/path/')
|
25
|
-
expect(up.history.isUrl('/host/path/')).toBe(true)
|
19
|
+
it 'returns true if the given path is the current URL', ->
|
20
|
+
history.replaceState?({}, 'title', '/host/path/')
|
21
|
+
expect(up.history.isUrl('/host/path/')).toBe(true)
|
26
22
|
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
it 'returns false if the given path is not the current URL', ->
|
24
|
+
history.replaceState?({}, 'title', '/host/path/')
|
25
|
+
expect(up.history.isUrl('/host/other-path/')).toBe(false)
|
30
26
|
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
it 'returns true if the given full URL is the current URL', ->
|
28
|
+
history.replaceState?({}, 'title', '/host/path/')
|
29
|
+
expect(up.history.isUrl("http://#{location.host}/host/path/")).toBe(true)
|
34
30
|
|
35
|
-
|
36
|
-
|
37
|
-
|
31
|
+
it 'returns true if the given path is the current URL, but without a trailing slash', ->
|
32
|
+
history.replaceState?({}, 'title', '/host/path/')
|
33
|
+
expect(up.history.isUrl('/host/path')).toBe(true)
|
38
34
|
|
39
|
-
|
40
|
-
|
41
|
-
|
35
|
+
it 'returns true if the given path is the current URL, but with a trailing slash', ->
|
36
|
+
history.replaceState?({}, 'title', '/host/path')
|
37
|
+
expect(up.history.isUrl('/host/path/')).toBe(true)
|
42
38
|
|
43
39
|
describe 'unobtrusive behavior', ->
|
44
40
|
|
45
|
-
describe '
|
41
|
+
describe 'back button', ->
|
46
42
|
|
47
|
-
|
43
|
+
it 'calls destructor functions when destroying compiled elements (bugfix)', (done) ->
|
44
|
+
waitForBrowser = 70
|
48
45
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
expect($element.attr('href')).toEqualUrl('/three')
|
54
|
-
expect($element.attr('up-href')).toEqualUrl('/one')
|
55
|
-
expect($element.attr('up-restore-scroll')).toBe('')
|
56
|
-
expect($element.attr('up-follow')).toBe('')
|
46
|
+
# By default, up.history will replace the <body> tag when
|
47
|
+
# the user presses the back-button. We reconfigure this
|
48
|
+
# so we don't lose the Jasmine runner interface.
|
49
|
+
up.history.config.popTargets = ['.container']
|
57
50
|
|
58
|
-
|
51
|
+
constructorSpy = jasmine.createSpy('constructor')
|
52
|
+
destructorSpy = jasmine.createSpy('destructor')
|
53
|
+
|
54
|
+
up.compiler '.example', ($example) ->
|
55
|
+
constructorSpy()
|
56
|
+
return destructorSpy
|
57
|
+
|
58
|
+
up.history.push('/one')
|
59
|
+
up.history.push('/two')
|
60
|
+
|
61
|
+
$container = affix('.container')
|
62
|
+
$example = $container.affix('.example')
|
63
|
+
up.hello($example)
|
64
|
+
|
65
|
+
expect(constructorSpy).toHaveBeenCalled()
|
66
|
+
|
67
|
+
history.back()
|
68
|
+
u.setTimer waitForBrowser, =>
|
69
|
+
expect(location.pathname).toEqual('/one')
|
70
|
+
|
71
|
+
@respondWith "<div class='container'>restored container text</div>"
|
72
|
+
|
73
|
+
u.nextFrame ->
|
74
|
+
expect(destructorSpy).toHaveBeenCalled()
|
75
|
+
done()
|
59
76
|
|
60
|
-
it 'does not set an up-href attribute if there is no previous URL'
|
61
77
|
|
62
|
-
|
78
|
+
describe '[up-back]', ->
|
79
|
+
|
80
|
+
it 'sets an [up-href] attribute to the previous URL and sets the up-restore-scroll attribute to "true"', ->
|
81
|
+
up.history.push('/one')
|
82
|
+
up.history.push('/two')
|
83
|
+
$element = up.hello(affix('a[href="/three"][up-back]').text('text'))
|
84
|
+
expect($element.attr('href')).toEqualUrl('/three')
|
85
|
+
expect($element.attr('up-href')).toEqualUrl('/one')
|
86
|
+
expect($element.attr('up-restore-scroll')).toBe('')
|
87
|
+
expect($element.attr('up-follow')).toBe('')
|
88
|
+
|
89
|
+
it 'does not overwrite an existing up-href or up-restore-scroll attribute'
|
63
90
|
|
64
|
-
|
65
|
-
$element = up.hello(affix('a[href="/three"][up-back]').text('text'))
|
66
|
-
expect($element.attr('up-href')).toBeUndefined()
|
91
|
+
it 'does not set an up-href attribute if there is no previous URL'
|
67
92
|
|
68
93
|
describe 'scroll restoration', ->
|
69
94
|
|
70
|
-
|
95
|
+
afterEach ->
|
96
|
+
$('.viewport').remove()
|
71
97
|
|
72
|
-
|
73
|
-
$('.viewport').remove()
|
98
|
+
it 'restores the scroll position of viewports when the user hits the back button', (done) ->
|
74
99
|
|
75
|
-
|
100
|
+
longContentHtml = """
|
101
|
+
<div class="viewport" style="width: 100px; height: 100px; overflow-y: scroll">
|
102
|
+
<div class="content" style="height: 1000px"></div>
|
103
|
+
</div>
|
104
|
+
"""
|
76
105
|
|
77
|
-
|
78
|
-
<div class="viewport" style="width: 100px; height: 100px; overflow-y: scroll">
|
79
|
-
<div class="content" style="height: 1000px"></div>
|
80
|
-
</div>
|
81
|
-
"""
|
106
|
+
respond = => @respondWith(longContentHtml)
|
82
107
|
|
83
|
-
|
108
|
+
$viewport = $(longContentHtml).appendTo(document.body)
|
84
109
|
|
85
|
-
|
110
|
+
up.layout.config.viewports = ['.viewport']
|
111
|
+
up.history.config.popTargets = ['.viewport']
|
86
112
|
|
87
|
-
|
88
|
-
|
113
|
+
up.replace('.content', '/one')
|
114
|
+
respond()
|
89
115
|
|
90
|
-
|
91
|
-
respond()
|
116
|
+
$viewport.scrollTop(50)
|
92
117
|
|
93
|
-
|
118
|
+
up.replace('.content', '/two')
|
119
|
+
respond()
|
94
120
|
|
95
|
-
|
96
|
-
respond()
|
121
|
+
$('.viewport').scrollTop(150)
|
97
122
|
|
98
|
-
|
123
|
+
up.replace('.content', '/three')
|
124
|
+
respond()
|
125
|
+
$('.viewport').scrollTop(250)
|
99
126
|
|
100
|
-
|
101
|
-
|
102
|
-
|
127
|
+
history.back()
|
128
|
+
u.setTimer 50, ->
|
129
|
+
respond() # we need to respond since we've never requested /two with the popTarget
|
130
|
+
expect($('.viewport').scrollTop()).toBe(150)
|
103
131
|
|
104
132
|
history.back()
|
105
133
|
u.setTimer 50, ->
|
106
|
-
respond() # we need to respond since we've never requested /
|
107
|
-
expect($('.viewport').scrollTop()).toBe(
|
134
|
+
respond() # we need to respond since we've never requested /one with the popTarget
|
135
|
+
expect($('.viewport').scrollTop()).toBe(50)
|
108
136
|
|
109
|
-
history.
|
137
|
+
history.forward()
|
110
138
|
u.setTimer 50, ->
|
111
|
-
|
112
|
-
|
139
|
+
# No need to respond since we requested /two with the popTarget
|
140
|
+
# when we went backwards
|
141
|
+
expect($('.viewport').scrollTop()).toBe(150)
|
113
142
|
|
114
143
|
history.forward()
|
115
144
|
u.setTimer 50, ->
|
116
|
-
#
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
up.history.config.popTargets = ['.container']
|
128
|
-
|
129
|
-
html = """
|
130
|
-
<div class="container">
|
131
|
-
<div class="viewport1" up-viewport style="width: 100px; height: 100px; overflow-y: scroll">
|
132
|
-
<div class="content1" style="height: 5000px">content1</div>
|
133
|
-
</div>
|
134
|
-
<div class="viewport2" up-viewport style="width: 100px; height: 100px; overflow-y: scroll">
|
135
|
-
<div class="content2" style="height: 5000px">content2</div>
|
136
|
-
</div>
|
145
|
+
respond() # we need to respond since we've never requested /three with the popTarget
|
146
|
+
expect($('.viewport').scrollTop()).toBe(250)
|
147
|
+
done()
|
148
|
+
|
149
|
+
it 'restores the scroll position of two viewports marked with [up-viewport], but not configured in up.layout.config (bugfix)', (done) ->
|
150
|
+
up.history.config.popTargets = ['.container']
|
151
|
+
|
152
|
+
html = """
|
153
|
+
<div class="container">
|
154
|
+
<div class="viewport1" up-viewport style="width: 100px; height: 100px; overflow-y: scroll">
|
155
|
+
<div class="content1" style="height: 5000px">content1</div>
|
137
156
|
</div>
|
138
|
-
|
157
|
+
<div class="viewport2" up-viewport style="width: 100px; height: 100px; overflow-y: scroll">
|
158
|
+
<div class="content2" style="height: 5000px">content2</div>
|
159
|
+
</div>
|
160
|
+
</div>
|
161
|
+
"""
|
139
162
|
|
140
|
-
|
163
|
+
respond = => @respondWith(html)
|
141
164
|
|
142
|
-
|
143
|
-
|
165
|
+
$screen = affix('.screen')
|
166
|
+
$screen.html(html)
|
144
167
|
|
145
|
-
|
146
|
-
|
168
|
+
up.replace('.content1, .content2', '/one', reveal: false)
|
169
|
+
respond()
|
147
170
|
|
148
|
-
|
149
|
-
|
171
|
+
$('.viewport1').scrollTop(3000)
|
172
|
+
$('.viewport2').scrollTop(3050)
|
150
173
|
|
151
|
-
|
152
|
-
|
174
|
+
expect('.viewport1').toBeScrolledTo(3000)
|
175
|
+
expect('.viewport2').toBeScrolledTo(3050)
|
153
176
|
|
154
|
-
|
155
|
-
|
177
|
+
up.replace('.content1, .content2', '/two', reveal: false)
|
178
|
+
respond()
|
156
179
|
|
157
|
-
|
180
|
+
u.setTimer 50, ->
|
158
181
|
|
159
|
-
|
182
|
+
expect(location.href).toEqualUrl('/two')
|
160
183
|
|
161
|
-
|
184
|
+
history.back()
|
162
185
|
|
163
|
-
|
164
|
-
|
165
|
-
|
186
|
+
u.setTimer 50, ->
|
187
|
+
# we need to respond since we've never requested the original URL with the popTarget
|
188
|
+
respond()
|
166
189
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
190
|
+
u.nextFrame ->
|
191
|
+
expect('.viewport1').toBeScrolledTo(3000)
|
192
|
+
expect('.viewport2').toBeScrolledTo(3050)
|
193
|
+
done()
|
171
194
|
|
172
195
|
|
173
196
|
describe 'events', ->
|
174
197
|
|
175
|
-
|
198
|
+
it 'emits up:history:* events as the user goes forwards and backwards through history', (done) ->
|
199
|
+
up.proxy.config.cacheSize = 0
|
200
|
+
up.history.config.popTargets = ['.viewport']
|
176
201
|
|
177
|
-
|
178
|
-
|
179
|
-
|
202
|
+
affix('.viewport .content')
|
203
|
+
respond = =>
|
204
|
+
@respondWith """
|
205
|
+
<div class="viewport">
|
206
|
+
<div class="content">content</div>
|
207
|
+
</div>
|
208
|
+
"""
|
180
209
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
<div class="content">content</div>
|
186
|
-
</div>
|
187
|
-
"""
|
210
|
+
events = []
|
211
|
+
u.each ['up:history:pushed', 'up:history:restored'], (eventName) ->
|
212
|
+
up.on eventName, (event) ->
|
213
|
+
events.push [eventName, event.url]
|
188
214
|
|
189
|
-
|
190
|
-
u.each ['up:history:pushed', 'up:history:restored'], (eventName) ->
|
191
|
-
up.on eventName, (event) ->
|
192
|
-
events.push [eventName, event.url]
|
215
|
+
normalize = up.history.normalizeUrl
|
193
216
|
|
194
|
-
|
217
|
+
up.replace('.content', '/one')
|
218
|
+
respond()
|
195
219
|
|
196
|
-
|
197
|
-
|
220
|
+
expect(events).toEqual [
|
221
|
+
['up:history:pushed', normalize('/one')]
|
222
|
+
]
|
198
223
|
|
199
|
-
|
200
|
-
|
201
|
-
]
|
224
|
+
up.replace('.content', '/two')
|
225
|
+
respond()
|
202
226
|
|
203
|
-
|
204
|
-
|
227
|
+
expect(events).toEqual [
|
228
|
+
['up:history:pushed', normalize('/one')]
|
229
|
+
['up:history:pushed', normalize('/two')]
|
230
|
+
]
|
205
231
|
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
232
|
+
up.replace('.content', '/three')
|
233
|
+
respond()
|
234
|
+
|
235
|
+
expect(events).toEqual [
|
236
|
+
['up:history:pushed', normalize('/one')]
|
237
|
+
['up:history:pushed', normalize('/two')]
|
238
|
+
['up:history:pushed', normalize('/three')]
|
239
|
+
]
|
210
240
|
|
211
|
-
|
241
|
+
history.back()
|
242
|
+
u.setTimer 50, ->
|
212
243
|
respond()
|
213
244
|
|
214
245
|
expect(events).toEqual [
|
215
246
|
['up:history:pushed', normalize('/one')]
|
216
247
|
['up:history:pushed', normalize('/two')]
|
217
248
|
['up:history:pushed', normalize('/three')]
|
249
|
+
['up:history:restored', normalize('/two')]
|
218
250
|
]
|
219
251
|
|
220
252
|
history.back()
|
@@ -226,9 +258,10 @@ describe 'up.history', ->
|
|
226
258
|
['up:history:pushed', normalize('/two')]
|
227
259
|
['up:history:pushed', normalize('/three')]
|
228
260
|
['up:history:restored', normalize('/two')]
|
261
|
+
['up:history:restored', normalize('/one')]
|
229
262
|
]
|
230
263
|
|
231
|
-
history.
|
264
|
+
history.forward()
|
232
265
|
u.setTimer 50, ->
|
233
266
|
respond()
|
234
267
|
|
@@ -238,11 +271,12 @@ describe 'up.history', ->
|
|
238
271
|
['up:history:pushed', normalize('/three')]
|
239
272
|
['up:history:restored', normalize('/two')]
|
240
273
|
['up:history:restored', normalize('/one')]
|
274
|
+
['up:history:restored', normalize('/two')]
|
241
275
|
]
|
242
276
|
|
243
277
|
history.forward()
|
244
278
|
u.setTimer 50, ->
|
245
|
-
respond()
|
279
|
+
respond() # we need to respond since we've never requested /three with the popTarget
|
246
280
|
|
247
281
|
expect(events).toEqual [
|
248
282
|
['up:history:pushed', normalize('/one')]
|
@@ -251,20 +285,7 @@ describe 'up.history', ->
|
|
251
285
|
['up:history:restored', normalize('/two')]
|
252
286
|
['up:history:restored', normalize('/one')]
|
253
287
|
['up:history:restored', normalize('/two')]
|
288
|
+
['up:history:restored', normalize('/three')]
|
254
289
|
]
|
255
290
|
|
256
|
-
|
257
|
-
u.setTimer 50, ->
|
258
|
-
respond() # we need to respond since we've never requested /three with the popTarget
|
259
|
-
|
260
|
-
expect(events).toEqual [
|
261
|
-
['up:history:pushed', normalize('/one')]
|
262
|
-
['up:history:pushed', normalize('/two')]
|
263
|
-
['up:history:pushed', normalize('/three')]
|
264
|
-
['up:history:restored', normalize('/two')]
|
265
|
-
['up:history:restored', normalize('/one')]
|
266
|
-
['up:history:restored', normalize('/two')]
|
267
|
-
['up:history:restored', normalize('/three')]
|
268
|
-
]
|
269
|
-
|
270
|
-
done()
|
291
|
+
done()
|
@@ -365,34 +365,92 @@ describe 'up.link', ->
|
|
365
365
|
expect($('.target')).toHaveText('new text')
|
366
366
|
expect(location.pathname).toEqual('/other/path')
|
367
367
|
|
368
|
-
|
369
|
-
up.motion.config.enabled = false
|
368
|
+
describe 'choice of target layer', ->
|
370
369
|
|
371
|
-
|
372
|
-
|
373
|
-
affix('.document').affix('.target').text('old document text')
|
370
|
+
beforeEach ->
|
371
|
+
up.motion.config.enabled = false
|
374
372
|
|
375
|
-
|
376
|
-
|
373
|
+
it 'prefers to update a container in the same layer as the clicked link', (done) ->
|
374
|
+
affix('.document').affix('.target').text('old document text')
|
375
|
+
up.modal.extract('.target', "<div class='target'>old modal text</div>")
|
377
376
|
|
378
|
-
|
379
|
-
|
377
|
+
u.nextFrame =>
|
378
|
+
expect($('.document .target')).toHaveText('old document text')
|
379
|
+
expect($('.up-modal .target')).toHaveText('old modal text')
|
380
380
|
|
381
|
-
|
381
|
+
$linkInModal = $('.up-modal').affix('a[href="/bar"][up-target=".target"]')
|
382
|
+
Trigger.clickSequence($linkInModal)
|
382
383
|
|
383
|
-
|
384
|
+
u.nextFrame =>
|
385
|
+
@respondWith '<div class="target">new text from modal link</div>'
|
384
386
|
|
385
|
-
|
386
|
-
|
387
|
+
expect($('.document .target')).toHaveText('old document text')
|
388
|
+
expect($('.up-modal .target')).toHaveText('new text from modal link')
|
387
389
|
|
388
|
-
|
389
|
-
|
390
|
-
|
390
|
+
done()
|
391
|
+
|
392
|
+
describe 'with [up-layer] modifier', ->
|
393
|
+
|
394
|
+
it 'allows to name a layer for the update', (done) ->
|
395
|
+
affix('.document').affix('.target').text('old document text')
|
396
|
+
up.modal.extract('.target', "<div class='target'>old modal text</div>", sticky: true)
|
391
397
|
|
392
398
|
u.nextFrame =>
|
393
|
-
|
394
|
-
expect($('.
|
395
|
-
|
399
|
+
expect($('.document .target')).toHaveText('old document text')
|
400
|
+
expect($('.up-modal .target')).toHaveText('old modal text')
|
401
|
+
|
402
|
+
$linkInModal = $('.up-modal').affix('a[href="/bar"][up-target=".target"][up-layer="page"]')
|
403
|
+
Trigger.clickSequence($linkInModal)
|
404
|
+
|
405
|
+
u.nextFrame =>
|
406
|
+
@respondWith '<div class="target">new text from modal link</div>'
|
407
|
+
|
408
|
+
expect($('.document .target')).toHaveText('new text from modal link')
|
409
|
+
expect($('.up-modal .target')).toHaveText('old modal text')
|
410
|
+
|
411
|
+
done()
|
412
|
+
|
413
|
+
it 'ignores [up-layer] if the server responds with a non-200 status code', (done) ->
|
414
|
+
affix('.document').affix('.target').text('old document text')
|
415
|
+
up.modal.extract('.target', "<div class='target'>old modal text</div>", sticky: true)
|
416
|
+
|
417
|
+
u.nextFrame =>
|
418
|
+
expect($('.document .target')).toHaveText('old document text')
|
419
|
+
expect($('.up-modal .target')).toHaveText('old modal text')
|
420
|
+
|
421
|
+
$linkInModal = $('.up-modal').affix('a[href="/bar"][up-target=".target"][up-fail-target=".target"][up-layer="page"]')
|
422
|
+
Trigger.clickSequence($linkInModal)
|
423
|
+
|
424
|
+
u.nextFrame =>
|
425
|
+
@respondWith
|
426
|
+
responseText: '<div class="target">new failure text from modal link</div>'
|
427
|
+
status: 500
|
428
|
+
|
429
|
+
expect($('.document .target')).toHaveText('old document text')
|
430
|
+
expect($('.up-modal .target')).toHaveText('new failure text from modal link')
|
431
|
+
|
432
|
+
done()
|
433
|
+
|
434
|
+
it 'allows to name a layer for a non-200 response using an [up-fail-layer] modifier', (done) ->
|
435
|
+
affix('.document').affix('.target').text('old document text')
|
436
|
+
up.modal.extract('.target', "<div class='target'>old modal text</div>", sticky: true)
|
437
|
+
|
438
|
+
u.nextFrame =>
|
439
|
+
expect($('.document .target')).toHaveText('old document text')
|
440
|
+
expect($('.up-modal .target')).toHaveText('old modal text')
|
441
|
+
|
442
|
+
$linkInModal = $('.up-modal').affix('a[href="/bar"][up-target=".target"][up-fail-target=".target"][up-fail-layer="page"]')
|
443
|
+
Trigger.clickSequence($linkInModal)
|
444
|
+
|
445
|
+
u.nextFrame =>
|
446
|
+
@respondWith
|
447
|
+
responseText: '<div class="target">new failure text from modal link</div>'
|
448
|
+
status: 500
|
449
|
+
|
450
|
+
expect($('.document .target')).toHaveText('new failure text from modal link')
|
451
|
+
expect($('.up-modal .target')).toHaveText('old modal text')
|
452
|
+
|
453
|
+
done()
|
396
454
|
|
397
455
|
describe 'with [up-fail-target] modifier', ->
|
398
456
|
|
@@ -28,7 +28,7 @@ describe 'up.syntax', ->
|
|
28
28
|
up.destroy('.container')
|
29
29
|
expect(destructor).toHaveBeenCalled()
|
30
30
|
|
31
|
-
it 'allows compilers to return an array of functions to
|
31
|
+
it 'allows compilers to return an array of functions to all when the compiled element is destroyed', ->
|
32
32
|
destructor1 = jasmine.createSpy('destructor1')
|
33
33
|
destructor2 = jasmine.createSpy('destructor2')
|
34
34
|
up.compiler '.child', ($element) ->
|
@@ -688,6 +688,40 @@ describe 'up.util', ->
|
|
688
688
|
array = [1, [2, [3,4]], 5]
|
689
689
|
expect(u.flatten(array)).toEqual([1, 2, [3, 4], 5])
|
690
690
|
|
691
|
+
describe 'up.util.renameKey', ->
|
692
|
+
|
693
|
+
it 'renames a key in the given property', ->
|
694
|
+
object = { a: 'a value', b: 'b value'}
|
695
|
+
u.renameKey(object, 'a', 'c')
|
696
|
+
expect(object.a).toBeUndefined()
|
697
|
+
expect(object.b).toBe('b value')
|
698
|
+
expect(object.c).toBe('a value')
|
699
|
+
|
700
|
+
describe 'up.util.findWithSelf', ->
|
701
|
+
|
702
|
+
it 'finds the selector in descendants of the given element', ->
|
703
|
+
$container = affix('div')
|
704
|
+
$child1 = $container.affix('div.match')
|
705
|
+
$child2 = $container.affix('div')
|
706
|
+
$child2Child1 = $child2.affix('div.match')
|
707
|
+
matches = u.findWithSelf($container, '.match')
|
708
|
+
expect(matches).toEqual [$child1.get(0), $child2Child1.get(0)]
|
709
|
+
|
710
|
+
it 'finds the element itself if the element matches the given selector', ->
|
711
|
+
$container = affix('div.match')
|
712
|
+
$child1 = $container.affix('div')
|
713
|
+
$child1Child1 = $child1.affix('div.match')
|
714
|
+
matches = u.findWithSelf($container, '.match')
|
715
|
+
expect(matches).toEqual [$container.get(0), $child1Child1.get(0)]
|
716
|
+
|
717
|
+
it 'returns multiple matches in the same subtree', ->
|
718
|
+
$container = affix('div.match')
|
719
|
+
$child1 = $container.affix('div')
|
720
|
+
$child2 = $container.affix('div.match')
|
721
|
+
$child2Child1 = $child2.affix('div.match')
|
722
|
+
matches = u.findWithSelf($container, '.match')
|
723
|
+
expect(matches).toEqual [$container.get(0), $child2.get(0), $child2Child1.get(0)]
|
724
|
+
|
691
725
|
describe 'up.util.memoize', ->
|
692
726
|
|
693
727
|
it 'returns a function that calls the memoized function', ->
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unpoly-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.37.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henning Koch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -157,6 +157,7 @@ files:
|
|
157
157
|
- spec_app/app/controllers/form_test/basics_controller.rb
|
158
158
|
- spec_app/app/controllers/form_test/uploads_controller.rb
|
159
159
|
- spec_app/app/controllers/pages_controller.rb
|
160
|
+
- spec_app/app/controllers/replace_test_controller.rb
|
160
161
|
- spec_app/app/helpers/application_helper.rb
|
161
162
|
- spec_app/app/mailers/.keep
|
162
163
|
- spec_app/app/models/concerns/.keep
|
@@ -173,6 +174,9 @@ files:
|
|
173
174
|
- spec_app/app/views/form_test/uploads/new.erb
|
174
175
|
- spec_app/app/views/layouts/integration_test.erb
|
175
176
|
- spec_app/app/views/pages/start.erb
|
177
|
+
- spec_app/app/views/replace_test/_nav.erb
|
178
|
+
- spec_app/app/views/replace_test/page1.erb
|
179
|
+
- spec_app/app/views/replace_test/page2.erb
|
176
180
|
- spec_app/bin/bundle
|
177
181
|
- spec_app/bin/rails
|
178
182
|
- spec_app/bin/rake
|