unpoly-rails 0.32.0 → 0.33.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 +106 -76
- data/README.md +8 -5
- data/README_RAILS.md +1 -1
- data/design/test_rejected_promise.txt +5 -0
- data/dist/unpoly-bootstrap3.js +1 -1
- data/dist/unpoly-bootstrap3.min.js +1 -1
- data/dist/unpoly.js +814 -417
- data/dist/unpoly.min.js +3 -3
- data/lib/assets/javascripts/unpoly/{browser.js.coffee → browser.coffee} +15 -6
- data/lib/assets/javascripts/unpoly/{bus.js.coffee → bus.coffee} +13 -13
- data/lib/assets/javascripts/unpoly/dom/extract_cascade.coffee +73 -0
- data/lib/assets/javascripts/unpoly/dom/extract_plan.coffee +65 -0
- data/lib/assets/javascripts/unpoly/{flow.js.coffee → dom.coffee} +109 -114
- data/lib/assets/javascripts/unpoly/{navigation.js.coffee → feedback.coffee} +11 -11
- data/lib/assets/javascripts/unpoly/{form.js.coffee → form.coffee} +35 -24
- data/lib/assets/javascripts/unpoly/{history.js.coffee → history.coffee} +9 -10
- data/lib/assets/javascripts/unpoly/{layout.js.coffee → layout.coffee} +53 -21
- data/lib/assets/javascripts/unpoly/{link.js.coffee → link.coffee} +46 -40
- data/lib/assets/javascripts/unpoly/{log.js.coffee → log.coffee} +2 -2
- data/lib/assets/javascripts/unpoly/{modal.js.coffee → modal.coffee} +17 -14
- data/lib/assets/javascripts/unpoly/{motion.js.coffee → motion.coffee} +28 -31
- data/lib/assets/javascripts/unpoly/namespace.coffee.erb +10 -0
- data/lib/assets/javascripts/unpoly/{popup.js.coffee → popup.coffee} +22 -10
- data/lib/assets/javascripts/unpoly/{proxy.js.coffee → proxy.coffee} +34 -12
- data/lib/assets/javascripts/unpoly/{rails.js.coffee → rails.coffee} +0 -0
- data/lib/assets/javascripts/unpoly/{syntax.js.coffee → syntax.coffee} +32 -21
- data/lib/assets/javascripts/unpoly/{toast.js.coffee → toast.coffee} +0 -0
- data/lib/assets/javascripts/unpoly/{tooltip.js.coffee → tooltip.coffee} +2 -2
- data/lib/assets/javascripts/unpoly/{util.js.coffee → util.coffee} +122 -35
- data/lib/assets/javascripts/unpoly-bootstrap3/{form-ext.js.coffee → form-ext.coffee} +0 -0
- data/lib/assets/javascripts/unpoly-bootstrap3/{layout-ext.js.coffee → layout-ext.coffee} +0 -0
- data/lib/assets/javascripts/unpoly-bootstrap3/{modal-ext.js.coffee → modal-ext.coffee} +0 -0
- data/lib/assets/javascripts/unpoly-bootstrap3/{navigation-ext.js.coffee → navigation-ext.coffee} +1 -1
- data/lib/assets/javascripts/{unpoly-bootstrap3.js.coffee → unpoly-bootstrap3.coffee} +0 -0
- data/lib/assets/javascripts/unpoly.coffee +22 -0
- data/lib/assets/stylesheets/unpoly/{close.css.sass → close.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{flow.css.sass → flow.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{link.css.sass → link.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{modal.css.sass → modal.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{popup.css.sass → popup.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{toast.css.sass → toast.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{tooltip.css.sass → tooltip.sass} +0 -0
- data/lib/assets/stylesheets/unpoly-bootstrap3/{modal-ext.css.sass → modal-ext.sass} +0 -0
- data/lib/assets/stylesheets/{unpoly-bootstrap3.css.sass → unpoly-bootstrap3.sass} +0 -0
- data/lib/assets/stylesheets/{unpoly.css.sass → unpoly.sass} +0 -0
- data/lib/unpoly/rails/version.rb +1 -1
- data/package.json +1 -1
- data/spec_app/Gemfile.lock +11 -13
- data/spec_app/app/assets/javascripts/jasmine_specs.coffee +1 -1
- data/spec_app/app/assets/stylesheets/_helpers.sass +1 -1
- data/spec_app/config/initializers/assets.rb +1 -5
- data/spec_app/spec/javascripts/up/{flow_spec.js.coffee → dom_spec.js.coffee} +294 -44
- data/spec_app/spec/javascripts/up/{navigation_spec.js.coffee → feedback_spec.js.coffee} +2 -2
- data/spec_app/spec/javascripts/up/form_spec.js.coffee +1 -0
- data/spec_app/spec/javascripts/up/layout_spec.js.coffee +10 -0
- data/spec_app/spec/javascripts/up/link_spec.js.coffee +28 -0
- data/spec_app/spec/javascripts/up/modal_spec.js.coffee +46 -9
- data/spec_app/spec/javascripts/up/motion_spec.js.coffee +32 -2
- data/spec_app/spec/javascripts/up/popup_spec.js.coffee +5 -4
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +75 -0
- data/spec_app/vendor/{assets/bower_components/jasmine-ajax → asset-libs/jasmine-ajax-3.3.1}/.bower.json +0 -0
- data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.gitignore +6 -0
- data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.npmignore +10 -0
- data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.pairs +6 -0
- data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.travis.yml +56 -0
- data/spec_app/vendor/{assets/bower_components/jasmine-ajax/lib/mock-ajax.js → asset-libs/jasmine-ajax-3.3.1/jasmine-ajax.js} +83 -26
- data/spec_app/vendor/{assets/bower_components/jasmine-fixture/dist → asset-libs/jasmine-fixture-1.3.4}/jasmine-fixture.js +13 -13
- data/spec_app/vendor/{assets/bower_components/jasmine-jquery → asset-libs/jasmine-jquery-2.1.1}/.bower.json +0 -0
- data/spec_app/vendor/{assets/bower_components/jasmine-jquery/lib → asset-libs/jasmine-jquery-2.1.1}/jasmine-jquery.js +0 -0
- data/spec_app/vendor/assets/{javascripts/.keep → .keep} +0 -0
- metadata +52 -203
- data/lib/assets/javascripts/unpoly/module.js.coffee.erb +0 -8
- data/lib/assets/javascripts/unpoly.js.coffee +0 -21
- data/spec_app/Bowerfile +0 -3
- data/spec_app/vendor/assets/.bowerrc +0 -3
- data/spec_app/vendor/assets/bower.json +0 -8
- data/spec_app/vendor/assets/bower_components/jasmine/.bower.json +0 -50
- data/spec_app/vendor/assets/bower_components/jasmine/CONTRIBUTING.md +0 -130
- data/spec_app/vendor/assets/bower_components/jasmine/GOALS_2.0.md +0 -64
- data/spec_app/vendor/assets/bower_components/jasmine/MANIFEST.in +0 -5
- data/spec_app/vendor/assets/bower_components/jasmine/MIT.LICENSE +0 -20
- data/spec_app/vendor/assets/bower_components/jasmine/README.md +0 -73
- data/spec_app/vendor/assets/bower_components/jasmine/RELEASE.md +0 -73
- data/spec_app/vendor/assets/bower_components/jasmine/bower.json +0 -41
- data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine-horizontal.png +0 -0
- data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine-horizontal.svg +0 -102
- data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine_favicon.png +0 -0
- data/spec_app/vendor/assets/bower_components/jasmine/lib/console/console.js +0 -190
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/boot.js +0 -143
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Player.js +0 -24
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Song.js +0 -9
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine-html.js +0 -446
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine.css +0 -58
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine.js +0 -3298
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/json2.js +0 -489
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/node_boot.js +0 -41
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core.js +0 -37
- data/spec_app/vendor/assets/bower_components/jasmine/package.json +0 -34
- data/spec_app/vendor/assets/bower_components/jasmine/requirements.txt +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/MIT.LICENSE +0 -20
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/README.markdown +0 -289
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/bower.json +0 -35
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/package.json +0 -26
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/2.0.2.md +0 -50
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/2.99.md +0 -14
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.0.md +0 -28
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.1.0.md +0 -24
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.1.1.md +0 -23
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.2.0.md +0 -20
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/.bower.json +0 -27
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/.gitignore +0 -8
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/.npmignore +0 -8
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/LICENSE.txt +0 -24
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/README.md +0 -118
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/bower.json +0 -17
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/dist/jasmine-fixture.min.js +0 -5
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/basic-usage-spec.coffee +0 -14
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/invariants.coffee +0 -17
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/spec-within-a-spec.coffee +0 -24
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/tmp-files.coffee +0 -8
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/support/jasmine1-testem-config.json +0 -11
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/support/jasmine2-testem-config.json +0 -11
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-1.11.0.js +0 -10337
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-1.8.3.js +0 -9472
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-2.1.0.js +0 -9111
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/CONTRIBUTING.md +0 -28
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/Gruntfile.js +0 -49
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/LICENSE +0 -20
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/README.md +0 -367
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/bower.json +0 -15
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/package.json +0 -35
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_checkbox_with_checked.html +0 -6
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_javascript.html +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_javascript_block.html +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/javascripts/jasmine_javascript_click.js +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/javascripts/jasmine_javascript_hover.js +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/json/jasmine_json_test.json +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/real_non_mocked_fixture.html +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/real_non_mocked_fixture_style.css +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/suites/jasmine-jquery-spec.js +0 -1842
- data/spec_app/vendor/assets/bower_components/jquery/.bower.json +0 -38
- data/spec_app/vendor/assets/bower_components/jquery/MIT-LICENSE.txt +0 -21
- data/spec_app/vendor/assets/bower_components/jquery/bower.json +0 -28
- data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.js +0 -9210
- data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.min.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.min.map +0 -1
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/jsonp.js +0 -89
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/load.js +0 -75
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/parseJSON.js +0 -13
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/parseXML.js +0 -28
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/script.js +0 -64
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/var/nonce.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/var/rquery.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/xhr.js +0 -136
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax.js +0 -786
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes/attr.js +0 -141
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes/classes.js +0 -158
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes/prop.js +0 -94
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes/support.js +0 -35
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes/val.js +0 -161
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes.js +0 -11
- data/spec_app/vendor/assets/bower_components/jquery/src/callbacks.js +0 -205
- data/spec_app/vendor/assets/bower_components/jquery/src/core/access.js +0 -60
- data/spec_app/vendor/assets/bower_components/jquery/src/core/init.js +0 -123
- data/spec_app/vendor/assets/bower_components/jquery/src/core/parseHTML.js +0 -39
- data/spec_app/vendor/assets/bower_components/jquery/src/core/ready.js +0 -97
- data/spec_app/vendor/assets/bower_components/jquery/src/core/var/rsingleTag.js +0 -4
- data/spec_app/vendor/assets/bower_components/jquery/src/core.js +0 -502
- data/spec_app/vendor/assets/bower_components/jquery/src/css/addGetHookIf.js +0 -22
- data/spec_app/vendor/assets/bower_components/jquery/src/css/curCSS.js +0 -57
- data/spec_app/vendor/assets/bower_components/jquery/src/css/defaultDisplay.js +0 -70
- data/spec_app/vendor/assets/bower_components/jquery/src/css/hiddenVisibleSelectors.js +0 -15
- data/spec_app/vendor/assets/bower_components/jquery/src/css/support.js +0 -96
- data/spec_app/vendor/assets/bower_components/jquery/src/css/swap.js +0 -28
- data/spec_app/vendor/assets/bower_components/jquery/src/css/var/cssExpand.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/css/var/getStyles.js +0 -12
- data/spec_app/vendor/assets/bower_components/jquery/src/css/var/isHidden.js +0 -13
- data/spec_app/vendor/assets/bower_components/jquery/src/css/var/rmargin.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/css/var/rnumnonpx.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/css.js +0 -450
- data/spec_app/vendor/assets/bower_components/jquery/src/data/Data.js +0 -181
- data/spec_app/vendor/assets/bower_components/jquery/src/data/accepts.js +0 -20
- data/spec_app/vendor/assets/bower_components/jquery/src/data/var/data_priv.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/data/var/data_user.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/data.js +0 -178
- data/spec_app/vendor/assets/bower_components/jquery/src/deferred.js +0 -149
- data/spec_app/vendor/assets/bower_components/jquery/src/deprecated.js +0 -13
- data/spec_app/vendor/assets/bower_components/jquery/src/dimensions.js +0 -50
- data/spec_app/vendor/assets/bower_components/jquery/src/effects/Tween.js +0 -114
- data/spec_app/vendor/assets/bower_components/jquery/src/effects/animatedSelector.js +0 -13
- data/spec_app/vendor/assets/bower_components/jquery/src/effects.js +0 -648
- data/spec_app/vendor/assets/bower_components/jquery/src/event/ajax.js +0 -13
- data/spec_app/vendor/assets/bower_components/jquery/src/event/alias.js +0 -39
- data/spec_app/vendor/assets/bower_components/jquery/src/event/support.js +0 -9
- data/spec_app/vendor/assets/bower_components/jquery/src/event.js +0 -868
- data/spec_app/vendor/assets/bower_components/jquery/src/exports/amd.js +0 -24
- data/spec_app/vendor/assets/bower_components/jquery/src/exports/global.js +0 -32
- data/spec_app/vendor/assets/bower_components/jquery/src/intro.js +0 -44
- data/spec_app/vendor/assets/bower_components/jquery/src/jquery.js +0 -37
- data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/_evalUrl.js +0 -18
- data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/support.js +0 -32
- data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/var/rcheckableType.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/manipulation.js +0 -580
- data/spec_app/vendor/assets/bower_components/jquery/src/offset.js +0 -207
- data/spec_app/vendor/assets/bower_components/jquery/src/outro.js +0 -1
- data/spec_app/vendor/assets/bower_components/jquery/src/queue/delay.js +0 -22
- data/spec_app/vendor/assets/bower_components/jquery/src/queue.js +0 -142
- data/spec_app/vendor/assets/bower_components/jquery/src/selector-native.js +0 -172
- data/spec_app/vendor/assets/bower_components/jquery/src/selector-sizzle.js +0 -14
- data/spec_app/vendor/assets/bower_components/jquery/src/selector.js +0 -1
- data/spec_app/vendor/assets/bower_components/jquery/src/serialize.js +0 -111
- data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.js +0 -2067
- data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.map +0 -1
- data/spec_app/vendor/assets/bower_components/jquery/src/traversing/findFilter.js +0 -100
- data/spec_app/vendor/assets/bower_components/jquery/src/traversing/var/rneedsContext.js +0 -6
- data/spec_app/vendor/assets/bower_components/jquery/src/traversing.js +0 -199
- data/spec_app/vendor/assets/bower_components/jquery/src/var/arr.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/var/class2type.js +0 -4
- data/spec_app/vendor/assets/bower_components/jquery/src/var/concat.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/var/hasOwn.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/var/indexOf.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/var/pnum.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/var/push.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/var/rnotwhite.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/var/slice.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/var/strundefined.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/var/support.js +0 -4
- data/spec_app/vendor/assets/bower_components/jquery/src/var/toString.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/wrap.js +0 -79
- data/spec_app/vendor/assets/stylesheets/.keep +0 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
u = up.util
|
2
|
+
|
3
|
+
class up.dom.ExtractCascade
|
4
|
+
|
5
|
+
constructor: (selector, options) ->
|
6
|
+
@options = u.options(options, humanizedTarget: 'selector', layer: 'auto')
|
7
|
+
@candidates = @buildCandidates(selector)
|
8
|
+
@plans = u.map @candidates, (candidate, i) =>
|
9
|
+
planOptions = u.copy(@options)
|
10
|
+
if i > 0
|
11
|
+
# If we're using a fallback (any candidate that's not the first),
|
12
|
+
# the original transition might no longer be appropriate.
|
13
|
+
planOptions.transition = up.dom.config.fallbackTransition
|
14
|
+
new up.dom.ExtractPlan(candidate, planOptions)
|
15
|
+
|
16
|
+
buildCandidates: (selector) ->
|
17
|
+
candidates = [selector, @options.fallback, up.dom.config.fallbacks]
|
18
|
+
candidates = u.flatten(candidates)
|
19
|
+
# Remove undefined, null and false from the list
|
20
|
+
candidates = u.select candidates, u.isTruthy
|
21
|
+
if @options.fallback == false || @options.provideTarget
|
22
|
+
# Use the first defined candidate, but not `selector` since that
|
23
|
+
# might be an undefined options.failTarget
|
24
|
+
candidates = [candidates[0]]
|
25
|
+
candidates
|
26
|
+
|
27
|
+
oldPlan: =>
|
28
|
+
@detectPlan('oldExists')
|
29
|
+
|
30
|
+
newPlan: =>
|
31
|
+
@detectPlan('newExists')
|
32
|
+
|
33
|
+
matchingPlan: =>
|
34
|
+
@detectPlan('matchExists')
|
35
|
+
|
36
|
+
detectPlan: (checker) =>
|
37
|
+
u.detect @plans, (plan) -> plan[checker]()
|
38
|
+
|
39
|
+
bestPreflightSelector: =>
|
40
|
+
if @options.provideTarget
|
41
|
+
# We know that the target will be created right before swapping,
|
42
|
+
# so just assume the first plan will work.
|
43
|
+
@plans[0].selector
|
44
|
+
else if plan = @oldPlan()
|
45
|
+
plan.selector
|
46
|
+
else
|
47
|
+
@oldPlanNotFound()
|
48
|
+
|
49
|
+
bestMatchingSteps: =>
|
50
|
+
if plan = @matchingPlan()
|
51
|
+
plan.steps
|
52
|
+
else
|
53
|
+
@matchingPlanNotFound()
|
54
|
+
|
55
|
+
matchingPlanNotFound: =>
|
56
|
+
# The job of this method is to simply throw an error.
|
57
|
+
# However, we will investigate the reasons for the failure
|
58
|
+
# so we can provide a more helpful error message.
|
59
|
+
if @newPlan()
|
60
|
+
@oldPlanNotFound()
|
61
|
+
else
|
62
|
+
if @oldPlan()
|
63
|
+
message = "Could not find #{@options.humanizedTarget} in response"
|
64
|
+
else
|
65
|
+
message = "Could not match #{@options.humanizedTarget} in current page and response"
|
66
|
+
if @response && @options.inspectResponse
|
67
|
+
inspectAction = { label: 'Open response', callback: @options.inspectResponse }
|
68
|
+
up.fail(["#{message} (tried %o)", @candidates], action: inspectAction)
|
69
|
+
|
70
|
+
oldPlanNotFound: =>
|
71
|
+
layerProse = @options.layer
|
72
|
+
layerProse = 'page, modal or popup' if layerProse == 'auto'
|
73
|
+
up.fail("Could not find #{@options.humanizedTarget} in current #{layerProse} (tried %o)", @candidates)
|
@@ -0,0 +1,65 @@
|
|
1
|
+
u = up.util
|
2
|
+
|
3
|
+
class up.dom.ExtractPlan
|
4
|
+
|
5
|
+
constructor: (selector, options) ->
|
6
|
+
@origin = options.origin
|
7
|
+
@selector = up.dom.resolveSelector(selector, options.origin)
|
8
|
+
@transition = options.transition || options.animation || 'none'
|
9
|
+
@response = options.response
|
10
|
+
@steps = @parseSteps()
|
11
|
+
|
12
|
+
findOld: =>
|
13
|
+
u.each @steps, (step) ->
|
14
|
+
step.$old = up.dom.first(step.selector, @options)
|
15
|
+
|
16
|
+
findNew: =>
|
17
|
+
u.each @steps, (step) =>
|
18
|
+
step.$new = @response.first(step.selector)
|
19
|
+
|
20
|
+
oldExists: =>
|
21
|
+
@findOld()
|
22
|
+
u.all @steps, (step) -> step.$old
|
23
|
+
|
24
|
+
newExists: =>
|
25
|
+
@findNew()
|
26
|
+
u.all @steps, (step) -> step.$new
|
27
|
+
|
28
|
+
matchExists: =>
|
29
|
+
@oldExists() && @newExists()
|
30
|
+
|
31
|
+
###*
|
32
|
+
Example:
|
33
|
+
|
34
|
+
parseSelector('foo, bar:before', transition: 'cross-fade')
|
35
|
+
|
36
|
+
[
|
37
|
+
{ selector: 'foo', pseudoClass: undefined, transition: 'cross-fade' },
|
38
|
+
{ selector: 'bar', pseudoClass: 'before', transition: 'cross-fade' }
|
39
|
+
]
|
40
|
+
###
|
41
|
+
parseSteps: =>
|
42
|
+
if u.isString(@transition)
|
43
|
+
transitions = @transition.split(comma)
|
44
|
+
else
|
45
|
+
transitions = [@transition]
|
46
|
+
|
47
|
+
comma = /\ *,\ */
|
48
|
+
|
49
|
+
disjunction = @selector.split(comma)
|
50
|
+
|
51
|
+
u.map disjunction, (literal, i) ->
|
52
|
+
literalParts = literal.match(/^(.+?)(?:\:(before|after))?$/)
|
53
|
+
literalParts or up.fail('Could not parse selector literal "%s"', literal)
|
54
|
+
selector = literalParts[1]
|
55
|
+
if selector == 'html'
|
56
|
+
# If someone really asked us to replace the <html> root, the best
|
57
|
+
# we can do is replace the <body>.
|
58
|
+
selector = 'body'
|
59
|
+
|
60
|
+
pseudoClass = literalParts[2]
|
61
|
+
transition = transitions[i] || u.last(transitions)
|
62
|
+
|
63
|
+
selector: selector
|
64
|
+
pseudoClass: pseudoClass
|
65
|
+
transition: transition
|
@@ -2,30 +2,38 @@
|
|
2
2
|
Fragment update API
|
3
3
|
===================
|
4
4
|
|
5
|
-
This module
|
6
|
-
[destroy](/up.destroy) page fragments
|
5
|
+
This module exposes a low-level Javascript API to [change](/up.replace) or
|
6
|
+
[destroy](/up.destroy) page fragments.
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
Most of Unpoly's functionality (like [fragment links](/up.link) or [modals](/up.modal))
|
9
|
+
is built from these functions. You can use them to extend Unpoly from your
|
10
|
+
[custom Javascript](/up.syntax).
|
11
|
+
|
12
|
+
@class up.dom
|
12
13
|
###
|
13
|
-
up.
|
14
|
+
up.dom = (($) ->
|
14
15
|
|
15
16
|
u = up.util
|
16
17
|
|
17
18
|
###*
|
18
19
|
Configures defaults for fragment insertion.
|
19
20
|
|
20
|
-
@property up.
|
21
|
+
@property up.dom.config
|
21
22
|
@param {Boolean} [options.runInlineScripts=true]
|
22
23
|
Whether inline `<script>` tags inside inserted HTML fragments will be executed.
|
23
24
|
@param {Boolean} [options.runLinkedScripts=false]
|
24
25
|
Whether `<script src='...'>` tags inside inserted HTML fragments will fetch and execute
|
25
26
|
the linked JavaScript file.
|
27
|
+
@param {String} [options.fallbacks=['body']]
|
28
|
+
When a fragment updates cannot find the requested element, Unpoly will try this list of alternative selectors.
|
29
|
+
The first selector that matches an element in the current page (or response) will be used.
|
30
|
+
@param {String} [options.fallbackTransition='none']
|
31
|
+
The transition to use when using a fallback target.
|
26
32
|
@stable
|
27
33
|
###
|
28
34
|
config = u.config
|
35
|
+
fallbacks: ['body']
|
36
|
+
fallbackTransition: 'none'
|
29
37
|
runInlineScripts: true
|
30
38
|
runLinkedScripts: false
|
31
39
|
|
@@ -40,7 +48,7 @@ up.flow = (($) ->
|
|
40
48
|
###*
|
41
49
|
Returns the URL the given element was retrieved from.
|
42
50
|
|
43
|
-
@method up.
|
51
|
+
@method up.dom.source
|
44
52
|
@param {String|Element|jQuery} selectorOrElement
|
45
53
|
@experimental
|
46
54
|
###
|
@@ -52,7 +60,7 @@ up.flow = (($) ->
|
|
52
60
|
Resolves the given selector (which might contain `&` references)
|
53
61
|
to an absolute selector.
|
54
62
|
|
55
|
-
@function up.
|
63
|
+
@function up.dom.resolveSelector
|
56
64
|
@param {String|Element|jQuery} selectorOrElement
|
57
65
|
@param {String|Element|jQuery} origin
|
58
66
|
The element that this selector resolution is relative to.
|
@@ -63,11 +71,11 @@ up.flow = (($) ->
|
|
63
71
|
if u.isString(selectorOrElement)
|
64
72
|
selector = selectorOrElement
|
65
73
|
if u.contains(selector, '&')
|
66
|
-
if origin
|
74
|
+
if u.isPresent(origin) # isPresent returns false for empty jQuery collection
|
67
75
|
originSelector = u.selectorForElement(origin)
|
68
76
|
selector = selector.replace(/\&/, originSelector)
|
69
77
|
else
|
70
|
-
up.fail("Found origin reference (%s) in selector %s, but
|
78
|
+
up.fail("Found origin reference (%s) in selector %s, but no origin was given", '&', selector)
|
71
79
|
else
|
72
80
|
selector = u.selectorForElement(selectorOrElement)
|
73
81
|
selector
|
@@ -157,6 +165,8 @@ up.flow = (($) ->
|
|
157
165
|
The URL to fetch from the server.
|
158
166
|
@param {String} [options.failTarget='body']
|
159
167
|
The CSS selector to update if the server sends a non-200 status code.
|
168
|
+
@param {String} [options.fallback]
|
169
|
+
The selector to update when the original target was not found in the page.
|
160
170
|
@param {String} [options.title]
|
161
171
|
The document title after the replacement.
|
162
172
|
|
@@ -206,22 +216,31 @@ up.flow = (($) ->
|
|
206
216
|
same layer as the element that triggered the replacement (see `options.origin`).
|
207
217
|
If that element is not known, or no match was found in that layer,
|
208
218
|
Unpoly will search in other layers, starting from the topmost layer.
|
219
|
+
|
209
220
|
@return {Promise}
|
210
221
|
A promise that will be resolved when the page has been updated.
|
211
222
|
@stable
|
212
223
|
###
|
213
224
|
replace = (selectorOrElement, url, options) ->
|
214
|
-
up.puts "Replacing %s from %s (%o)", selectorOrElement, url, options
|
215
225
|
options = u.options(options)
|
216
|
-
target = resolveSelector(selectorOrElement, options.origin)
|
217
|
-
failTarget = u.option(options.failTarget, 'body')
|
218
|
-
failTarget = resolveSelector(failTarget, options.origin)
|
219
226
|
|
220
227
|
if !up.browser.canPushState() && options.history != false
|
221
228
|
unless options.preload
|
222
229
|
up.browser.loadPage(url, u.only(options, 'method', 'data'))
|
223
230
|
return u.unresolvablePromise()
|
224
231
|
|
232
|
+
options.inspectResponse = -> up.browser.loadPage(url, u.only(options, 'method', 'data'))
|
233
|
+
|
234
|
+
successOptions = u.merge options,
|
235
|
+
humanizedTarget: 'target'
|
236
|
+
|
237
|
+
failureOptions = u.merge options,
|
238
|
+
humanizedTarget: 'failure target'
|
239
|
+
provideTarget: undefined # don't provide a target if we're targeting the failTarget
|
240
|
+
|
241
|
+
target = bestPreflightSelector(selectorOrElement, successOptions)
|
242
|
+
failTarget = bestPreflightSelector(options.failTarget, failureOptions)
|
243
|
+
|
225
244
|
request =
|
226
245
|
url: url
|
227
246
|
method: options.method
|
@@ -231,19 +250,21 @@ up.flow = (($) ->
|
|
231
250
|
cache: options.cache
|
232
251
|
preload: options.preload
|
233
252
|
headers: options.headers
|
234
|
-
|
235
|
-
options.inspectResponse = -> up.browser.loadPage(url, u.only(options, 'method', 'data'))
|
236
|
-
|
237
|
-
promise = up.ajax(request)
|
253
|
+
timeout: options.timeout
|
238
254
|
|
239
255
|
onSuccess = (html, textStatus, xhr) ->
|
240
|
-
processResponse(true, target, url, request, xhr,
|
256
|
+
processResponse(true, target, url, request, xhr, successOptions)
|
241
257
|
|
242
258
|
onFailure = (xhr, textStatus, errorThrown) ->
|
243
|
-
|
259
|
+
rejection = -> u.rejectedPromise(xhr, textStatus, errorThrown)
|
260
|
+
if xhr.responseText
|
261
|
+
promise = processResponse(false, failTarget, url, request, xhr, failureOptions)
|
262
|
+
promise.then(rejection, rejection)
|
263
|
+
else
|
264
|
+
rejection()
|
244
265
|
|
266
|
+
promise = up.ajax(request)
|
245
267
|
promise = promise.then(onSuccess, onFailure)
|
246
|
-
|
247
268
|
promise
|
248
269
|
|
249
270
|
###*
|
@@ -286,7 +307,8 @@ up.flow = (($) ->
|
|
286
307
|
options.source = 'keep'
|
287
308
|
options.history = false
|
288
309
|
|
289
|
-
options
|
310
|
+
if shouldExtractTitle(options) && titleFromXhr = u.titleFromXhr(xhr)
|
311
|
+
options.title = titleFromXhr
|
290
312
|
|
291
313
|
if options.preload
|
292
314
|
u.resolvedPromise()
|
@@ -328,7 +350,7 @@ up.flow = (($) ->
|
|
328
350
|
@param {String|Element|jQuery} selectorOrElement
|
329
351
|
@param {String} html
|
330
352
|
@param {Object} [options]
|
331
|
-
See options for [`up.replace`](/up.replace).
|
353
|
+
See options for [`up.replace()`](/up.replace).
|
332
354
|
@return {Promise}
|
333
355
|
A promise that will be resolved then the selector was updated
|
334
356
|
and all animation has finished.
|
@@ -336,49 +358,42 @@ up.flow = (($) ->
|
|
336
358
|
###
|
337
359
|
extract = (selectorOrElement, html, options) ->
|
338
360
|
up.log.group 'Extracting %s from %d bytes of HTML', selectorOrElement, html?.length, ->
|
339
|
-
options = u.options
|
361
|
+
options = u.options options,
|
340
362
|
historyMethod: 'push'
|
341
363
|
requireMatch: true
|
342
364
|
keep: true
|
343
365
|
layer: 'auto'
|
344
|
-
)
|
345
|
-
|
346
|
-
selector = resolveSelector(selectorOrElement, options.origin)
|
347
|
-
response = parseResponse(html, options)
|
348
|
-
options.title = response.title() if shouldExtractTitle(options)
|
349
366
|
|
350
367
|
up.layout.saveScroll() unless options.saveScroll == false
|
351
368
|
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
promise
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
message += ' (avoid using IDs)'
|
381
|
-
up.fail(message, selector)
|
369
|
+
# Allow callers to create the targeted element right before we swap.
|
370
|
+
options.provideTarget?()
|
371
|
+
response = parseResponse(html)
|
372
|
+
implantSteps = bestMatchingSteps(selectorOrElement, response, options)
|
373
|
+
|
374
|
+
if shouldExtractTitle(options) && responseTitle = response.title()
|
375
|
+
options.title = responseTitle
|
376
|
+
updateHistoryAndTitle(options)
|
377
|
+
|
378
|
+
swapPromises = []
|
379
|
+
for step in implantSteps
|
380
|
+
up.log.group 'Updating %s', step.selector, ->
|
381
|
+
filterScripts(step.$new, options)
|
382
|
+
swapPromise = swapElements(step.$old, step.$new, step.pseudoClass, step.transition, options)
|
383
|
+
swapPromises.push(swapPromise)
|
384
|
+
options.reveal = false # only reveal the first selector atom in the union
|
385
|
+
|
386
|
+
# Delay all further links in the promise chain until all fragments have been swapped
|
387
|
+
$.when(swapPromises...)
|
388
|
+
|
389
|
+
bestPreflightSelector = (selector, options) ->
|
390
|
+
cascade = new up.dom.ExtractCascade(selector, options)
|
391
|
+
cascade.bestPreflightSelector()
|
392
|
+
|
393
|
+
bestMatchingSteps = (selector, response, options) ->
|
394
|
+
options = u.merge(options, response: response)
|
395
|
+
cascade = new up.dom.ExtractCascade(selector, options)
|
396
|
+
cascade.bestMatchingSteps()
|
382
397
|
|
383
398
|
filterScripts = ($element, options) ->
|
384
399
|
runInlineScripts = u.option(options.runInlineScripts, config.runInlineScripts)
|
@@ -391,7 +406,7 @@ up.flow = (($) ->
|
|
391
406
|
unless (isLinked && runLinkedScripts) || (isInline && runInlineScripts)
|
392
407
|
$script.remove()
|
393
408
|
|
394
|
-
parseResponse = (html
|
409
|
+
parseResponse = (html) ->
|
395
410
|
# jQuery cannot construct transient elements that contain <html> or <body> tags
|
396
411
|
htmlElement = u.createElementFromHtml(html)
|
397
412
|
title: -> htmlElement.querySelector("title")?.textContent
|
@@ -403,16 +418,11 @@ up.flow = (($) ->
|
|
403
418
|
# It returns an array of DOM elements, NOT a jQuery collection.
|
404
419
|
if child = $.find(selector, htmlElement)[0]
|
405
420
|
$(child)
|
406
|
-
else if options.requireMatch
|
407
|
-
inspectAction = { label: 'Open response', callback: options.inspectResponse }
|
408
|
-
up.fail(["Could not find selector %s in response %o", selector, html], action: inspectAction)
|
409
421
|
|
410
|
-
|
422
|
+
updateHistoryAndTitle = (options) ->
|
411
423
|
options = u.options(options, historyMethod: 'push')
|
412
|
-
if options.history
|
413
|
-
|
414
|
-
if options.title
|
415
|
-
document.title = options.title
|
424
|
+
up.history[options.historyMethod](options.history) if options.history
|
425
|
+
document.title = options.title if u.isString(options.title)
|
416
426
|
|
417
427
|
swapElements = ($old, $new, pseudoClass, transition, options) ->
|
418
428
|
transition ||= 'none'
|
@@ -460,13 +470,11 @@ up.flow = (($) ->
|
|
460
470
|
options.keepPlans = transferKeepableElements($old, $new, options)
|
461
471
|
|
462
472
|
if $old.is('body')
|
463
|
-
# We would prefer to delay cleaning until the destroy transition ends, but a
|
464
|
-
# swap of <body> cannot be animated. Also the replaceWith call below will clean the
|
465
|
-
# destroyer's data property from $old, making the up.syntax.clean call in `destroy` blow up.
|
466
|
-
up.syntax.clean($old)
|
467
473
|
# jQuery will actually let us .insertBefore the new <body> tag,
|
468
474
|
# but that's probably bad Karma.
|
469
|
-
$old
|
475
|
+
swapBody($old, $new)
|
476
|
+
# We cannot morph the <body> tag
|
477
|
+
transition = false
|
470
478
|
else
|
471
479
|
# Don't insert the new element after the old element. For some reason
|
472
480
|
# this will make the browser scroll to the bottom of the new element.
|
@@ -491,6 +499,10 @@ up.flow = (($) ->
|
|
491
499
|
|
492
500
|
promise
|
493
501
|
|
502
|
+
# This is a separate method so we can mock it in specs
|
503
|
+
swapBody = ($oldBody, $newBody) ->
|
504
|
+
$oldBody.replaceWith($newBody)
|
505
|
+
|
494
506
|
transferKeepableElements = ($old, $new, options) ->
|
495
507
|
keepPlans = []
|
496
508
|
if options.keep
|
@@ -619,35 +631,12 @@ up.flow = (($) ->
|
|
619
631
|
@stable
|
620
632
|
###
|
621
633
|
|
622
|
-
parseImplantSteps = (selector, options) ->
|
623
|
-
transitionArg = options.transition || options.animation || 'none'
|
624
|
-
comma = /\ *,\ */
|
625
|
-
disjunction = selector.split(comma)
|
626
|
-
if u.isString(transitions)
|
627
|
-
transitions = transitionArg.split(comma)
|
628
|
-
else
|
629
|
-
transitions = [transitionArg]
|
630
|
-
for selectorAtom, i in disjunction
|
631
|
-
# Splitting the atom
|
632
|
-
selectorParts = selectorAtom.match(/^(.+?)(?:\:(before|after))?$/)
|
633
|
-
selectorParts or up.fail('Could not parse selector atom "%s"', selectorAtom)
|
634
|
-
selector = selectorParts[1]
|
635
|
-
if selector == 'html'
|
636
|
-
# If someone really asked us to replace the <html> root, the best
|
637
|
-
# we can do is replace the <body>.
|
638
|
-
selector = 'body'
|
639
|
-
pseudoClass = selectorParts[2]
|
640
|
-
transition = transitions[i] || u.last(transitions)
|
641
|
-
selector: selector
|
642
|
-
pseudoClass: pseudoClass
|
643
|
-
transition: transition
|
644
|
-
|
645
634
|
###*
|
646
635
|
Compiles a page fragment that has been inserted into the DOM
|
647
636
|
by external code.
|
648
637
|
|
649
638
|
**As long as you manipulate the DOM using Unpoly, you will never
|
650
|
-
need to call this method.** You only need to use `up.hello` if the
|
639
|
+
need to call this method.** You only need to use `up.hello()` if the
|
651
640
|
DOM is manipulated without Unpoly' involvement, e.g. by setting
|
652
641
|
the `innerHTML` property or calling jQuery methods like
|
653
642
|
`html`, `insertAfter` or `appendTo`:
|
@@ -731,7 +720,11 @@ up.flow = (($) ->
|
|
731
720
|
@param {String} options.layer
|
732
721
|
The name of the layer in which to find the element. Valid values are
|
733
722
|
`auto`, `page`, `modal` and `popup`.
|
734
|
-
@param {}
|
723
|
+
@param {String|Element|jQuery} [options.origin]
|
724
|
+
An second element or selector that can be referenced as `&` in the first selector:
|
725
|
+
|
726
|
+
$input = $('input.email');
|
727
|
+
up.first('.field:has(&)', $input); // returns the .field containing $input
|
735
728
|
@return {jQuery|Undefined}
|
736
729
|
The first element that is neither a ghost or being destroyed,
|
737
730
|
or `undefined` if no such element was given.
|
@@ -739,10 +732,11 @@ up.flow = (($) ->
|
|
739
732
|
###
|
740
733
|
first = (selectorOrElement, options) ->
|
741
734
|
options = u.options(options, layer: 'auto')
|
735
|
+
resolved = resolveSelector(selectorOrElement, options.origin)
|
742
736
|
if options.layer == 'auto'
|
743
|
-
firstInPriority(
|
737
|
+
firstInPriority(resolved, options.origin)
|
744
738
|
else
|
745
|
-
firstInLayer(
|
739
|
+
firstInLayer(resolved, options.layer)
|
746
740
|
|
747
741
|
firstInPriority = (selectorOrElement, origin) ->
|
748
742
|
layers = ['popup', 'modal', 'page']
|
@@ -781,7 +775,7 @@ up.flow = (($) ->
|
|
781
775
|
###*
|
782
776
|
Destroys the given element or selector.
|
783
777
|
|
784
|
-
Takes care that all [`up.compiler`](/up.compiler) destructors, if any, are called.
|
778
|
+
Takes care that all [`up.compiler()`](/up.compiler) destructors, if any, are called.
|
785
779
|
|
786
780
|
The element is removed from the DOM.
|
787
781
|
Note that if you choose to animate the element removal using `options.animate`,
|
@@ -798,11 +792,11 @@ up.flow = (($) ->
|
|
798
792
|
@param {String|Function} [options.animation='none']
|
799
793
|
The animation to use before the element is removed from the DOM.
|
800
794
|
@param {Number} [options.duration]
|
801
|
-
The duration of the animation. See [`up.animate`](/up.animate).
|
795
|
+
The duration of the animation. See [`up.animate()`](/up.animate).
|
802
796
|
@param {Number} [options.delay]
|
803
|
-
The delay before the animation starts. See [`up.animate`](/up.animate).
|
797
|
+
The delay before the animation starts. See [`up.animate()`](/up.animate).
|
804
798
|
@param {String} [options.easing]
|
805
|
-
The timing function that controls the animation's acceleration. [`up.animate`](/up.animate).
|
799
|
+
The timing function that controls the animation's acceleration. [`up.animate()`](/up.animate).
|
806
800
|
@return {Deferred}
|
807
801
|
A promise that will be resolved once the element has been removed from the DOM.
|
808
802
|
@stable
|
@@ -822,7 +816,7 @@ up.flow = (($) ->
|
|
822
816
|
# If e.g. a modal or popup asks us to restore a URL, do this
|
823
817
|
# before emitting `fragment:destroy`. This way up.navigate sees the
|
824
818
|
# new URL and can assign/remove .up-current classes accordingly.
|
825
|
-
|
819
|
+
updateHistoryAndTitle(options)
|
826
820
|
|
827
821
|
animationDeferred = u.presence(options.animation, u.isDeferred) ||
|
828
822
|
up.motion.animate($element, options.animation, animateOptions)
|
@@ -882,7 +876,7 @@ up.flow = (($) ->
|
|
882
876
|
@function up.reload
|
883
877
|
@param {String|Element|jQuery} selectorOrElement
|
884
878
|
@param {Object} [options]
|
885
|
-
See options for [`up.replace`](/up.replace)
|
879
|
+
See options for [`up.replace()`](/up.replace)
|
886
880
|
@param {String} [options.url]
|
887
881
|
The URL from which to reload the fragment.
|
888
882
|
This defaults to the URL from which the fragment was originally loaded.
|
@@ -913,10 +907,11 @@ up.flow = (($) ->
|
|
913
907
|
|
914
908
|
)(jQuery)
|
915
909
|
|
916
|
-
up.replace = up.
|
917
|
-
up.extract = up.
|
918
|
-
up.reload = up.
|
919
|
-
up.destroy = up.
|
920
|
-
up.first = up.
|
921
|
-
up.hello = up.
|
910
|
+
up.replace = up.dom.replace
|
911
|
+
up.extract = up.dom.extract
|
912
|
+
up.reload = up.dom.reload
|
913
|
+
up.destroy = up.dom.destroy
|
914
|
+
up.first = up.dom.first
|
915
|
+
up.hello = up.dom.hello
|
922
916
|
|
917
|
+
up.renamedModule 'flow', 'dom'
|
@@ -33,16 +33,16 @@ Once the response is received the URL will change to `/bar` and the `up-active`
|
|
33
33
|
<a href="/bar" up-follow class="up-current">Bar</a>
|
34
34
|
|
35
35
|
|
36
|
-
@class up.
|
36
|
+
@class up.feedback
|
37
37
|
###
|
38
|
-
up.
|
38
|
+
up.feedback = (($) ->
|
39
39
|
|
40
40
|
u = up.util
|
41
41
|
|
42
42
|
###*
|
43
43
|
Sets default options for this module.
|
44
44
|
|
45
|
-
@property up.
|
45
|
+
@property up.feedback.config
|
46
46
|
@param {Number} [config.currentClasses]
|
47
47
|
An array of classes to set on [links that point the current location](/up-current).
|
48
48
|
@stable
|
@@ -144,9 +144,9 @@ up.navigation = (($) ->
|
|
144
144
|
|
145
145
|
var $button = $('button');
|
146
146
|
$button.on('click', function() {
|
147
|
-
up.
|
147
|
+
up.feedback.start($button);
|
148
148
|
up.ajax(...).always(function() {
|
149
|
-
up.
|
149
|
+
up.feedback.stop($button);
|
150
150
|
});
|
151
151
|
});
|
152
152
|
|
@@ -154,18 +154,18 @@ up.navigation = (($) ->
|
|
154
154
|
|
155
155
|
var $button = $('button');
|
156
156
|
$button.on('click', function() {
|
157
|
-
up.
|
157
|
+
up.feedback.start($button, function() {
|
158
158
|
up.ajax(...);
|
159
159
|
});
|
160
160
|
});
|
161
161
|
|
162
|
-
@method up.
|
162
|
+
@method up.feedback.start
|
163
163
|
@param {Element|jQuery|String} elementOrSelector
|
164
164
|
The element to mark as active
|
165
165
|
@param {Function} [action]
|
166
166
|
An optional function to run while the element is marked as loading.
|
167
167
|
The function must return a promise.
|
168
|
-
Once the promise resolves, the element will be [marked as no longer loading](/up.
|
168
|
+
Once the promise resolves, the element will be [marked as no longer loading](/up.feedback.stop).
|
169
169
|
@internal
|
170
170
|
###
|
171
171
|
start = (elementOrSelector, action) ->
|
@@ -213,14 +213,13 @@ up.navigation = (($) ->
|
|
213
213
|
This happens automatically when network requests initiated by the Unpoly API have completed.
|
214
214
|
Use this function if you make custom network calls from your own JavaScript code.
|
215
215
|
|
216
|
-
@function up.
|
216
|
+
@function up.feedback.stop
|
217
217
|
@param {jQuery} event.$element
|
218
218
|
The link or form that has finished loading.
|
219
219
|
@internal
|
220
220
|
###
|
221
221
|
stop = (elementOrSelector) ->
|
222
222
|
$element = findActionableArea(elementOrSelector)
|
223
|
-
up.emit('up:navigated', $element: $element, message: false)
|
224
223
|
$element.removeClass(CLASS_ACTIVE)
|
225
224
|
|
226
225
|
###*
|
@@ -286,8 +285,9 @@ up.navigation = (($) ->
|
|
286
285
|
up.on 'up:framework:reset', reset
|
287
286
|
|
288
287
|
config: config
|
289
|
-
defaults: -> up.fail('up.navigation.defaults(...) no longer exists. Set values on he up.navigation.config property instead.')
|
290
288
|
start: start
|
291
289
|
stop: stop
|
292
290
|
|
293
291
|
)(jQuery)
|
292
|
+
|
293
|
+
up.renamedModule 'navigation', 'feedback'
|