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
@@ -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
|