upjs-rails 0.12.5 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rdoc_options +23 -0
- data/CHANGELOG.md +20 -0
- data/design/up-validate.js.coffee +284 -0
- data/dist/up-bootstrap.js +4 -0
- data/dist/up-bootstrap.min.js +1 -1
- data/dist/up.js +547 -102
- data/dist/up.min.js +2 -2
- data/lib/assets/javascripts/up/browser.js.coffee +3 -2
- data/lib/assets/javascripts/up/flow.js.coffee +95 -17
- data/lib/assets/javascripts/up/form.js.coffee +327 -34
- data/lib/assets/javascripts/up/history.js.coffee +1 -1
- data/lib/assets/javascripts/up/layout.js.coffee +4 -4
- data/lib/assets/javascripts/up/link.js.coffee +5 -2
- data/lib/assets/javascripts/up/modal.js.coffee +1 -0
- data/lib/assets/javascripts/up/proxy.js.coffee +27 -12
- data/lib/assets/javascripts/up/syntax.js.coffee +39 -20
- data/lib/assets/javascripts/up/util.js.coffee +29 -12
- data/lib/assets/javascripts/up-bootstrap/form-ext.js.coffee +1 -0
- data/lib/upjs/rails/engine.rb +1 -1
- data/lib/upjs/rails/inspector.rb +63 -0
- data/lib/upjs/rails/inspector_accessor.rb +28 -0
- data/lib/upjs/rails/request_echo_headers.rb +7 -0
- data/lib/upjs/rails/request_method_cookie.rb +12 -4
- data/lib/upjs/rails/version.rb +5 -1
- data/lib/upjs-rails.rb +7 -5
- data/spec_app/.rspec +2 -0
- data/spec_app/Gemfile +0 -3
- data/spec_app/Gemfile.lock +43 -44
- data/spec_app/app/assets/stylesheets/application.css +1 -1
- data/spec_app/app/controllers/test_controller.rb +23 -0
- data/spec_app/config/routes.rb +2 -0
- data/spec_app/spec/controllers/test_controller_spec.rb +67 -0
- data/spec_app/spec/javascripts/helpers/append_fixture.js.coffee +8 -0
- data/spec_app/spec/javascripts/helpers/last_request.js.coffee +18 -0
- data/spec_app/spec/javascripts/helpers/reset_path.js.coffee +1 -0
- data/spec_app/spec/javascripts/up/flow_spec.js.coffee +93 -43
- data/spec_app/spec/javascripts/up/form_spec.js.coffee +80 -18
- data/spec_app/spec/javascripts/up/history_spec.js.coffee +1 -5
- data/spec_app/spec/javascripts/up/link_spec.js.coffee +18 -17
- data/spec_app/spec/javascripts/up/modal_spec.js.coffee +32 -37
- data/spec_app/spec/javascripts/up/navigation_spec.js.coffee +7 -26
- data/spec_app/spec/javascripts/up/popup_spec.js.coffee +1 -7
- data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +26 -25
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +23 -0
- data/spec_app/spec/spec_helper.rb +62 -0
- metadata +12 -3
- data/lib/upjs/rails/request_ext.rb +0 -13
@@ -21,66 +21,121 @@ describe 'up.flow', ->
|
|
21
21
|
<div class="after">new-after</div>
|
22
22
|
"""
|
23
23
|
|
24
|
-
@respond = ->
|
25
|
-
@lastRequest().respondWith
|
26
|
-
status: 200
|
27
|
-
contentType: 'text/html'
|
28
|
-
responseText: @responseText
|
24
|
+
@respond = -> @respondWith(@responseText)
|
29
25
|
|
30
26
|
it 'replaces the given selector with the same selector from a freshly fetched page', (done) ->
|
31
|
-
|
27
|
+
promise = up.replace('.middle', '/path')
|
32
28
|
@respond()
|
33
|
-
|
29
|
+
promise.then ->
|
34
30
|
expect($('.before')).toHaveText('old-before')
|
35
31
|
expect($('.middle')).toHaveText('new-middle')
|
36
32
|
expect($('.after')).toHaveText('old-after')
|
37
33
|
done()
|
38
34
|
|
39
35
|
it 'should set the browser location to the given URL', (done) ->
|
40
|
-
|
36
|
+
promise = up.replace('.middle', '/path')
|
41
37
|
@respond()
|
42
|
-
|
38
|
+
promise.then ->
|
43
39
|
expect(window.location.pathname).toBe('/path')
|
44
40
|
done()
|
45
|
-
|
41
|
+
|
42
|
+
it "detects a redirect's new URL when the server sets an X-Up-Location header", (done) ->
|
43
|
+
promise = up.replace('.middle', '/path')
|
44
|
+
@respondWith(@responseText, responseHeaders: { 'X-Up-Location': '/other-path' })
|
45
|
+
promise.then ->
|
46
|
+
expect(window.location.pathname).toBe('/other-path')
|
47
|
+
done()
|
48
|
+
|
49
|
+
it 'understands non-standard CSS selector extensions such as :has(...)', (done) ->
|
50
|
+
$first = affix('.boxx#first')
|
51
|
+
$firstChild = $('<span class="first-child">old first</span>').appendTo($first)
|
52
|
+
$second = affix('.boxx#second')
|
53
|
+
$secondChild = $('<span class="second-child">old second</span>').appendTo($second)
|
54
|
+
|
55
|
+
promise = up.replace('.boxx:has(.first-child)', '/path')
|
56
|
+
@respondWith """
|
57
|
+
<div class="boxx" id="first">
|
58
|
+
<span class="first-child">new first</span>
|
59
|
+
</div>
|
60
|
+
"""
|
61
|
+
|
62
|
+
promise.then ->
|
63
|
+
expect($('#first span')).toHaveText('new first')
|
64
|
+
expect($('#second span')).toHaveText('old second')
|
65
|
+
done()
|
66
|
+
|
46
67
|
it 'marks the element with the URL from which it was retrieved', (done) ->
|
47
|
-
|
68
|
+
promise = up.replace('.middle', '/path')
|
48
69
|
@respond()
|
49
|
-
|
70
|
+
promise.then ->
|
50
71
|
expect($('.middle').attr('up-source')).toMatch(/\/path$/)
|
51
72
|
done()
|
52
73
|
|
53
74
|
it 'replaces multiple selectors separated with a comma', (done) ->
|
54
|
-
|
75
|
+
promise = up.replace('.middle, .after', '/path')
|
55
76
|
@respond()
|
56
|
-
|
77
|
+
promise.then ->
|
57
78
|
expect($('.before')).toHaveText('old-before')
|
58
79
|
expect($('.middle')).toHaveText('new-middle')
|
59
80
|
expect($('.after')).toHaveText('new-after')
|
60
81
|
done()
|
61
82
|
|
83
|
+
it 'replaces the body if asked to replace the "html" selector'
|
84
|
+
|
85
|
+
it "sets the document title to a 'title' tag in the response", ->
|
86
|
+
affix('.container').text('old container text')
|
87
|
+
up.replace('.container', '/path')
|
88
|
+
@respondWith """
|
89
|
+
<html>
|
90
|
+
<head>
|
91
|
+
<title>Title from HTML</title>
|
92
|
+
</head>
|
93
|
+
<body>
|
94
|
+
<div class='container'>
|
95
|
+
new container text
|
96
|
+
</div>
|
97
|
+
</body>
|
98
|
+
</html>
|
99
|
+
"""
|
100
|
+
expect($('.container')).toHaveText('new container text')
|
101
|
+
expect(document.title).toBe('Title from HTML')
|
102
|
+
|
103
|
+
it "sets the document title to an 'X-Up-Title' header in the response", ->
|
104
|
+
affix('.container').text('old container text')
|
105
|
+
up.replace('.container', '/path')
|
106
|
+
@respondWith
|
107
|
+
responseHeaders:
|
108
|
+
'X-Up-Title': 'Title from header'
|
109
|
+
responseText: """
|
110
|
+
<div class='container'>
|
111
|
+
new container text
|
112
|
+
</div>
|
113
|
+
"""
|
114
|
+
expect($('.container')).toHaveText('new container text')
|
115
|
+
expect(document.title).toBe('Title from header')
|
116
|
+
|
62
117
|
it 'prepends instead of replacing when the target has a :before pseudo-selector', (done) ->
|
63
|
-
|
118
|
+
promise = up.replace('.middle:before', '/path')
|
64
119
|
@respond()
|
65
|
-
|
120
|
+
promise.then ->
|
66
121
|
expect($('.before')).toHaveText('old-before')
|
67
122
|
expect($('.middle')).toHaveText('new-middleold-middle')
|
68
123
|
expect($('.after')).toHaveText('old-after')
|
69
124
|
done()
|
70
125
|
|
71
126
|
it 'appends instead of replacing when the target has a :after pseudo-selector', (done) ->
|
72
|
-
|
127
|
+
promise = up.replace('.middle:after', '/path')
|
73
128
|
@respond()
|
74
|
-
|
129
|
+
promise.then ->
|
75
130
|
expect($('.before')).toHaveText('old-before')
|
76
131
|
expect($('.middle')).toHaveText('old-middlenew-middle')
|
77
132
|
expect($('.after')).toHaveText('old-after')
|
78
133
|
done()
|
79
134
|
|
80
135
|
it "lets the developer choose between replacing/prepending/appending for each selector", (done) ->
|
81
|
-
|
136
|
+
promise = up.replace('.before:before, .middle, .after:after', '/path')
|
82
137
|
@respond()
|
83
|
-
|
138
|
+
promise.then ->
|
84
139
|
expect($('.before')).toHaveText('new-beforeold-before')
|
85
140
|
expect($('.middle')).toHaveText('new-middle')
|
86
141
|
expect($('.after')).toHaveText('old-afternew-after')
|
@@ -105,10 +160,10 @@ describe 'up.flow', ->
|
|
105
160
|
</div>
|
106
161
|
"""
|
107
162
|
|
108
|
-
|
163
|
+
promise = up.replace('.middle', '/path')
|
109
164
|
@respond()
|
110
165
|
|
111
|
-
|
166
|
+
promise.then ->
|
112
167
|
expect(window.scriptTagExecuted).not.toHaveBeenCalledWith('before')
|
113
168
|
expect(window.scriptTagExecuted).toHaveBeenCalledWith('middle')
|
114
169
|
done()
|
@@ -154,9 +209,9 @@ describe 'up.flow', ->
|
|
154
209
|
u.resolvedDeferred()
|
155
210
|
|
156
211
|
it 'reveals a new element before it is being replaced', (done) ->
|
157
|
-
|
212
|
+
promise = up.replace('.middle', '/path', reveal: true)
|
158
213
|
@respond()
|
159
|
-
|
214
|
+
promise.then =>
|
160
215
|
expect(@revealMock).not.toHaveBeenCalledWith(@oldMiddle)
|
161
216
|
expect(@revealedHTML).toContain('new-middle')
|
162
217
|
done()
|
@@ -164,7 +219,7 @@ describe 'up.flow', ->
|
|
164
219
|
describe 'when there is an anchor #hash in the URL', ->
|
165
220
|
|
166
221
|
it 'reveals a child with the ID of that #hash', (done) ->
|
167
|
-
|
222
|
+
promise = up.replace('.middle', '/path#three', reveal: true)
|
168
223
|
@responseText =
|
169
224
|
"""
|
170
225
|
<div class="middle">
|
@@ -174,12 +229,12 @@ describe 'up.flow', ->
|
|
174
229
|
</div>
|
175
230
|
"""
|
176
231
|
@respond()
|
177
|
-
|
232
|
+
promise.then =>
|
178
233
|
expect(@revealedHTML).toEqual('<div id="three">three</div>')
|
179
234
|
done()
|
180
235
|
|
181
236
|
it "reveals the entire element if it has no child with the ID of that #hash", (done) ->
|
182
|
-
|
237
|
+
promise = up.replace('.middle', '/path#four', reveal: true)
|
183
238
|
@responseText =
|
184
239
|
"""
|
185
240
|
<div class="middle">
|
@@ -187,14 +242,14 @@ describe 'up.flow', ->
|
|
187
242
|
</div>
|
188
243
|
"""
|
189
244
|
@respond()
|
190
|
-
|
245
|
+
promise.then =>
|
191
246
|
expect(@revealedHTML).toContain('new-middle')
|
192
247
|
done()
|
193
248
|
|
194
249
|
it 'reveals a new element that is being appended', (done) ->
|
195
|
-
|
250
|
+
promise = up.replace('.middle:after', '/path', reveal: true)
|
196
251
|
@respond()
|
197
|
-
|
252
|
+
promise.then =>
|
198
253
|
expect(@revealMock).not.toHaveBeenCalledWith(@oldMiddle)
|
199
254
|
# Text nodes are wrapped in a .up-insertion container so we can
|
200
255
|
# animate them and measure their position/size for scrolling.
|
@@ -205,9 +260,9 @@ describe 'up.flow', ->
|
|
205
260
|
done()
|
206
261
|
|
207
262
|
it 'reveals a new element that is being prepended', (done) ->
|
208
|
-
|
263
|
+
promise = up.replace('.middle:before', '/path', reveal: true)
|
209
264
|
@respond()
|
210
|
-
|
265
|
+
promise.then =>
|
211
266
|
expect(@revealMock).not.toHaveBeenCalledWith(@oldMiddle)
|
212
267
|
# Text nodes are wrapped in a .up-insertion container so we can
|
213
268
|
# animate them and measure their position/size for scrolling.
|
@@ -315,18 +370,13 @@ describe 'up.flow', ->
|
|
315
370
|
expect($('.element')).toHaveText('new text')
|
316
371
|
done()
|
317
372
|
|
318
|
-
|
319
|
-
expect(request.url).toMatch(/\/source$/)
|
373
|
+
expect(@lastRequest().url).toMatch(/\/source$/)
|
320
374
|
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
<div class="container">
|
327
|
-
<div class="element">new text</div>
|
328
|
-
</div>
|
329
|
-
"""
|
375
|
+
@respondWith """
|
376
|
+
<div class="container">
|
377
|
+
<div class="element">new text</div>
|
378
|
+
</div>
|
379
|
+
"""
|
330
380
|
|
331
381
|
else
|
332
382
|
|
@@ -28,19 +28,15 @@ describe 'up.form', ->
|
|
28
28
|
|
29
29
|
it 'submits the given form and replaces the target with the response', (done) ->
|
30
30
|
|
31
|
-
@
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
</div>
|
41
|
-
|
42
|
-
text-after
|
43
|
-
"""
|
31
|
+
@respondWith """
|
32
|
+
text-before
|
33
|
+
|
34
|
+
<div class="response">
|
35
|
+
new-text
|
36
|
+
</div>
|
37
|
+
|
38
|
+
text-after
|
39
|
+
"""
|
44
40
|
|
45
41
|
@promise.then ->
|
46
42
|
expect($('.response')).toHaveText('new-text')
|
@@ -96,17 +92,83 @@ describe 'up.form', ->
|
|
96
92
|
|
97
93
|
up.submit($form)
|
98
94
|
expect(form.submit).toHaveBeenCalled()
|
99
|
-
|
100
95
|
|
101
96
|
describe 'unobtrusive behavior', ->
|
102
|
-
|
97
|
+
|
103
98
|
describe 'form[up-target]', ->
|
104
99
|
|
105
100
|
it 'rigs the form to use up.submit instead of a standard submit'
|
106
101
|
|
107
|
-
|
108
102
|
describe 'input[up-observe]', ->
|
109
103
|
|
110
104
|
it 'should have tests'
|
111
|
-
|
112
|
-
|
105
|
+
|
106
|
+
describe 'input[up-validate]', ->
|
107
|
+
|
108
|
+
describe 'when a selector is given', ->
|
109
|
+
|
110
|
+
it "submits the input's form with an 'X-Up-Validate' header and replaces the selector with the response", ->
|
111
|
+
|
112
|
+
$form = affix('form[action="/path/to"]')
|
113
|
+
$group = $("""
|
114
|
+
<div class="field-group">
|
115
|
+
<input name="user" value="judy" up-validate=".field-group:has(&)">
|
116
|
+
</div>
|
117
|
+
""").appendTo($form)
|
118
|
+
$group.find('input').trigger('change')
|
119
|
+
|
120
|
+
request = @lastRequest()
|
121
|
+
expect(request.requestHeaders['X-Up-Validate']).toEqual('user')
|
122
|
+
expect(request.requestHeaders['X-Up-Selector']).toEqual(".field-group:has([name='user'])")
|
123
|
+
|
124
|
+
@respondWith """
|
125
|
+
<div class="field-group has-error">
|
126
|
+
<div class='error'>Username has already been taken</div>
|
127
|
+
<input name="user" value="judy" up-validate=".field-group:has(&)">
|
128
|
+
</div>
|
129
|
+
"""
|
130
|
+
|
131
|
+
$group = $('.field-group')
|
132
|
+
expect($group.length).toBe(1)
|
133
|
+
expect($group).toHaveClass('has-error')
|
134
|
+
expect($group).toHaveText('Username has already been taken')
|
135
|
+
|
136
|
+
describe 'when no selector is given', ->
|
137
|
+
|
138
|
+
it 'automatically finds a form group around the input field and only updates that', ->
|
139
|
+
|
140
|
+
@appendFixture """
|
141
|
+
<form action="/users" id="registration">
|
142
|
+
|
143
|
+
<label>
|
144
|
+
<input type="text" name="email" up-validate />
|
145
|
+
</label>
|
146
|
+
|
147
|
+
<label>
|
148
|
+
<input type="password" name="password" up-validate />
|
149
|
+
</label>
|
150
|
+
|
151
|
+
</form>
|
152
|
+
"""
|
153
|
+
|
154
|
+
$('#registration input[name=password]').trigger('change')
|
155
|
+
|
156
|
+
@respondWith """
|
157
|
+
<form action="/users" id="registration">
|
158
|
+
|
159
|
+
<label>
|
160
|
+
Validation message
|
161
|
+
<input type="text" name="email" up-validate />
|
162
|
+
</label>
|
163
|
+
|
164
|
+
<label>
|
165
|
+
Validation message
|
166
|
+
<input type="password" name="password" up-validate />
|
167
|
+
</label>
|
168
|
+
|
169
|
+
</form>
|
170
|
+
"""
|
171
|
+
|
172
|
+
$labels = $('#registration label')
|
173
|
+
expect($labels[0]).not.toHaveText('Validation message')
|
174
|
+
expect($labels[1]).toHaveText('Validation message')
|
@@ -44,11 +44,7 @@ describe 'up.history', ->
|
|
44
44
|
</div>
|
45
45
|
"""
|
46
46
|
|
47
|
-
respond = (
|
48
|
-
@lastRequest().respondWith
|
49
|
-
status: 200
|
50
|
-
contentType: 'text/html'
|
51
|
-
responseText: longContentHtml
|
47
|
+
respond = => @respondWith(longContentHtml)
|
52
48
|
|
53
49
|
$viewport = $(longContentHtml).appendTo(document.body)
|
54
50
|
|
@@ -16,15 +16,11 @@ describe 'up.link', ->
|
|
16
16
|
|
17
17
|
promise = up.follow($link)
|
18
18
|
|
19
|
-
@
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
<div class="before">new-before</div>
|
25
|
-
<div class="middle">new-middle</div>
|
26
|
-
<div class="after">new-after</div>
|
27
|
-
"""
|
19
|
+
@respondWith """
|
20
|
+
<div class="before">new-before</div>
|
21
|
+
<div class="middle">new-middle</div>
|
22
|
+
<div class="after">new-after</div>
|
23
|
+
"""
|
28
24
|
|
29
25
|
promise.then ->
|
30
26
|
expect($('.before')).toHaveText('old-before')
|
@@ -38,6 +34,14 @@ describe 'up.link', ->
|
|
38
34
|
request = @lastRequest()
|
39
35
|
expect(request.method).toBe('PUT')
|
40
36
|
|
37
|
+
it 'allows to refer to the link itself as "&" in the CSS selector', ->
|
38
|
+
$container = affix('div')
|
39
|
+
$link1 = $('<a id="first" href="/path" up-target="&">first-link</a>').appendTo($container)
|
40
|
+
$link2 = $('<a id="second" href="/path" up-target="&">second-link</a>').appendTo($container)
|
41
|
+
up.follow($link2)
|
42
|
+
@respondWith '<div id="second">second-div</div>'
|
43
|
+
expect($container.text()).toBe('first-linksecond-div')
|
44
|
+
|
41
45
|
it 'adds history entries and allows the user to use the back- and forward-buttons', (done) ->
|
42
46
|
|
43
47
|
# By default, up.history will replace the <body> tag when
|
@@ -108,14 +112,11 @@ describe 'up.link', ->
|
|
108
112
|
up.follow($link, options)
|
109
113
|
|
110
114
|
respond = (linkDestination) =>
|
111
|
-
@
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
<a class="link" href="#{linkDestination}" up-target=".element">Link</a>
|
117
|
-
</div>
|
118
|
-
"""
|
115
|
+
@respondWith """
|
116
|
+
<div class="element" style="height: 300px">
|
117
|
+
<a class="link" href="#{linkDestination}" up-target=".element">Link</a>
|
118
|
+
</div>
|
119
|
+
"""
|
119
120
|
|
120
121
|
up.replace('.element', '/foo')
|
121
122
|
# Provide the content at /foo with a link to /bar in the HTML
|
@@ -9,17 +9,12 @@ describe 'up.modal', ->
|
|
9
9
|
it "loads the given link's destination in a dialog window", (done) ->
|
10
10
|
$link = affix('a[href="/path/to"][up-modal=".middle"]').text('link')
|
11
11
|
promise = up.modal.follow($link)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
"""
|
19
|
-
<div class="before">new-before</div>
|
20
|
-
<div class="middle">new-middle</div>
|
21
|
-
<div class="after">new-after</div>
|
22
|
-
"""
|
12
|
+
expect(@lastRequest().url).toMatch /\/path\/to$/
|
13
|
+
@respondWith """
|
14
|
+
<div class="before">new-before</div>
|
15
|
+
<div class="middle">new-middle</div>
|
16
|
+
<div class="after">new-after</div>
|
17
|
+
"""
|
23
18
|
promise.then ->
|
24
19
|
expect($('.up-modal')).toExist()
|
25
20
|
expect($('.up-modal-dialog')).toExist()
|
@@ -34,13 +29,7 @@ describe 'up.modal', ->
|
|
34
29
|
it "brings its own scrollbar, padding the body on the right in order to prevent jumping", (done) ->
|
35
30
|
promise = up.modal.visit('/foo', target: '.container')
|
36
31
|
|
37
|
-
@
|
38
|
-
status: 200
|
39
|
-
contentType: 'text/html'
|
40
|
-
responseText:
|
41
|
-
"""
|
42
|
-
<div class="container">text</div>
|
43
|
-
"""
|
32
|
+
@respondWith('<div class="container">text</div>')
|
44
33
|
|
45
34
|
promise.then ->
|
46
35
|
|
@@ -66,13 +55,7 @@ describe 'up.modal', ->
|
|
66
55
|
|
67
56
|
promise = up.modal.visit('/foo', target: '.container')
|
68
57
|
|
69
|
-
@
|
70
|
-
status: 200
|
71
|
-
contentType: 'text/html'
|
72
|
-
responseText:
|
73
|
-
"""
|
74
|
-
<div class="container">text</div>
|
75
|
-
"""
|
58
|
+
@respondWith('<div class="container">text</div>')
|
76
59
|
|
77
60
|
promise.then ->
|
78
61
|
expect(parseInt($anchoredElement.css('right'))).toBeAround(30 + assumedScrollbarWidth, 10)
|
@@ -88,13 +71,7 @@ describe 'up.modal', ->
|
|
88
71
|
up.history.replace('/foo')
|
89
72
|
expect(up.modal.coveredUrl()).toBeUndefined()
|
90
73
|
up.modal.visit('/bar', target: '.container')
|
91
|
-
@
|
92
|
-
status: 200
|
93
|
-
contentType: 'text/html'
|
94
|
-
responseText:
|
95
|
-
"""
|
96
|
-
<div class="container">text</div>
|
97
|
-
"""
|
74
|
+
@respondWith('<div class="container">text</div>')
|
98
75
|
expect(up.modal.coveredUrl()).toEndWith('/foo')
|
99
76
|
up.modal.close().then ->
|
100
77
|
expect(up.modal.coveredUrl()).toBeUndefined()
|
@@ -103,7 +80,9 @@ describe 'up.modal', ->
|
|
103
80
|
|
104
81
|
describe 'up.modal.close', ->
|
105
82
|
|
106
|
-
it '
|
83
|
+
it 'closes a currently open modal'
|
84
|
+
|
85
|
+
it 'does nothing if no modal is open'
|
107
86
|
|
108
87
|
describe 'up.modal.source', ->
|
109
88
|
|
@@ -113,15 +92,31 @@ describe 'up.modal', ->
|
|
113
92
|
|
114
93
|
describe 'a[up-modal]', ->
|
115
94
|
|
116
|
-
it '
|
117
|
-
|
95
|
+
it 'opens the clicked link in a modal', ->
|
96
|
+
followSpy = up.modal.knife.mock('follow')
|
97
|
+
$link = affix('a[href="/path"][up-modal=".foo"]')
|
98
|
+
up.hello($link)
|
99
|
+
$link.click()
|
100
|
+
expect(followSpy).toHaveBeenCalledWith($link)
|
101
|
+
|
118
102
|
describe '[up-close]', ->
|
119
103
|
|
120
|
-
it '
|
104
|
+
it 'closes the modal when clicked', ->
|
105
|
+
closeSpy = up.modal.knife.mock('close')
|
106
|
+
$link = affix('a[up-close]')
|
107
|
+
up.hello($link)
|
108
|
+
$link.click()
|
109
|
+
expect(closeSpy).toHaveBeenCalled()
|
121
110
|
|
122
111
|
describe 'when following links inside a modal', ->
|
123
112
|
|
124
|
-
it 'prefers to replace a selector within the modal'
|
113
|
+
it 'prefers to replace a selector within the modal', ->
|
114
|
+
$outside = affix('.foo').text('old outside')
|
115
|
+
up.modal.visit('/path', target: '.foo')
|
116
|
+
@respondWith("<div class='foo'>old inside</div>")
|
117
|
+
up.flow.implant('.foo', "<div class='foo'>new text</div>")
|
118
|
+
expect($outside).toHaveText('old outside')
|
119
|
+
expect($('.up-modal-content')).toHaveText('new text')
|
125
120
|
|
126
121
|
it 'auto-closes the modal if a selector behind the modal gets replaced'
|
127
122
|
|
@@ -50,9 +50,7 @@ describe 'up.navigation', ->
|
|
50
50
|
$link = affix('a[href="/foo"][up-target=".main"]')
|
51
51
|
affix('.main')
|
52
52
|
$link.click()
|
53
|
-
@
|
54
|
-
status: 200
|
55
|
-
contentType: 'text/html'
|
53
|
+
@respondWith
|
56
54
|
responseHeaders: { 'X-Up-Location': '/foo/' }
|
57
55
|
responseText: '<div class="main">new-text</div>'
|
58
56
|
expect($link).toHaveClass('up-current')
|
@@ -61,9 +59,7 @@ describe 'up.navigation', ->
|
|
61
59
|
$link = affix('a[href="/foo/"][up-target=".main"]')
|
62
60
|
affix('.main')
|
63
61
|
$link.click()
|
64
|
-
@
|
65
|
-
status: 200
|
66
|
-
contentType: 'text/html'
|
62
|
+
@respondWith
|
67
63
|
responseHeaders: { 'X-Up-Location': '/foo' }
|
68
64
|
responseText: '<div class="main">new-text</div>'
|
69
65
|
expect($link).toHaveClass('up-current')
|
@@ -75,10 +71,7 @@ describe 'up.navigation', ->
|
|
75
71
|
$unrelatedLink = affix('a[href="/baz]')
|
76
72
|
|
77
73
|
$modalLink.click()
|
78
|
-
@
|
79
|
-
status: 200
|
80
|
-
contentType: 'text/html'
|
81
|
-
responseText: '<div class="main">new-text</div>'
|
74
|
+
@respondWith('<div class="main">new-text</div>')
|
82
75
|
expect($backgroundLink).toHaveClass('up-current')
|
83
76
|
expect($modalLink).toHaveClass('up-current')
|
84
77
|
expect($unrelatedLink).not.toHaveClass('up-current')
|
@@ -96,10 +89,7 @@ describe 'up.navigation', ->
|
|
96
89
|
$unrelatedLink = affix('a[href="/baz]')
|
97
90
|
|
98
91
|
$popupLink.click()
|
99
|
-
@
|
100
|
-
status: 200
|
101
|
-
contentType: 'text/html'
|
102
|
-
responseText: '<div class="main">new-text</div>'
|
92
|
+
@respondWith('<div class="main">new-text</div>')
|
103
93
|
expect($backgroundLink).toHaveClass('up-current')
|
104
94
|
expect($popupLink).toHaveClass('up-current')
|
105
95
|
expect($unrelatedLink).not.toHaveClass('up-current')
|
@@ -117,10 +107,7 @@ describe 'up.navigation', ->
|
|
117
107
|
affix('.main')
|
118
108
|
$link.click()
|
119
109
|
expect($link).toHaveClass('up-active')
|
120
|
-
@
|
121
|
-
status: 200
|
122
|
-
contentType: 'text/html'
|
123
|
-
responseText: '<div class="main">new-text</div>'
|
110
|
+
@respondWith('<div class="main">new-text</div>')
|
124
111
|
expect($link).not.toHaveClass('up-active')
|
125
112
|
expect($link).toHaveClass('up-current')
|
126
113
|
|
@@ -129,10 +116,7 @@ describe 'up.navigation', ->
|
|
129
116
|
affix('.main')
|
130
117
|
Trigger.mousedown($link)
|
131
118
|
expect($link).toHaveClass('up-active')
|
132
|
-
@
|
133
|
-
status: 200
|
134
|
-
contentType: 'text/html'
|
135
|
-
responseText: '<div class="main">new-text</div>'
|
119
|
+
@respondWith('<div class="main">new-text</div>')
|
136
120
|
expect($link).not.toHaveClass('up-active')
|
137
121
|
expect($link).toHaveClass('up-current')
|
138
122
|
|
@@ -143,9 +127,6 @@ describe 'up.navigation', ->
|
|
143
127
|
affix('.main')
|
144
128
|
$link.click()
|
145
129
|
expect($area).toHaveClass('up-active')
|
146
|
-
@
|
147
|
-
status: 200
|
148
|
-
contentType: 'text/html'
|
149
|
-
responseText: '<div class="main">new-text</div>'
|
130
|
+
@respondWith('<div class="main">new-text</div>')
|
150
131
|
expect($area).toHaveClass('up-current')
|
151
132
|
|
@@ -14,13 +14,7 @@ describe 'up.popup', ->
|
|
14
14
|
|
15
15
|
$popupLink = affix('a[href="/bar"][up-popup=".container"]')
|
16
16
|
$popupLink.click()
|
17
|
-
@
|
18
|
-
status: 200
|
19
|
-
contentType: 'text/html'
|
20
|
-
responseText:
|
21
|
-
"""
|
22
|
-
<div class="container">text</div>
|
23
|
-
"""
|
17
|
+
@respondWith('<div class="container">text</div>')
|
24
18
|
expect(up.popup.coveredUrl()).toEndWith('/foo')
|
25
19
|
up.popup.close().then ->
|
26
20
|
expect(up.popup.coveredUrl()).toBeUndefined()
|