unpoly-rails 0.28.1 → 0.29.0
Sign up to get free protection for your applications and to get access to all the features.
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
@@ -2,28 +2,40 @@
|
|
2
2
|
Modal dialogs
|
3
3
|
=============
|
4
4
|
|
5
|
-
Instead of [linking to a page fragment](/up.link), you can choose
|
6
|
-
|
7
|
-
open in the background and reappear once the modal is closed.
|
5
|
+
Instead of [linking to a page fragment](/up.link), you can choose to show a fragment
|
6
|
+
in a modal dialog. The existing page will remain open in the background.
|
8
7
|
|
9
|
-
To open a modal, add an [`up-modal`
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
To open a modal, add an [`up-modal`](/up-modal) attribute to a link:
|
9
|
+
|
10
|
+
<a href="/blogs" up-modal=".blog-list">Switch blog</a>
|
11
|
+
|
12
|
+
When this link is clicked, Unpoly will request the path `/blogs` and extract
|
13
|
+
an element matching the selector `.blog-list` from the response. The matching element
|
14
|
+
will then be placed in a modal dialog.
|
15
|
+
|
16
|
+
|
17
|
+
\#\#\# Closing behavior
|
18
|
+
|
19
|
+
By default the dialog automatically closes
|
20
|
+
*when a link inside a modal changes a fragment behind the modal*.
|
21
|
+
This is useful to have the dialog interact with the page that
|
22
|
+
opened it, e.g. by updating parts of a larger form or by signing in a user
|
23
|
+
and revealing additional information.
|
24
|
+
|
25
|
+
To disable this behavior, give the opening link an [`up-sticky`](/up-modal#up-sticky) attribute:
|
14
26
|
|
15
27
|
|
16
|
-
|
28
|
+
\#\#\# Customizing the dialog design
|
17
29
|
|
18
|
-
|
30
|
+
Dialogs have a minimal default design:
|
19
31
|
|
20
|
-
-
|
21
|
-
- There is a a subtle box shadow around the dialog
|
32
|
+
- Contents are displayed in a white box with a subtle box shadow
|
22
33
|
- The box will grow to fit the dialog contents, but never grow larger than the screen
|
23
|
-
- The box is placed over a semi-transparent
|
34
|
+
- The box is placed over a semi-transparent backdrop to dim the rest of the page
|
24
35
|
- There is a button to close the dialog in the top-right corner
|
25
36
|
|
26
|
-
The easiest way to change how the dialog looks is by overriding the
|
37
|
+
The easiest way to change how the dialog looks is by overriding the
|
38
|
+
[default CSS styles](https://github.com/unpoly/unpoly/blob/master/lib/assets/stylesheets/up/modal.css.sass).
|
27
39
|
|
28
40
|
By default the dialog uses the following DOM structure:
|
29
41
|
|
@@ -32,28 +44,15 @@ By default the dialog uses the following DOM structure:
|
|
32
44
|
<div class="up-modal-viewport">
|
33
45
|
<div class="up-modal-dialog">
|
34
46
|
<div class="up-modal-content">
|
35
|
-
|
47
|
+
<!-- the matching element will be placed here -->
|
36
48
|
</div>
|
37
49
|
<div class="up-modal-close" up-close>X</div>
|
38
50
|
</div>
|
39
51
|
</div>
|
40
52
|
</div>
|
41
53
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
\#\#\#\# Closing behavior
|
47
|
-
|
48
|
-
By default the dialog automatically closes
|
49
|
-
*when a link inside a modal changes a fragment behind the modal*.
|
50
|
-
This is useful to have the dialog interact with the page that
|
51
|
-
opened it, e.g. by updating parts of a larger form or by signing in a user
|
52
|
-
and revealing additional information.
|
53
|
-
|
54
|
-
To disable this behavior, give the opening link an `up-sticky` attribute:
|
55
|
-
|
56
|
-
<a href="/settings" up-modal=".options" up-sticky>Settings</a>
|
54
|
+
You can change this structure by setting [`up.modal.config.template`](/up.modal.config#config.template) to a new template string
|
55
|
+
or function.
|
57
56
|
|
58
57
|
|
59
58
|
@class up.modal
|
@@ -69,7 +68,7 @@ up.modal = (($) ->
|
|
69
68
|
@param {String} [config.history=true]
|
70
69
|
Whether opening a modal will add a browser history entry.
|
71
70
|
@param {Number} [config.width]
|
72
|
-
The width of the dialog as a CSS value like `'400px'` or `50
|
71
|
+
The width of the dialog as a CSS value like `'400px'` or `'50%'`.
|
73
72
|
|
74
73
|
Defaults to `undefined`, meaning that the dialog will grow to fit its contents
|
75
74
|
until it reaches `config.maxWidth`. Leaving this as `undefined` will
|
@@ -562,7 +561,7 @@ up.modal = (($) ->
|
|
562
561
|
###*
|
563
562
|
Register a new modal variant with its own default configuration, CSS or HTML template.
|
564
563
|
|
565
|
-
|
564
|
+
\#\#\# Example
|
566
565
|
|
567
566
|
Let's implement a drawer that slides in from the right:
|
568
567
|
|
@@ -670,11 +669,12 @@ up.modal = (($) ->
|
|
670
669
|
|
671
670
|
# Close the modal when someone clicks outside the dialog
|
672
671
|
# (but not on a modal opener).
|
673
|
-
up.on('click',
|
672
|
+
up.on('click', (event) ->
|
674
673
|
return unless state.closable
|
675
674
|
|
676
675
|
$target = $(event.target)
|
677
676
|
unless $target.closest('.up-modal-dialog').length || $target.closest('[up-modal]').length
|
677
|
+
up.bus.consumeAction(event)
|
678
678
|
closeAsap()
|
679
679
|
)
|
680
680
|
|
@@ -706,10 +706,11 @@ up.modal = (($) ->
|
|
706
706
|
up.on('click', '[up-close]', (event, $element) ->
|
707
707
|
if contains($element)
|
708
708
|
closeAsap()
|
709
|
-
#
|
710
|
-
#
|
711
|
-
#
|
712
|
-
|
709
|
+
# If the user closes the modal by clicking on the background, we want to halt the event chain here.
|
710
|
+
# The event should not trigger anything else. The user needs to click again for another interaction.
|
711
|
+
# Also only prevent the default when we actually closed a modal.
|
712
|
+
# This way we can have buttons that close a modal when within a modal, but link to a destination if not.
|
713
|
+
up.bus.consumeAction(event)
|
713
714
|
)
|
714
715
|
|
715
716
|
# The framework is reset between tests
|
@@ -2,35 +2,32 @@
|
|
2
2
|
Animation
|
3
3
|
=========
|
4
4
|
|
5
|
-
Whenever you update a page fragment
|
6
|
-
[`up.replace`](/up.replace) or UJS attributes like [`up-target`](/up-target))
|
7
|
-
you can animate the change.
|
5
|
+
Whenever you [update a page fragment](/up-link) you can animate the change.
|
8
6
|
|
9
|
-
|
10
|
-
from the server
|
11
|
-
to smoothly fade out the old
|
7
|
+
Let's say you are using an [`up-target`](/a-up-target) link to update an element
|
8
|
+
with content from the server. You can add an attribute [`up-transition`](/a-up-target#up-transition)
|
9
|
+
to smoothly fade out the old element while fading in the new element:
|
12
10
|
|
13
11
|
<a href="/users" up-target=".list" up-transition="cross-fade">Show users</a>
|
14
12
|
|
15
|
-
Transitions vs. animations
|
16
|
-
--------------------------
|
13
|
+
\#\#\# Transitions vs. animations
|
17
14
|
|
18
|
-
When we morph between an old
|
15
|
+
When we morph between an old and a new element, we call it a *transition*.
|
19
16
|
In contrast, when we animate a new element without simultaneously removing an
|
20
17
|
old element, we call it an *animation*.
|
21
18
|
|
22
|
-
An example for an animation is opening a new dialog
|
23
|
-
|
19
|
+
An example for an animation is opening a new dialog. We can animate the appearance
|
20
|
+
of the dialog by adding an [`up-animation`](/up-modal#up-animation) attribute to the opening link:
|
24
21
|
|
25
22
|
<a href="/users" up-modal=".list" up-animation="move-from-top">Show users</a>
|
26
23
|
|
27
|
-
|
28
|
-
-------------------------------------
|
24
|
+
\#\#\# Which animations are available?
|
29
25
|
|
30
|
-
Unpoly ships with a number of predefined
|
31
|
-
and [
|
32
|
-
|
33
|
-
|
26
|
+
Unpoly ships with a number of [predefined transitions](/up.morph#named-transitions)
|
27
|
+
and [predefined animations](/up.animate#named-animations).
|
28
|
+
|
29
|
+
You can define custom animations using [`up.transition`](/up.transition) and
|
30
|
+
[`up.animation`](/up.animation).
|
34
31
|
|
35
32
|
@class up.motion
|
36
33
|
###
|
@@ -95,7 +92,7 @@ up.motion = (($) ->
|
|
95
92
|
###*
|
96
93
|
Applies the given animation to the given element.
|
97
94
|
|
98
|
-
|
95
|
+
\#\#\# Example
|
99
96
|
|
100
97
|
up.animate('.warning', 'fade-in');
|
101
98
|
|
@@ -107,7 +104,7 @@ up.motion = (($) ->
|
|
107
104
|
easing: 'linear'
|
108
105
|
});
|
109
106
|
|
110
|
-
|
107
|
+
\#\#\# Named animations
|
111
108
|
|
112
109
|
The following animations are pre-defined:
|
113
110
|
|
@@ -125,7 +122,7 @@ up.motion = (($) ->
|
|
125
122
|
|
126
123
|
You can define additional named animations using [`up.animation`](/up.animation).
|
127
124
|
|
128
|
-
|
125
|
+
\#\#\# Animating CSS properties directly
|
129
126
|
|
130
127
|
By passing an object instead of an animation name, you can animate
|
131
128
|
the CSS properties of the given element:
|
@@ -134,7 +131,7 @@ up.motion = (($) ->
|
|
134
131
|
$warning.css({ opacity: 0 });
|
135
132
|
up.animate($warning, { opacity: 1 });
|
136
133
|
|
137
|
-
|
134
|
+
\#\#\# Multiple animations on the same element
|
138
135
|
|
139
136
|
Unpoly doesn't allow more than one concurrent animation on the same element.
|
140
137
|
|
@@ -312,7 +309,7 @@ up.motion = (($) ->
|
|
312
309
|
Note that the transition does not remove any elements from the DOM.
|
313
310
|
The first element will remain in the DOM, albeit hidden using `display: none`.
|
314
311
|
|
315
|
-
|
312
|
+
\#\#\# Named transitions
|
316
313
|
|
317
314
|
The following transitions are pre-defined:
|
318
315
|
|
@@ -331,7 +328,7 @@ up.motion = (($) ->
|
|
331
328
|
- `move-to-bottom/fade-in`
|
332
329
|
- `move-to-left/move-from-top`
|
333
330
|
|
334
|
-
|
331
|
+
\#\#\# Implementation details
|
335
332
|
|
336
333
|
During a transition both the old and new element occupy
|
337
334
|
the same position on the screen.
|
@@ -2,12 +2,36 @@
|
|
2
2
|
Navigation bars
|
3
3
|
===============
|
4
4
|
|
5
|
-
Unpoly automatically
|
6
|
-
|
7
|
-
to the current location (
|
5
|
+
Unpoly automatically adds CSS classes to links while they are
|
6
|
+
currently loading ([`.up-active`](/up-active)) or
|
7
|
+
pointing to the current location ([`.up-current`](/up-current)).
|
8
|
+
|
9
|
+
By styling these classes with CSS you can provide instant feedback to user interactions.
|
10
|
+
This improves the perceived speed of your interface.
|
11
|
+
|
12
|
+
\#\#\# Example
|
13
|
+
|
14
|
+
Let's say we have an navigation bar with two links, pointing to `/foo` and `/bar` respectively:
|
15
|
+
|
16
|
+
<a href="/foo" up-follow>Foo</a>
|
17
|
+
<a href="/bar" up-follow>Bar</a>
|
18
|
+
|
19
|
+
If the current URL is `/foo`, the first link is automatically marked with an [`up-current`](/up-current) class:
|
20
|
+
|
21
|
+
<a href="/foo" up-follow class="up-current">Foo</a>
|
22
|
+
<a href="/bar" up-follow>Bar</a>
|
23
|
+
|
24
|
+
When the user clicks on the `/bar` link, the link will receive the [`up-active`](/up-active) class while it is waiting
|
25
|
+
for the server to respond:
|
26
|
+
|
27
|
+
<a href="/foo" up-follow class="up-current">Foo</a>
|
28
|
+
<a href="/bar" up-follow class="up-active">Bar</a>
|
29
|
+
|
30
|
+
Once the response is received the URL will change to `/bar` and the `up-active` class is removed:
|
31
|
+
|
32
|
+
<a href="/foo" up-follow>Foo</a>
|
33
|
+
<a href="/bar" up-follow class="up-current">Bar</a>
|
8
34
|
|
9
|
-
This dramatically improves the perceived speed of your user interface
|
10
|
-
by providing instant feedback for user interactions.
|
11
35
|
|
12
36
|
@class up.navigation
|
13
37
|
###
|
@@ -96,20 +120,64 @@ up.navigation = (($) ->
|
|
96
120
|
$section.removeClass(klass)
|
97
121
|
|
98
122
|
###*
|
99
|
-
@function
|
123
|
+
@function findActionableArea
|
100
124
|
@param {String|Element|jQuery} elementOrSelector
|
101
|
-
@param {Boolean} options.enlarge
|
102
|
-
If `true`, tries to find a containing link that has expanded the link's click area.
|
103
|
-
If we find one, we prefer to mark the larger area as active.
|
104
125
|
@internal
|
105
126
|
###
|
106
|
-
|
127
|
+
findActionableArea = (elementOrSelector) ->
|
107
128
|
$area = $(elementOrSelector)
|
108
|
-
|
109
|
-
|
110
|
-
u.presence($area.parent(SELECTOR_SECTION)) || $area
|
111
|
-
|
112
|
-
|
129
|
+
if $area.is(SELECTOR_SECTION)
|
130
|
+
# Try to enlarge links that are expanded with [up-expand] on a surrounding container.
|
131
|
+
$area = u.presence($area.parent(SELECTOR_SECTION)) || $area
|
132
|
+
$area
|
133
|
+
|
134
|
+
###*
|
135
|
+
Marks the given element as currently loading, by assigning the CSS class [`up-active`](/up-active).
|
136
|
+
|
137
|
+
This happens automatically when following links or submitting forms through the Unpoly API.
|
138
|
+
Use this function if you make custom network calls from your own Javascript code.
|
139
|
+
|
140
|
+
If the given element is a link within an [expanded click area](/up-expand),
|
141
|
+
the class will be assigned to the expanded area.
|
142
|
+
|
143
|
+
\#\#\# Example
|
144
|
+
|
145
|
+
var $button = $('button');
|
146
|
+
$button.on('click', function() {
|
147
|
+
up.navigation.start($button);
|
148
|
+
up.ajax(...).always(function() {
|
149
|
+
up.navigation.stop($button);
|
150
|
+
});
|
151
|
+
});
|
152
|
+
|
153
|
+
Or shorter:
|
154
|
+
|
155
|
+
var $button = $('button');
|
156
|
+
$button.on('click', function() {
|
157
|
+
up.navigation.start($button, function() {
|
158
|
+
up.ajax(...);
|
159
|
+
});
|
160
|
+
});
|
161
|
+
|
162
|
+
@method up.navigation.start
|
163
|
+
@param {Element|jQuery|String} elementOrSelector
|
164
|
+
The element to mark as active
|
165
|
+
@param {Function} [action]
|
166
|
+
An optional function to run while the element is marked as loading.
|
167
|
+
The function must return a promise.
|
168
|
+
Once the promise resolves, the element will be [marked as no longer loading](/up.navigation.stop).
|
169
|
+
@internal
|
170
|
+
###
|
171
|
+
start = (elementOrSelector, action) ->
|
172
|
+
$element = findActionableArea(elementOrSelector)
|
173
|
+
$element.addClass(CLASS_ACTIVE)
|
174
|
+
if action
|
175
|
+
promise = action()
|
176
|
+
if u.isPromise(promise)
|
177
|
+
promise.always -> stop($element)
|
178
|
+
else
|
179
|
+
up.warn('Expected block to return a promise, but got %o', promise)
|
180
|
+
promise
|
113
181
|
|
114
182
|
###*
|
115
183
|
Links that are currently loading are assigned the `up-active`
|
@@ -119,7 +187,7 @@ up.navigation = (($) ->
|
|
119
187
|
The `up-active` class will be removed as soon as another
|
120
188
|
page fragment is added or updated through Unpoly.
|
121
189
|
|
122
|
-
|
190
|
+
\#\#\# Example
|
123
191
|
|
124
192
|
We have a link:
|
125
193
|
|
@@ -138,25 +206,22 @@ up.navigation = (($) ->
|
|
138
206
|
@selector .up-active
|
139
207
|
@stable
|
140
208
|
###
|
141
|
-
markActive = (elementOrSelector, options) ->
|
142
|
-
$element = findClickArea(elementOrSelector, options)
|
143
|
-
$element.addClass(CLASS_ACTIVE)
|
144
209
|
|
145
|
-
|
146
|
-
|
147
|
-
|
210
|
+
###*
|
211
|
+
Marks the given element as no longer loading, by removing the CSS class [`up-active`](/up-active).
|
212
|
+
|
213
|
+
This happens automatically when network requests initiated by the Unpoly API have completed.
|
214
|
+
Use this function if you make custom network calls from your own Javascript code.
|
148
215
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
up.warn('Expected block to return a promise, but got %o', promise)
|
159
|
-
promise
|
216
|
+
@function up.navigation.stop
|
217
|
+
@param {jQuery} event.$element
|
218
|
+
The link or form that has finished loading.
|
219
|
+
@internal
|
220
|
+
###
|
221
|
+
stop = (elementOrSelector) ->
|
222
|
+
$element = findActionableArea(elementOrSelector)
|
223
|
+
up.emit('up:navigated', $element: $element, message: false)
|
224
|
+
$element.removeClass(CLASS_ACTIVE)
|
160
225
|
|
161
226
|
###*
|
162
227
|
Links that point to the current location are assigned
|
@@ -176,7 +241,7 @@ up.navigation = (($) ->
|
|
176
241
|
<a href="/bar">Bar</a>
|
177
242
|
</nav>
|
178
243
|
|
179
|
-
|
244
|
+
\#\#\# What's considered to be "current"?
|
180
245
|
|
181
246
|
The current location is considered to be either:
|
182
247
|
|
@@ -222,8 +287,7 @@ up.navigation = (($) ->
|
|
222
287
|
|
223
288
|
config: config
|
224
289
|
defaults: -> up.fail('up.navigation.defaults(...) no longer exists. Set values on he up.navigation.config property instead.')
|
225
|
-
|
226
|
-
|
227
|
-
withActiveMark: withActiveMark
|
290
|
+
start: start
|
291
|
+
stop: stop
|
228
292
|
|
229
293
|
)(jQuery)
|
@@ -10,7 +10,7 @@ or call the Javascript function [`up.popup.attach`](/up.popup.attach).
|
|
10
10
|
|
11
11
|
For modal dialogs see [up.modal](/up.modal) instead.
|
12
12
|
|
13
|
-
|
13
|
+
\#\#\# Customizing the popup design
|
14
14
|
|
15
15
|
Loading the Unpoly stylesheet will give you a minimal popup design:
|
16
16
|
|
@@ -26,7 +26,7 @@ By default the popup uses the following DOM structure:
|
|
26
26
|
...
|
27
27
|
</div>
|
28
28
|
|
29
|
-
|
29
|
+
\#\#\# Closing behavior
|
30
30
|
|
31
31
|
The popup closes when the user clicks anywhere outside the popup area.
|
32
32
|
|
@@ -176,14 +176,22 @@ up.popup = (($) ->
|
|
176
176
|
Emits events [`up:popup:open`](/up:popup:open) and [`up:popup:opened`](/up:popup:opened).
|
177
177
|
|
178
178
|
@function up.popup.attach
|
179
|
-
@param {Element|jQuery|String}
|
179
|
+
@param {Element|jQuery|String} anchor
|
180
|
+
The element to which the popup will be attached.
|
180
181
|
@param {String} [options.url]
|
182
|
+
The URL from which to fetch the popup contents.
|
183
|
+
|
184
|
+
If omitted, the `href` or `up-href` attribute of the anchor element will be used.
|
185
|
+
|
186
|
+
Will be ignored if `options.html` is given.
|
181
187
|
@param {String} [options.target]
|
182
188
|
A CSS selector that will be extracted from the response and placed into the popup.
|
183
189
|
@param {String} [options.position='bottom-right']
|
184
190
|
Defines where the popup is attached to the opening element.
|
185
191
|
|
186
192
|
Valid values are `bottom-right`, `bottom-left`, `top-right` and `top-left`.
|
193
|
+
@param {String} [options.html]
|
194
|
+
A string of HTML from which to extract the popup contents. No network request will be made.
|
187
195
|
@param {String} [options.confirm]
|
188
196
|
A message that will be displayed in a cancelable confirmation dialog
|
189
197
|
before the modal is being opened.
|
@@ -382,29 +390,30 @@ up.popup = (($) ->
|
|
382
390
|
|
383
391
|
@stable
|
384
392
|
###
|
385
|
-
up.link.onAction
|
393
|
+
up.link.onAction '[up-popup]', ($link) ->
|
386
394
|
if $link.is('.up-current')
|
387
395
|
closeAsap()
|
388
396
|
else
|
389
397
|
attachAsap($link)
|
390
|
-
)
|
391
398
|
|
392
|
-
#
|
393
|
-
#
|
394
|
-
|
399
|
+
# We close the popup when someone clicks on the document.
|
400
|
+
# We also need to listen to up:action:consumed in case an [up-instant] link
|
401
|
+
# was followed on mousedown.
|
402
|
+
up.on 'click up:action:consumed', (event) ->
|
395
403
|
$target = $(event.target)
|
404
|
+
# Don't close when the user clicked on a popup opener.
|
396
405
|
unless $target.closest('.up-popup, [up-popup]').length
|
397
406
|
closeAsap()
|
398
|
-
|
399
|
-
|
400
|
-
|
407
|
+
# Do not halt the event chain here. The user is allowed to directly activate
|
408
|
+
# a link in the background, even with a (now closing) popup open.
|
409
|
+
|
410
|
+
up.on 'up:fragment:inserted', (event, $fragment) ->
|
401
411
|
if contains($fragment)
|
402
412
|
if newSource = $fragment.attr('up-source')
|
403
413
|
state.url = newSource
|
404
414
|
else if contains(event.origin)
|
405
415
|
autoclose()
|
406
|
-
|
407
|
-
|
416
|
+
|
408
417
|
# Close the pop-up overlay when the user presses ESC.
|
409
418
|
up.bus.onEscape(closeAsap)
|
410
419
|
|
@@ -422,14 +431,13 @@ up.popup = (($) ->
|
|
422
431
|
@selector [up-close]
|
423
432
|
@stable
|
424
433
|
###
|
425
|
-
up.on
|
434
|
+
up.on 'click', '[up-close]', (event, $element) ->
|
426
435
|
if contains($element)
|
427
436
|
closeAsap()
|
428
437
|
# Only prevent the default when we actually closed a popup.
|
429
438
|
# This way we can have buttons that close a popup when within a popup,
|
430
439
|
# but link to a destination if not.
|
431
|
-
|
432
|
-
)
|
440
|
+
up.bus.consumeAction(event)
|
433
441
|
|
434
442
|
# The framework is reset between tests
|
435
443
|
up.on 'up:framework:reset', reset
|