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.

Files changed (232) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +106 -76
  3. data/README.md +8 -5
  4. data/README_RAILS.md +1 -1
  5. data/design/test_rejected_promise.txt +5 -0
  6. data/dist/unpoly-bootstrap3.js +1 -1
  7. data/dist/unpoly-bootstrap3.min.js +1 -1
  8. data/dist/unpoly.js +814 -417
  9. data/dist/unpoly.min.js +3 -3
  10. data/lib/assets/javascripts/unpoly/{browser.js.coffee → browser.coffee} +15 -6
  11. data/lib/assets/javascripts/unpoly/{bus.js.coffee → bus.coffee} +13 -13
  12. data/lib/assets/javascripts/unpoly/dom/extract_cascade.coffee +73 -0
  13. data/lib/assets/javascripts/unpoly/dom/extract_plan.coffee +65 -0
  14. data/lib/assets/javascripts/unpoly/{flow.js.coffee → dom.coffee} +109 -114
  15. data/lib/assets/javascripts/unpoly/{navigation.js.coffee → feedback.coffee} +11 -11
  16. data/lib/assets/javascripts/unpoly/{form.js.coffee → form.coffee} +35 -24
  17. data/lib/assets/javascripts/unpoly/{history.js.coffee → history.coffee} +9 -10
  18. data/lib/assets/javascripts/unpoly/{layout.js.coffee → layout.coffee} +53 -21
  19. data/lib/assets/javascripts/unpoly/{link.js.coffee → link.coffee} +46 -40
  20. data/lib/assets/javascripts/unpoly/{log.js.coffee → log.coffee} +2 -2
  21. data/lib/assets/javascripts/unpoly/{modal.js.coffee → modal.coffee} +17 -14
  22. data/lib/assets/javascripts/unpoly/{motion.js.coffee → motion.coffee} +28 -31
  23. data/lib/assets/javascripts/unpoly/namespace.coffee.erb +10 -0
  24. data/lib/assets/javascripts/unpoly/{popup.js.coffee → popup.coffee} +22 -10
  25. data/lib/assets/javascripts/unpoly/{proxy.js.coffee → proxy.coffee} +34 -12
  26. data/lib/assets/javascripts/unpoly/{rails.js.coffee → rails.coffee} +0 -0
  27. data/lib/assets/javascripts/unpoly/{syntax.js.coffee → syntax.coffee} +32 -21
  28. data/lib/assets/javascripts/unpoly/{toast.js.coffee → toast.coffee} +0 -0
  29. data/lib/assets/javascripts/unpoly/{tooltip.js.coffee → tooltip.coffee} +2 -2
  30. data/lib/assets/javascripts/unpoly/{util.js.coffee → util.coffee} +122 -35
  31. data/lib/assets/javascripts/unpoly-bootstrap3/{form-ext.js.coffee → form-ext.coffee} +0 -0
  32. data/lib/assets/javascripts/unpoly-bootstrap3/{layout-ext.js.coffee → layout-ext.coffee} +0 -0
  33. data/lib/assets/javascripts/unpoly-bootstrap3/{modal-ext.js.coffee → modal-ext.coffee} +0 -0
  34. data/lib/assets/javascripts/unpoly-bootstrap3/{navigation-ext.js.coffee → navigation-ext.coffee} +1 -1
  35. data/lib/assets/javascripts/{unpoly-bootstrap3.js.coffee → unpoly-bootstrap3.coffee} +0 -0
  36. data/lib/assets/javascripts/unpoly.coffee +22 -0
  37. data/lib/assets/stylesheets/unpoly/{close.css.sass → close.sass} +0 -0
  38. data/lib/assets/stylesheets/unpoly/{flow.css.sass → flow.sass} +0 -0
  39. data/lib/assets/stylesheets/unpoly/{link.css.sass → link.sass} +0 -0
  40. data/lib/assets/stylesheets/unpoly/{modal.css.sass → modal.sass} +0 -0
  41. data/lib/assets/stylesheets/unpoly/{popup.css.sass → popup.sass} +0 -0
  42. data/lib/assets/stylesheets/unpoly/{toast.css.sass → toast.sass} +0 -0
  43. data/lib/assets/stylesheets/unpoly/{tooltip.css.sass → tooltip.sass} +0 -0
  44. data/lib/assets/stylesheets/unpoly-bootstrap3/{modal-ext.css.sass → modal-ext.sass} +0 -0
  45. data/lib/assets/stylesheets/{unpoly-bootstrap3.css.sass → unpoly-bootstrap3.sass} +0 -0
  46. data/lib/assets/stylesheets/{unpoly.css.sass → unpoly.sass} +0 -0
  47. data/lib/unpoly/rails/version.rb +1 -1
  48. data/package.json +1 -1
  49. data/spec_app/Gemfile.lock +11 -13
  50. data/spec_app/app/assets/javascripts/jasmine_specs.coffee +1 -1
  51. data/spec_app/app/assets/stylesheets/_helpers.sass +1 -1
  52. data/spec_app/config/initializers/assets.rb +1 -5
  53. data/spec_app/spec/javascripts/up/{flow_spec.js.coffee → dom_spec.js.coffee} +294 -44
  54. data/spec_app/spec/javascripts/up/{navigation_spec.js.coffee → feedback_spec.js.coffee} +2 -2
  55. data/spec_app/spec/javascripts/up/form_spec.js.coffee +1 -0
  56. data/spec_app/spec/javascripts/up/layout_spec.js.coffee +10 -0
  57. data/spec_app/spec/javascripts/up/link_spec.js.coffee +28 -0
  58. data/spec_app/spec/javascripts/up/modal_spec.js.coffee +46 -9
  59. data/spec_app/spec/javascripts/up/motion_spec.js.coffee +32 -2
  60. data/spec_app/spec/javascripts/up/popup_spec.js.coffee +5 -4
  61. data/spec_app/spec/javascripts/up/util_spec.js.coffee +75 -0
  62. data/spec_app/vendor/{assets/bower_components/jasmine-ajax → asset-libs/jasmine-ajax-3.3.1}/.bower.json +0 -0
  63. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.gitignore +6 -0
  64. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.npmignore +10 -0
  65. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.pairs +6 -0
  66. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.travis.yml +56 -0
  67. 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
  68. data/spec_app/vendor/{assets/bower_components/jasmine-fixture/dist → asset-libs/jasmine-fixture-1.3.4}/jasmine-fixture.js +13 -13
  69. data/spec_app/vendor/{assets/bower_components/jasmine-jquery → asset-libs/jasmine-jquery-2.1.1}/.bower.json +0 -0
  70. data/spec_app/vendor/{assets/bower_components/jasmine-jquery/lib → asset-libs/jasmine-jquery-2.1.1}/jasmine-jquery.js +0 -0
  71. data/spec_app/vendor/assets/{javascripts/.keep → .keep} +0 -0
  72. metadata +52 -203
  73. data/lib/assets/javascripts/unpoly/module.js.coffee.erb +0 -8
  74. data/lib/assets/javascripts/unpoly.js.coffee +0 -21
  75. data/spec_app/Bowerfile +0 -3
  76. data/spec_app/vendor/assets/.bowerrc +0 -3
  77. data/spec_app/vendor/assets/bower.json +0 -8
  78. data/spec_app/vendor/assets/bower_components/jasmine/.bower.json +0 -50
  79. data/spec_app/vendor/assets/bower_components/jasmine/CONTRIBUTING.md +0 -130
  80. data/spec_app/vendor/assets/bower_components/jasmine/GOALS_2.0.md +0 -64
  81. data/spec_app/vendor/assets/bower_components/jasmine/MANIFEST.in +0 -5
  82. data/spec_app/vendor/assets/bower_components/jasmine/MIT.LICENSE +0 -20
  83. data/spec_app/vendor/assets/bower_components/jasmine/README.md +0 -73
  84. data/spec_app/vendor/assets/bower_components/jasmine/RELEASE.md +0 -73
  85. data/spec_app/vendor/assets/bower_components/jasmine/bower.json +0 -41
  86. data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine-horizontal.png +0 -0
  87. data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine-horizontal.svg +0 -102
  88. data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine_favicon.png +0 -0
  89. data/spec_app/vendor/assets/bower_components/jasmine/lib/console/console.js +0 -190
  90. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/boot.js +0 -143
  91. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Player.js +0 -24
  92. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Song.js +0 -9
  93. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine-html.js +0 -446
  94. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine.css +0 -58
  95. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine.js +0 -3298
  96. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/json2.js +0 -489
  97. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/node_boot.js +0 -41
  98. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core.js +0 -37
  99. data/spec_app/vendor/assets/bower_components/jasmine/package.json +0 -34
  100. data/spec_app/vendor/assets/bower_components/jasmine/requirements.txt +0 -1
  101. data/spec_app/vendor/assets/bower_components/jasmine-ajax/MIT.LICENSE +0 -20
  102. data/spec_app/vendor/assets/bower_components/jasmine-ajax/README.markdown +0 -289
  103. data/spec_app/vendor/assets/bower_components/jasmine-ajax/bower.json +0 -35
  104. data/spec_app/vendor/assets/bower_components/jasmine-ajax/package.json +0 -26
  105. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/2.0.2.md +0 -50
  106. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/2.99.md +0 -14
  107. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.0.md +0 -28
  108. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.1.0.md +0 -24
  109. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.1.1.md +0 -23
  110. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.2.0.md +0 -20
  111. data/spec_app/vendor/assets/bower_components/jasmine-fixture/.bower.json +0 -27
  112. data/spec_app/vendor/assets/bower_components/jasmine-fixture/.gitignore +0 -8
  113. data/spec_app/vendor/assets/bower_components/jasmine-fixture/.npmignore +0 -8
  114. data/spec_app/vendor/assets/bower_components/jasmine-fixture/LICENSE.txt +0 -24
  115. data/spec_app/vendor/assets/bower_components/jasmine-fixture/README.md +0 -118
  116. data/spec_app/vendor/assets/bower_components/jasmine-fixture/bower.json +0 -17
  117. data/spec_app/vendor/assets/bower_components/jasmine-fixture/dist/jasmine-fixture.min.js +0 -5
  118. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/basic-usage-spec.coffee +0 -14
  119. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/invariants.coffee +0 -17
  120. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/spec-within-a-spec.coffee +0 -24
  121. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/tmp-files.coffee +0 -8
  122. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/support/jasmine1-testem-config.json +0 -11
  123. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/support/jasmine2-testem-config.json +0 -11
  124. data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-1.11.0.js +0 -10337
  125. data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-1.8.3.js +0 -9472
  126. data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-2.1.0.js +0 -9111
  127. data/spec_app/vendor/assets/bower_components/jasmine-jquery/CONTRIBUTING.md +0 -28
  128. data/spec_app/vendor/assets/bower_components/jasmine-jquery/Gruntfile.js +0 -49
  129. data/spec_app/vendor/assets/bower_components/jasmine-jquery/LICENSE +0 -20
  130. data/spec_app/vendor/assets/bower_components/jasmine-jquery/README.md +0 -367
  131. data/spec_app/vendor/assets/bower_components/jasmine-jquery/bower.json +0 -15
  132. data/spec_app/vendor/assets/bower_components/jasmine-jquery/package.json +0 -35
  133. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_checkbox_with_checked.html +0 -6
  134. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_javascript.html +0 -1
  135. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_javascript_block.html +0 -1
  136. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/javascripts/jasmine_javascript_click.js +0 -1
  137. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/javascripts/jasmine_javascript_hover.js +0 -1
  138. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/json/jasmine_json_test.json +0 -1
  139. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/real_non_mocked_fixture.html +0 -1
  140. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/real_non_mocked_fixture_style.css +0 -1
  141. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/suites/jasmine-jquery-spec.js +0 -1842
  142. data/spec_app/vendor/assets/bower_components/jquery/.bower.json +0 -38
  143. data/spec_app/vendor/assets/bower_components/jquery/MIT-LICENSE.txt +0 -21
  144. data/spec_app/vendor/assets/bower_components/jquery/bower.json +0 -28
  145. data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.js +0 -9210
  146. data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.min.js +0 -5
  147. data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.min.map +0 -1
  148. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/jsonp.js +0 -89
  149. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/load.js +0 -75
  150. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/parseJSON.js +0 -13
  151. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/parseXML.js +0 -28
  152. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/script.js +0 -64
  153. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/var/nonce.js +0 -5
  154. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/var/rquery.js +0 -3
  155. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/xhr.js +0 -136
  156. data/spec_app/vendor/assets/bower_components/jquery/src/ajax.js +0 -786
  157. data/spec_app/vendor/assets/bower_components/jquery/src/attributes/attr.js +0 -141
  158. data/spec_app/vendor/assets/bower_components/jquery/src/attributes/classes.js +0 -158
  159. data/spec_app/vendor/assets/bower_components/jquery/src/attributes/prop.js +0 -94
  160. data/spec_app/vendor/assets/bower_components/jquery/src/attributes/support.js +0 -35
  161. data/spec_app/vendor/assets/bower_components/jquery/src/attributes/val.js +0 -161
  162. data/spec_app/vendor/assets/bower_components/jquery/src/attributes.js +0 -11
  163. data/spec_app/vendor/assets/bower_components/jquery/src/callbacks.js +0 -205
  164. data/spec_app/vendor/assets/bower_components/jquery/src/core/access.js +0 -60
  165. data/spec_app/vendor/assets/bower_components/jquery/src/core/init.js +0 -123
  166. data/spec_app/vendor/assets/bower_components/jquery/src/core/parseHTML.js +0 -39
  167. data/spec_app/vendor/assets/bower_components/jquery/src/core/ready.js +0 -97
  168. data/spec_app/vendor/assets/bower_components/jquery/src/core/var/rsingleTag.js +0 -4
  169. data/spec_app/vendor/assets/bower_components/jquery/src/core.js +0 -502
  170. data/spec_app/vendor/assets/bower_components/jquery/src/css/addGetHookIf.js +0 -22
  171. data/spec_app/vendor/assets/bower_components/jquery/src/css/curCSS.js +0 -57
  172. data/spec_app/vendor/assets/bower_components/jquery/src/css/defaultDisplay.js +0 -70
  173. data/spec_app/vendor/assets/bower_components/jquery/src/css/hiddenVisibleSelectors.js +0 -15
  174. data/spec_app/vendor/assets/bower_components/jquery/src/css/support.js +0 -96
  175. data/spec_app/vendor/assets/bower_components/jquery/src/css/swap.js +0 -28
  176. data/spec_app/vendor/assets/bower_components/jquery/src/css/var/cssExpand.js +0 -3
  177. data/spec_app/vendor/assets/bower_components/jquery/src/css/var/getStyles.js +0 -12
  178. data/spec_app/vendor/assets/bower_components/jquery/src/css/var/isHidden.js +0 -13
  179. data/spec_app/vendor/assets/bower_components/jquery/src/css/var/rmargin.js +0 -3
  180. data/spec_app/vendor/assets/bower_components/jquery/src/css/var/rnumnonpx.js +0 -5
  181. data/spec_app/vendor/assets/bower_components/jquery/src/css.js +0 -450
  182. data/spec_app/vendor/assets/bower_components/jquery/src/data/Data.js +0 -181
  183. data/spec_app/vendor/assets/bower_components/jquery/src/data/accepts.js +0 -20
  184. data/spec_app/vendor/assets/bower_components/jquery/src/data/var/data_priv.js +0 -5
  185. data/spec_app/vendor/assets/bower_components/jquery/src/data/var/data_user.js +0 -5
  186. data/spec_app/vendor/assets/bower_components/jquery/src/data.js +0 -178
  187. data/spec_app/vendor/assets/bower_components/jquery/src/deferred.js +0 -149
  188. data/spec_app/vendor/assets/bower_components/jquery/src/deprecated.js +0 -13
  189. data/spec_app/vendor/assets/bower_components/jquery/src/dimensions.js +0 -50
  190. data/spec_app/vendor/assets/bower_components/jquery/src/effects/Tween.js +0 -114
  191. data/spec_app/vendor/assets/bower_components/jquery/src/effects/animatedSelector.js +0 -13
  192. data/spec_app/vendor/assets/bower_components/jquery/src/effects.js +0 -648
  193. data/spec_app/vendor/assets/bower_components/jquery/src/event/ajax.js +0 -13
  194. data/spec_app/vendor/assets/bower_components/jquery/src/event/alias.js +0 -39
  195. data/spec_app/vendor/assets/bower_components/jquery/src/event/support.js +0 -9
  196. data/spec_app/vendor/assets/bower_components/jquery/src/event.js +0 -868
  197. data/spec_app/vendor/assets/bower_components/jquery/src/exports/amd.js +0 -24
  198. data/spec_app/vendor/assets/bower_components/jquery/src/exports/global.js +0 -32
  199. data/spec_app/vendor/assets/bower_components/jquery/src/intro.js +0 -44
  200. data/spec_app/vendor/assets/bower_components/jquery/src/jquery.js +0 -37
  201. data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/_evalUrl.js +0 -18
  202. data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/support.js +0 -32
  203. data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/var/rcheckableType.js +0 -3
  204. data/spec_app/vendor/assets/bower_components/jquery/src/manipulation.js +0 -580
  205. data/spec_app/vendor/assets/bower_components/jquery/src/offset.js +0 -207
  206. data/spec_app/vendor/assets/bower_components/jquery/src/outro.js +0 -1
  207. data/spec_app/vendor/assets/bower_components/jquery/src/queue/delay.js +0 -22
  208. data/spec_app/vendor/assets/bower_components/jquery/src/queue.js +0 -142
  209. data/spec_app/vendor/assets/bower_components/jquery/src/selector-native.js +0 -172
  210. data/spec_app/vendor/assets/bower_components/jquery/src/selector-sizzle.js +0 -14
  211. data/spec_app/vendor/assets/bower_components/jquery/src/selector.js +0 -1
  212. data/spec_app/vendor/assets/bower_components/jquery/src/serialize.js +0 -111
  213. data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.js +0 -2067
  214. data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.js +0 -3
  215. data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.map +0 -1
  216. data/spec_app/vendor/assets/bower_components/jquery/src/traversing/findFilter.js +0 -100
  217. data/spec_app/vendor/assets/bower_components/jquery/src/traversing/var/rneedsContext.js +0 -6
  218. data/spec_app/vendor/assets/bower_components/jquery/src/traversing.js +0 -199
  219. data/spec_app/vendor/assets/bower_components/jquery/src/var/arr.js +0 -3
  220. data/spec_app/vendor/assets/bower_components/jquery/src/var/class2type.js +0 -4
  221. data/spec_app/vendor/assets/bower_components/jquery/src/var/concat.js +0 -5
  222. data/spec_app/vendor/assets/bower_components/jquery/src/var/hasOwn.js +0 -5
  223. data/spec_app/vendor/assets/bower_components/jquery/src/var/indexOf.js +0 -5
  224. data/spec_app/vendor/assets/bower_components/jquery/src/var/pnum.js +0 -3
  225. data/spec_app/vendor/assets/bower_components/jquery/src/var/push.js +0 -5
  226. data/spec_app/vendor/assets/bower_components/jquery/src/var/rnotwhite.js +0 -3
  227. data/spec_app/vendor/assets/bower_components/jquery/src/var/slice.js +0 -5
  228. data/spec_app/vendor/assets/bower_components/jquery/src/var/strundefined.js +0 -3
  229. data/spec_app/vendor/assets/bower_components/jquery/src/var/support.js +0 -4
  230. data/spec_app/vendor/assets/bower_components/jquery/src/var/toString.js +0 -5
  231. data/spec_app/vendor/assets/bower_components/jquery/src/wrap.js +0 -79
  232. 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 contains Unpoly's core functions to [change](/up.replace) or
6
- [destroy](/up.destroy) page fragments via JavaScript.
5
+ This module exposes a low-level Javascript API to [change](/up.replace) or
6
+ [destroy](/up.destroy) page fragments.
7
7
 
8
- Other Unpoly modules (like [`up.link`](/up.link) or [`up.modal`](/up.modal))
9
- build upon this module to offer higher level API functions.
10
-
11
- @class up.flow
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.flow = (($) ->
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.flow.config
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.flow.source
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.flow.resolveSelector
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 options.origin is missing", '&', selector)
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, options)
256
+ processResponse(true, target, url, request, xhr, successOptions)
241
257
 
242
258
  onFailure = (xhr, textStatus, errorThrown) ->
243
- processResponse(false, failTarget, url, request, xhr, options)
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.title = u.titleFromXhr(xhr) if shouldExtractTitle(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(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
- promise = u.resolvedPromise()
353
- promise = promise.then(options.beforeSwap) if options.beforeSwap
354
- promise = promise.then -> updateHistory(options)
355
- promise = promise.then ->
356
- swapPromises = []
357
- for step in parseImplantSteps(selector, options)
358
- up.log.group 'Updating %s', step.selector, ->
359
- $old = findOldFragment(step.selector, options)
360
- $new = response.first(step.selector)
361
- if $old && $new
362
- filterScripts($new, options)
363
- swapPromise = swapElements($old, $new, step.pseudoClass, step.transition, options)
364
- swapPromises.push(swapPromise)
365
- options.reveal = false
366
- # Delay all further links in the promise chain until all fragments have been swapped
367
- return $.when(swapPromises...)
368
- promise = promise.then(options.afterSwap) if options.afterSwap
369
- promise
370
-
371
- findOldFragment = (selector, options) ->
372
- first(selector, options) || oldFragmentNotFound(selector, options)
373
-
374
- oldFragmentNotFound = (selector, options) ->
375
- if options.requireMatch
376
- layerProse = options.layer
377
- layerProse = 'page, modal or popup' if layerProse == 'auto'
378
- message = "Could not find selector %s in the current #{layerProse}"
379
- if message[0] == '#'
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, options) ->
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
- updateHistory = (options) ->
422
+ updateHistoryAndTitle = (options) ->
411
423
  options = u.options(options, historyMethod: 'push')
412
- if options.history
413
- up.history[options.historyMethod](options.history)
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.replaceWith($new)
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(selectorOrElement, options.origin)
737
+ firstInPriority(resolved, options.origin)
744
738
  else
745
- firstInLayer(selectorOrElement, options.layer)
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
- updateHistory(options)
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.flow.replace
917
- up.extract = up.flow.extract
918
- up.reload = up.flow.reload
919
- up.destroy = up.flow.destroy
920
- up.first = up.flow.first
921
- up.hello = up.flow.hello
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.navigation
36
+ @class up.feedback
37
37
  ###
38
- up.navigation = (($) ->
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.navigation.config
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.navigation.start($button);
147
+ up.feedback.start($button);
148
148
  up.ajax(...).always(function() {
149
- up.navigation.stop($button);
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.navigation.start($button, function() {
157
+ up.feedback.start($button, function() {
158
158
  up.ajax(...);
159
159
  });
160
160
  });
161
161
 
162
- @method up.navigation.start
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.navigation.stop).
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.navigation.stop
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'