unpoly-rails 1.0.3 → 2.0.0.pre.rc2

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 (344) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/CHANGELOG.md +43 -25
  4. data/README.md +5 -6
  5. data/README_RAILS.md +295 -14
  6. data/dist/unpoly-bootstrap3.css +9 -14
  7. data/dist/unpoly-bootstrap3.js +4 -18
  8. data/dist/unpoly-bootstrap3.min.css +1 -1
  9. data/dist/unpoly-bootstrap3.min.js +1 -1
  10. data/dist/unpoly-bootstrap4.css +9 -0
  11. data/dist/unpoly-bootstrap4.js +16 -0
  12. data/dist/unpoly-bootstrap4.min.css +1 -0
  13. data/dist/unpoly-bootstrap4.min.js +1 -0
  14. data/dist/unpoly-bootstrap5.css +9 -0
  15. data/dist/unpoly-bootstrap5.js +14 -0
  16. data/dist/unpoly-bootstrap5.min.css +1 -0
  17. data/dist/unpoly-bootstrap5.min.js +1 -0
  18. data/dist/unpoly-migrate.js +1213 -0
  19. data/dist/unpoly-migrate.min.js +1 -0
  20. data/dist/unpoly.css +109 -140
  21. data/dist/unpoly.js +15376 -10484
  22. data/dist/unpoly.min.css +1 -1
  23. data/dist/unpoly.min.js +6 -4
  24. data/lib/unpoly/rails/change/cache.rb +26 -0
  25. data/lib/unpoly/rails/change/context.rb +80 -0
  26. data/lib/unpoly/rails/change/field.rb +117 -0
  27. data/lib/unpoly/rails/change/field_definition.rb +74 -0
  28. data/lib/unpoly/rails/change/layer.rb +60 -0
  29. data/lib/unpoly/rails/change.rb +372 -0
  30. data/lib/unpoly/rails/controller.rb +47 -0
  31. data/lib/unpoly/rails/error.rb +5 -0
  32. data/lib/unpoly/rails/request_echo_headers.rb +2 -2
  33. data/lib/unpoly/rails/version.rb +1 -1
  34. data/lib/unpoly/tasks.rb +45 -0
  35. data/lib/unpoly-rails.rb +9 -3
  36. metadata +42 -316
  37. data/.gitignore +0 -10
  38. data/.ruby-version +0 -1
  39. data/Gemfile +0 -7
  40. data/Gemfile.lock +0 -39
  41. data/Rakefile +0 -154
  42. data/bower.json +0 -27
  43. data/design/animation-ghosting.txt +0 -72
  44. data/design/design.txt +0 -34
  45. data/design/draft.html.erb +0 -48
  46. data/design/draft.rb +0 -9
  47. data/design/es6.js +0 -32
  48. data/design/ghost-debugging.txt +0 -118
  49. data/design/homepage.txt +0 -236
  50. data/design/ie11.txt +0 -9
  51. data/design/measure_import_node.js +0 -330
  52. data/design/measure_jquery/element_list.js +0 -41
  53. data/design/measure_jquery/up.on_vs_addEventListener.js +0 -56
  54. data/design/positioning.txt +0 -28
  55. data/design/query-params-in-form-actions/cases.html +0 -125
  56. data/design/rename.txt +0 -0
  57. data/design/test_rejected_promise.txt +0 -5
  58. data/design/unpoly errors.txt +0 -19
  59. data/lib/assets/javascripts/unpoly/browser.coffee.erb +0 -240
  60. data/lib/assets/javascripts/unpoly/classes/body_shifter.coffee +0 -45
  61. data/lib/assets/javascripts/unpoly/classes/cache.coffee +0 -127
  62. data/lib/assets/javascripts/unpoly/classes/compile_pass.coffee +0 -93
  63. data/lib/assets/javascripts/unpoly/classes/config.coffee +0 -9
  64. data/lib/assets/javascripts/unpoly/classes/css_transition.coffee +0 -118
  65. data/lib/assets/javascripts/unpoly/classes/divertible_chain.coffee +0 -39
  66. data/lib/assets/javascripts/unpoly/classes/event_listener.coffee +0 -116
  67. data/lib/assets/javascripts/unpoly/classes/extract_cascade.coffee +0 -86
  68. data/lib/assets/javascripts/unpoly/classes/extract_plan.coffee +0 -111
  69. data/lib/assets/javascripts/unpoly/classes/field_observer.coffee +0 -80
  70. data/lib/assets/javascripts/unpoly/classes/focus_follower.coffee +0 -29
  71. data/lib/assets/javascripts/unpoly/classes/follow_variant.coffee +0 -64
  72. data/lib/assets/javascripts/unpoly/classes/html_parser.coffee +0 -46
  73. data/lib/assets/javascripts/unpoly/classes/motion_controller.coffee +0 -157
  74. data/lib/assets/javascripts/unpoly/classes/params.coffee.erb +0 -544
  75. data/lib/assets/javascripts/unpoly/classes/record.coffee +0 -22
  76. data/lib/assets/javascripts/unpoly/classes/rect.js +0 -21
  77. data/lib/assets/javascripts/unpoly/classes/request.coffee +0 -247
  78. data/lib/assets/javascripts/unpoly/classes/response.coffee +0 -157
  79. data/lib/assets/javascripts/unpoly/classes/reveal_motion.coffee +0 -102
  80. data/lib/assets/javascripts/unpoly/classes/scroll_motion.coffee +0 -67
  81. data/lib/assets/javascripts/unpoly/classes/selector.coffee +0 -60
  82. data/lib/assets/javascripts/unpoly/classes/store/memory.coffee +0 -26
  83. data/lib/assets/javascripts/unpoly/classes/store/session.coffee +0 -59
  84. data/lib/assets/javascripts/unpoly/classes/tether.coffee +0 -105
  85. data/lib/assets/javascripts/unpoly/classes/url_set.coffee +0 -32
  86. data/lib/assets/javascripts/unpoly/cookie.coffee +0 -56
  87. data/lib/assets/javascripts/unpoly/element.coffee.erb +0 -1129
  88. data/lib/assets/javascripts/unpoly/event.coffee.erb +0 -445
  89. data/lib/assets/javascripts/unpoly/feedback.coffee +0 -353
  90. data/lib/assets/javascripts/unpoly/form.coffee.erb +0 -1084
  91. data/lib/assets/javascripts/unpoly/fragment.coffee.erb +0 -928
  92. data/lib/assets/javascripts/unpoly/framework.coffee +0 -65
  93. data/lib/assets/javascripts/unpoly/history.coffee +0 -268
  94. data/lib/assets/javascripts/unpoly/legacy.coffee +0 -60
  95. data/lib/assets/javascripts/unpoly/link.coffee.erb +0 -622
  96. data/lib/assets/javascripts/unpoly/log.coffee +0 -253
  97. data/lib/assets/javascripts/unpoly/modal.coffee.erb +0 -827
  98. data/lib/assets/javascripts/unpoly/motion.coffee.erb +0 -668
  99. data/lib/assets/javascripts/unpoly/namespace.coffee.erb +0 -5
  100. data/lib/assets/javascripts/unpoly/popup.coffee.erb +0 -515
  101. data/lib/assets/javascripts/unpoly/protocol.coffee +0 -300
  102. data/lib/assets/javascripts/unpoly/proxy.coffee +0 -672
  103. data/lib/assets/javascripts/unpoly/radio.coffee +0 -60
  104. data/lib/assets/javascripts/unpoly/rails.coffee +0 -24
  105. data/lib/assets/javascripts/unpoly/syntax.coffee.erb +0 -476
  106. data/lib/assets/javascripts/unpoly/toast.coffee +0 -67
  107. data/lib/assets/javascripts/unpoly/tooltip.coffee +0 -276
  108. data/lib/assets/javascripts/unpoly/util.coffee.erb +0 -1677
  109. data/lib/assets/javascripts/unpoly/viewport.coffee.erb +0 -830
  110. data/lib/assets/javascripts/unpoly-bootstrap3/feedback-ext.coffee +0 -5
  111. data/lib/assets/javascripts/unpoly-bootstrap3/form-ext.coffee +0 -1
  112. data/lib/assets/javascripts/unpoly-bootstrap3/modal-ext.coffee +0 -14
  113. data/lib/assets/javascripts/unpoly-bootstrap3/viewport-ext.coffee +0 -5
  114. data/lib/assets/javascripts/unpoly-bootstrap3.coffee +0 -2
  115. data/lib/assets/javascripts/unpoly.coffee +0 -28
  116. data/lib/assets/stylesheets/unpoly/close.sass +0 -2
  117. data/lib/assets/stylesheets/unpoly/dom.sass +0 -5
  118. data/lib/assets/stylesheets/unpoly/layout.sass +0 -2
  119. data/lib/assets/stylesheets/unpoly/link.sass +0 -2
  120. data/lib/assets/stylesheets/unpoly/modal.sass +0 -116
  121. data/lib/assets/stylesheets/unpoly/popup.sass +0 -7
  122. data/lib/assets/stylesheets/unpoly/toast.sass +0 -33
  123. data/lib/assets/stylesheets/unpoly/tooltip.sass +0 -62
  124. data/lib/assets/stylesheets/unpoly-bootstrap3/modal-ext.sass +0 -27
  125. data/lib/assets/stylesheets/unpoly-bootstrap3.sass +0 -1
  126. data/lib/assets/stylesheets/unpoly.sass +0 -1
  127. data/lib/unpoly/rails/inspector.rb +0 -149
  128. data/lib/unpoly/rails/inspector_accessor.rb +0 -30
  129. data/package.json +0 -38
  130. data/spec_app/.firefox-version +0 -1
  131. data/spec_app/.gitignore +0 -17
  132. data/spec_app/.rspec +0 -2
  133. data/spec_app/Gemfile +0 -29
  134. data/spec_app/Gemfile.lock +0 -223
  135. data/spec_app/README.rdoc +0 -28
  136. data/spec_app/Rakefile +0 -6
  137. data/spec_app/app/assets/images/.keep +0 -0
  138. data/spec_app/app/assets/images/favicon.png +0 -0
  139. data/spec_app/app/assets/images/grid.png +0 -0
  140. data/spec_app/app/assets/javascripts/bootstrap_manifest.coffee +0 -6
  141. data/spec_app/app/assets/javascripts/integration_test.coffee +0 -5
  142. data/spec_app/app/assets/javascripts/jasmine_specs.coffee +0 -6
  143. data/spec_app/app/assets/stylesheets/_helpers.sass +0 -5
  144. data/spec_app/app/assets/stylesheets/bootstrap_manifest.sass +0 -2
  145. data/spec_app/app/assets/stylesheets/integration_test.sass +0 -88
  146. data/spec_app/app/assets/stylesheets/jasmine_specs.sass +0 -20
  147. data/spec_app/app/controllers/application_controller.rb +0 -14
  148. data/spec_app/app/controllers/binding_test_controller.rb +0 -51
  149. data/spec_app/app/controllers/boot_test_controller.rb +0 -31
  150. data/spec_app/app/controllers/compiler_test_controller.rb +0 -5
  151. data/spec_app/app/controllers/css_test_controller.rb +0 -5
  152. data/spec_app/app/controllers/error_test_controller.rb +0 -5
  153. data/spec_app/app/controllers/form_test/basics_controller.rb +0 -14
  154. data/spec_app/app/controllers/form_test/redirects_controller.rb +0 -17
  155. data/spec_app/app/controllers/form_test/uploads_controller.rb +0 -15
  156. data/spec_app/app/controllers/hash_test_controller.rb +0 -5
  157. data/spec_app/app/controllers/method_test_controller.rb +0 -16
  158. data/spec_app/app/controllers/motion_test_controller.rb +0 -5
  159. data/spec_app/app/controllers/pages_controller.rb +0 -17
  160. data/spec_app/app/controllers/replace_test_controller.rb +0 -5
  161. data/spec_app/app/controllers/reveal_test_controller.rb +0 -5
  162. data/spec_app/app/controllers/scroll_test_controller.rb +0 -5
  163. data/spec_app/app/helpers/application_helper.rb +0 -11
  164. data/spec_app/app/mailers/.keep +0 -0
  165. data/spec_app/app/models/concerns/.keep +0 -0
  166. data/spec_app/app/views/boot_test/defer.erb +0 -18
  167. data/spec_app/app/views/boot_test/module.erb +0 -18
  168. data/spec_app/app/views/boot_test/sync.erb +0 -17
  169. data/spec_app/app/views/compiler_test/timestamp.erb +0 -10
  170. data/spec_app/app/views/css_test/modal.erb +0 -47
  171. data/spec_app/app/views/css_test/modal_contents.erb +0 -5
  172. data/spec_app/app/views/css_test/modal_contents_wide.erb +0 -5
  173. data/spec_app/app/views/css_test/popup.erb +0 -81
  174. data/spec_app/app/views/css_test/popup_contents.erb +0 -5
  175. data/spec_app/app/views/css_test/tooltip.erb +0 -48
  176. data/spec_app/app/views/error_test/trigger.erb +0 -80
  177. data/spec_app/app/views/error_test/unexpected_response.erb +0 -3
  178. data/spec_app/app/views/form_test/basics/new.erb +0 -60
  179. data/spec_app/app/views/form_test/redirects/new.erb +0 -27
  180. data/spec_app/app/views/form_test/redirects/target.erb +0 -6
  181. data/spec_app/app/views/form_test/submission_result.erb +0 -30
  182. data/spec_app/app/views/form_test/uploads/new.erb +0 -44
  183. data/spec_app/app/views/hash_test/unpoly.erb +0 -30
  184. data/spec_app/app/views/hash_test/vanilla.erb +0 -13
  185. data/spec_app/app/views/layouts/integration_test.erb +0 -22
  186. data/spec_app/app/views/layouts/jasmine_rails/spec_runner.html.erb +0 -20
  187. data/spec_app/app/views/method_test/form_target.erb +0 -17
  188. data/spec_app/app/views/method_test/page1.erb +0 -11
  189. data/spec_app/app/views/method_test/page2.erb +0 -6
  190. data/spec_app/app/views/motion_test/animations.erb +0 -16
  191. data/spec_app/app/views/motion_test/transitions.erb +0 -13
  192. data/spec_app/app/views/pages/start.erb +0 -82
  193. data/spec_app/app/views/replace_test/_nav.erb +0 -6
  194. data/spec_app/app/views/replace_test/page1.erb +0 -14
  195. data/spec_app/app/views/replace_test/page2.erb +0 -14
  196. data/spec_app/app/views/replace_test/table.erb +0 -16
  197. data/spec_app/app/views/reveal_test/long1.erb +0 -17
  198. data/spec_app/app/views/reveal_test/long2.erb +0 -17
  199. data/spec_app/app/views/reveal_test/within_document_viewport.erb +0 -24
  200. data/spec_app/app/views/reveal_test/within_overflowing_div_viewport.erb +0 -28
  201. data/spec_app/app/views/scroll_test/long1.erb +0 -30
  202. data/spec_app/bin/bundle +0 -3
  203. data/spec_app/bin/rails +0 -8
  204. data/spec_app/bin/rake +0 -8
  205. data/spec_app/bin/setup +0 -29
  206. data/spec_app/bin/spring +0 -18
  207. data/spec_app/config/application.rb +0 -28
  208. data/spec_app/config/boot.rb +0 -3
  209. data/spec_app/config/database.yml +0 -25
  210. data/spec_app/config/environment.rb +0 -5
  211. data/spec_app/config/environments/development.rb +0 -41
  212. data/spec_app/config/environments/production.rb +0 -79
  213. data/spec_app/config/environments/test.rb +0 -42
  214. data/spec_app/config/initializers/assets.rb +0 -19
  215. data/spec_app/config/initializers/backtrace_silencers.rb +0 -7
  216. data/spec_app/config/initializers/bower_rails.rb +0 -16
  217. data/spec_app/config/initializers/cookies_serializer.rb +0 -3
  218. data/spec_app/config/initializers/filter_parameter_logging.rb +0 -4
  219. data/spec_app/config/initializers/inflections.rb +0 -16
  220. data/spec_app/config/initializers/mime_types.rb +0 -4
  221. data/spec_app/config/initializers/session_store.rb +0 -3
  222. data/spec_app/config/initializers/wrap_parameters.rb +0 -14
  223. data/spec_app/config/locales/en.yml +0 -23
  224. data/spec_app/config/routes.rb +0 -33
  225. data/spec_app/config/secrets.yml +0 -22
  226. data/spec_app/config.ru +0 -4
  227. data/spec_app/db/schema.rb +0 -23
  228. data/spec_app/db/seeds.rb +0 -7
  229. data/spec_app/lib/assets/.keep +0 -0
  230. data/spec_app/lib/tasks/.keep +0 -0
  231. data/spec_app/lib/tasks/cucumber.rake +0 -65
  232. data/spec_app/log/.keep +0 -0
  233. data/spec_app/public/404.html +0 -67
  234. data/spec_app/public/422.html +0 -67
  235. data/spec_app/public/500.html +0 -66
  236. data/spec_app/public/favicon.ico +0 -0
  237. data/spec_app/public/robots.txt +0 -5
  238. data/spec_app/script/cucumber +0 -10
  239. data/spec_app/spec/controllers/binding_test_controller_spec.rb +0 -248
  240. data/spec_app/spec/javascripts/helpers/agent_detector.coffee +0 -20
  241. data/spec_app/spec/javascripts/helpers/async_sequence.js.coffee +0 -103
  242. data/spec_app/spec/javascripts/helpers/browser_switches.js.coffee +0 -21
  243. data/spec_app/spec/javascripts/helpers/enable_logging.js.coffee +0 -2
  244. data/spec_app/spec/javascripts/helpers/fixture.js.coffee +0 -25
  245. data/spec_app/spec/javascripts/helpers/index.js.coffee +0 -1
  246. data/spec_app/spec/javascripts/helpers/jquery_no_conflict.js +0 -1
  247. data/spec_app/spec/javascripts/helpers/knife.js.coffee +0 -69
  248. data/spec_app/spec/javascripts/helpers/last_request.js.coffee +0 -25
  249. data/spec_app/spec/javascripts/helpers/mock_ajax.js.coffee +0 -8
  250. data/spec_app/spec/javascripts/helpers/mock_clock.js.coffee +0 -2
  251. data/spec_app/spec/javascripts/helpers/parse_form_data.js.coffee +0 -24
  252. data/spec_app/spec/javascripts/helpers/promise_state.js +0 -18
  253. data/spec_app/spec/javascripts/helpers/protect_jasmine_runner.coffee +0 -12
  254. data/spec_app/spec/javascripts/helpers/remove_body_margin.js.coffee +0 -8
  255. data/spec_app/spec/javascripts/helpers/reset_history.js.coffee +0 -23
  256. data/spec_app/spec/javascripts/helpers/reset_knife.js.coffee +0 -2
  257. data/spec_app/spec/javascripts/helpers/reset_up.js.coffee +0 -25
  258. data/spec_app/spec/javascripts/helpers/restore_body_scroll.js.coffee +0 -5
  259. data/spec_app/spec/javascripts/helpers/show_lib_versions.coffee +0 -12
  260. data/spec_app/spec/javascripts/helpers/spec_util.coffee +0 -47
  261. data/spec_app/spec/javascripts/helpers/to_be_around.js.coffee +0 -8
  262. data/spec_app/spec/javascripts/helpers/to_be_array.coffee +0 -5
  263. data/spec_app/spec/javascripts/helpers/to_be_attached.coffee +0 -9
  264. data/spec_app/spec/javascripts/helpers/to_be_blank.js.coffee +0 -8
  265. data/spec_app/spec/javascripts/helpers/to_be_detached.coffee +0 -9
  266. data/spec_app/spec/javascripts/helpers/to_be_element.js.coffee +0 -8
  267. data/spec_app/spec/javascripts/helpers/to_be_error.coffee +0 -8
  268. data/spec_app/spec/javascripts/helpers/to_be_given.js.coffee +0 -8
  269. data/spec_app/spec/javascripts/helpers/to_be_hidden.js.coffee +0 -8
  270. data/spec_app/spec/javascripts/helpers/to_be_jquery.js.coffee +0 -5
  271. data/spec_app/spec/javascripts/helpers/to_be_missing.js.coffee +0 -8
  272. data/spec_app/spec/javascripts/helpers/to_be_present.js.coffee +0 -8
  273. data/spec_app/spec/javascripts/helpers/to_be_scrolled_to.coffee +0 -11
  274. data/spec_app/spec/javascripts/helpers/to_be_visible.js.coffee +0 -9
  275. data/spec_app/spec/javascripts/helpers/to_contain.js.coffee +0 -8
  276. data/spec_app/spec/javascripts/helpers/to_end_with.js.coffee +0 -11
  277. data/spec_app/spec/javascripts/helpers/to_equal_jquery.js.coffee +0 -8
  278. data/spec_app/spec/javascripts/helpers/to_equal_node_list.coffee +0 -7
  279. data/spec_app/spec/javascripts/helpers/to_equal_via_is_equal.js.coffee +0 -7
  280. data/spec_app/spec/javascripts/helpers/to_have_class.js.coffee +0 -10
  281. data/spec_app/spec/javascripts/helpers/to_have_descendant.js.coffee +0 -10
  282. data/spec_app/spec/javascripts/helpers/to_have_length.js.coffee +0 -8
  283. data/spec_app/spec/javascripts/helpers/to_have_opacity.coffee +0 -15
  284. data/spec_app/spec/javascripts/helpers/to_have_own_property.js.coffee +0 -8
  285. data/spec_app/spec/javascripts/helpers/to_have_request_method.js.coffee +0 -16
  286. data/spec_app/spec/javascripts/helpers/to_have_text.js.coffee +0 -9
  287. data/spec_app/spec/javascripts/helpers/to_have_unhandled_rejections.coffee +0 -18
  288. data/spec_app/spec/javascripts/helpers/to_match_list.coffee +0 -14
  289. data/spec_app/spec/javascripts/helpers/to_match_selector.coffee +0 -8
  290. data/spec_app/spec/javascripts/helpers/to_match_text.js.coffee +0 -13
  291. data/spec_app/spec/javascripts/helpers/to_match_url.coffee +0 -14
  292. data/spec_app/spec/javascripts/helpers/trigger.js.coffee +0 -200
  293. data/spec_app/spec/javascripts/helpers/wait_until_dom_ready.js.coffee +0 -5
  294. data/spec_app/spec/javascripts/support/jasmine.yml +0 -51
  295. data/spec_app/spec/javascripts/up/browser_spec.js.coffee +0 -150
  296. data/spec_app/spec/javascripts/up/classes/cache_spec.js.coffee +0 -82
  297. data/spec_app/spec/javascripts/up/classes/config_spec.coffee +0 -24
  298. data/spec_app/spec/javascripts/up/classes/divertible_chain_spec.coffee +0 -45
  299. data/spec_app/spec/javascripts/up/classes/focus_tracker_spec.coffee +0 -34
  300. data/spec_app/spec/javascripts/up/classes/params_spec.coffee +0 -557
  301. data/spec_app/spec/javascripts/up/classes/request_spec.coffee +0 -50
  302. data/spec_app/spec/javascripts/up/classes/scroll_motion_spec.js.coffee +0 -51
  303. data/spec_app/spec/javascripts/up/classes/store/memory_spec.js.coffee +0 -70
  304. data/spec_app/spec/javascripts/up/classes/store/session_spec.js.coffee +0 -114
  305. data/spec_app/spec/javascripts/up/element_spec.coffee +0 -897
  306. data/spec_app/spec/javascripts/up/event_spec.js.coffee +0 -530
  307. data/spec_app/spec/javascripts/up/feedback_spec.js.coffee +0 -401
  308. data/spec_app/spec/javascripts/up/form_spec.js.coffee +0 -1527
  309. data/spec_app/spec/javascripts/up/fragment_spec.js.coffee +0 -2624
  310. data/spec_app/spec/javascripts/up/history_spec.js.coffee +0 -340
  311. data/spec_app/spec/javascripts/up/jquery_spec.js.coffee +0 -4
  312. data/spec_app/spec/javascripts/up/legacy_spec.js.coffee +0 -27
  313. data/spec_app/spec/javascripts/up/link_spec.js.coffee +0 -1098
  314. data/spec_app/spec/javascripts/up/log_spec.js.coffee +0 -119
  315. data/spec_app/spec/javascripts/up/modal_spec.js.coffee +0 -939
  316. data/spec_app/spec/javascripts/up/motion_spec.js.coffee +0 -582
  317. data/spec_app/spec/javascripts/up/popup_spec.js.coffee +0 -508
  318. data/spec_app/spec/javascripts/up/protocol_spec.js.coffee +0 -39
  319. data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +0 -1145
  320. data/spec_app/spec/javascripts/up/radio_spec.js.coffee +0 -212
  321. data/spec_app/spec/javascripts/up/rails_spec.js.coffee +0 -118
  322. data/spec_app/spec/javascripts/up/spec_spec.js.coffee +0 -9
  323. data/spec_app/spec/javascripts/up/syntax_spec.js.coffee +0 -304
  324. data/spec_app/spec/javascripts/up/toast_spec.js.coffee +0 -37
  325. data/spec_app/spec/javascripts/up/tooltip_spec.js.coffee +0 -163
  326. data/spec_app/spec/javascripts/up/util_spec.js.coffee +0 -1434
  327. data/spec_app/spec/javascripts/up/viewport_spec.js.coffee +0 -655
  328. data/spec_app/spec/spec_helper.rb +0 -62
  329. data/spec_app/test/controllers/.keep +0 -0
  330. data/spec_app/test/fixtures/.keep +0 -0
  331. data/spec_app/test/helpers/.keep +0 -0
  332. data/spec_app/test/integration/.keep +0 -0
  333. data/spec_app/test/mailers/.keep +0 -0
  334. data/spec_app/test/models/.keep +0 -0
  335. data/spec_app/test/test_helper.rb +0 -10
  336. data/spec_app/vendor/asset-libs/es6-promise-4.1.6/es6-promise.auto.js +0 -1159
  337. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.bower.json +0 -43
  338. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.gitignore +0 -6
  339. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.npmignore +0 -10
  340. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.pairs +0 -6
  341. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.travis.yml +0 -56
  342. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/jasmine-ajax.js +0 -790
  343. data/spec_app/vendor/assets/.keep +0 -0
  344. data/unpoly-rails.gemspec +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 91eeb3a0e727e868391bd42e37a86e7ed8cc1c7f9644a09b22e0a653d36b2ceb
4
- data.tar.gz: a0e38887ff10a26a461311a4f73cb6e7d17ddac40fffb0a7e44e77a674a73c8f
3
+ metadata.gz: e123573f3acd82d20b58f2d570d1766ef956876772a4d088677d8e64651c80e0
4
+ data.tar.gz: 441e8457e27007896df9dbcc35a2c3bacfff0877ba52f970aa746747874c49f7
5
5
  SHA512:
6
- metadata.gz: c00b889747a5cd70a5c93e6a31478dc609aad7046c9ce4334724f6b39ef398678246936b8152c0a08d1284976a736521ce5f994959b19d66f384f0625f349c40
7
- data.tar.gz: a65dda307897f584bee082d909ddfcbc5fc606487ead7916a298d7d10445e83f5c60bc63a60bed896ef26c6c57d5c2c52038eca271bf0bac6d23fc7c2aa2fc64
6
+ metadata.gz: a48ef185c79706b17187d8c6e95f343d91dc6ac4a21a15c205db8328e10f1448a1d68f39f8e1d3465dec6c0e2894c7df870dbd37cdf6e9f91d7fe918a2d6ea14
7
+ data.tar.gz: a0f8d07f0273e049beac32d1648e71250d3915cb9a68313b8ee1e69ae1b503af64835a91a80114e6230b82e2189da834c2373847bd36b0e4fc73eb4f269b81bd
data/.yardopts CHANGED
@@ -1 +1 @@
1
- --markup=markdown --main=README_RAILS.md
1
+ --markup=markdown --main=README_RAILS.md --exclude .
data/CHANGELOG.md CHANGED
@@ -6,38 +6,57 @@ Changes to this project will be documented in this file.
6
6
  You may browse a formatted and hyperlinked version of this file at <https://unpoly.com/changes>.
7
7
 
8
8
 
9
- 1.0.3
9
+ 2.0.0
10
10
  -----
11
11
 
12
- This maintenance release addresses two issues that were introduced in version 1.0.0:
13
-
14
- - Unpoly can now be loaded with `<script defer>`. This can be used to load your scripts without blocking the DOM parser.
15
- - Unpoly can now be loaded with `<script type="module">`. This can be used deliver a modern JS build to modern browsers only.
16
-
17
-
18
- 1.0.1
19
- -----
20
-
21
- This is a maintenance release for Unpoly 1. Expect little to no additional changes for this legacy version. New features will only be added to Unpoly 2.
22
-
23
- - `up.request()` will now send Unpoly's version number as an `X-Up-Version` request header. Since `X-Up-Target` is optional in Unpoly 2, server-side integration libraries can look for `X-Up-Version` to reliably detect a fragment update for both Unpoly 1 and 2.
24
- - Fix a bug where the Unpoly banner would still be printed to the development console when `up.log.config.banner = false` is set. (fix by @adam12)
12
+ - up.network.config.slowDelay is now 800 (up from 300)
13
+ - up.network.config.cacheSize is now 50 (down from 70)
14
+ - up.network.isBusy() / isIdle() takes preload events into account
15
+ - up.observe() callback may return a promise that will prevent callback calls while running
16
+ - `[aria-label]` attributes are no longer used to build a target selector
17
+ - Options removed form modals: up-width, up-max-width, up-height. Use up-size or up-class.
18
+ - Failed responses now change the URL
19
+ - TODO ...
20
+ - up.history.config.restoreScroll has been removed.
21
+ - Feedback works when a layer has no history
22
+ - Layer A11Y
23
+ - inert
24
+ - aria-hidden
25
+ - focus new
26
+ - focus return on close
27
+ - up.nav sets [aria-current]
28
+ - up.history.config.enabled
29
+ - Requests sent by Unpoly no longer have a `X-Requested-With: XMLHttpRequest` header.
30
+ If you need that old behavior: up.on('up:request:load', function(event) { event.request.headers['X-Requested-With'] = 'XMLHttpRequest' })
31
+ - up.network.config.requestMetaKeys
32
+ - up:link:follow is no longer sent when preloading, up:link:preload still is
33
+ - Preserve focus when validating forms; Add { focus } option for fragment update
34
+ - up.Request.prototype.isFatalError() has been removed without replacement. Network errors now reject with an error, and not a response.
35
+ - [up-main], [up-main=overlay], [up-main=modal]
36
+ - parseSelector can parse attribute selectors with prefix, infix, suffix, space-separated, dash-separated
37
+ - up.validate() may now be called with a form element
38
+ - validating emits up:form:validate instead of up:form:submit
39
+ - When a compiler throws an error, other compilers will now run anyway
40
+ - When a destructor throws an error, other destructors will now run anyway
41
+ - Bootstrap integration
42
+ - Minimal: active, nav, navbar
43
+ - Bootstrap modal styles are no longer used for Unpoly modals
44
+ - Now supports three major Bootstrap versions:
45
+ - unpoly-bootstrap3.js
46
+ - unpoly-bootstrap4.js
47
+ - unpoly-bootstrap5.js
48
+ - Hungry elements no longer get the transition by default. You need to set [up-transition] on the hungry element.
49
+ - Rejections are now shown if the log is enabled
50
+ - up.on() can passive: true
51
+ - Preloads on touchstart and mousedown
52
+ - Digit groups separators (`60_000`) are a stage 3 ES6 feature and also supported in number attributes.
25
53
 
26
54
 
27
55
  1.0.0
28
56
  -----
29
57
 
30
- For six years Unpoly has been released under a 0.x version number. To establish the maturity and stability of the project, we're releasing today's version as 1.0.0.
31
-
32
- There are only three changes from 0.62.1:
33
-
34
- - Fix a bug where `up.util.escapeHTML()` would not escape single quotes.
35
- - Unpoly will no longer wait a JavaScript execution task to boot after `DOMContentLoaded`. This may improve the stability of test suites that previously interacted with the page too soon.
36
- - You may now disable the Unpoly banner in the development console with `up.log.config.banner = false`. (change by @hfjallemark).
58
+ - TODO
37
59
 
38
- This is the last release of the 0.x API line. We're tracking its code in the [`1.x-stable`](https://github.com/unpoly/unpoly/tree/1.x-stable), but expect little to no changes in the future.
39
-
40
- The next release will be [Unpoly 2](https://triskweline.de/unpoly2-slides). It will include major (but mostly backwards compatible) renovations to its API, unlocking many use cases that were not possible with Unpoly 1.
41
60
 
42
61
 
43
62
  0.62.1
@@ -107,7 +126,6 @@ This release also exposes some convenience functions and selectors:
107
126
  [`input[up-validate]`](/input-up-validate) was supported.
108
127
 
109
128
 
110
-
111
129
  0.60.3
112
130
  ------
113
131
 
data/README.md CHANGED
@@ -33,7 +33,6 @@ Install dependencies for tests:
33
33
 
34
34
  - Install Ruby 2.3.8
35
35
  - Install Bundler by running `gem install bundler`
36
- - Install Node.js (required for building the library)
37
36
  - `cd` into `spec_app`
38
37
  - Install dependencies by running `bundle install`
39
38
 
@@ -51,9 +50,11 @@ To run RSpec tests for the `unpoly-rails` gem:
51
50
 
52
51
  ### Making a new release
53
52
 
54
- We are currently feeding the following release channels:
53
+ We are currently feeding four release channels:
55
54
 
55
+ - Manual download from GitHub
56
56
  - npm
57
+ - Bower (which is based on Git and version tags)
57
58
  - Rubygems (as the `unpoly-rails` gem)
58
59
 
59
60
  We always release to all channel simultaneously.
@@ -63,7 +64,6 @@ To prepare a new version:
63
64
  1. Edit `lib/unpoly/rails/version.rb` and bump the version number. Use [semantic versioning](http://semver.org/).
64
65
  2. Add an entry to `CHANGELOG.md`
65
66
  3. Commit and push the version bump and `CHANGELOG.md`
66
- 4. Merge the relevant `CHANGEOG.md` entries to the `master` branch (since [unpoly.com](https://unpoly.com) builds from there)
67
67
 
68
68
  Now we can release a new version. **This requires your to be logged into Rubygems and npm**:
69
69
 
@@ -78,9 +78,8 @@ If you have done this process a few times and know what you're doing, you can ca
78
78
 
79
79
  After you have published all release channels, remember to:
80
80
 
81
- 1. Deploy to [unpoly.com](https://unpoly.com/)
82
- 2. Deploy to [v1.unpoly.com](https://unpoly.com/)
83
- 3. Send a message to the [E-mail group](https://groups.google.com/group/unpoly) with the title "Unpoly X.Y.Z released". You can copy the relevant CHANGELOG part from [here](http://localhost:4567/changes_google_groups).
81
+ 1. Update [unpoly.com](https://unpoly.com/) so users see the new version, CDN link and CHANGELOG.
82
+ 2. Send a message to the [E-mail group](https://groups.google.com/group/unpoly) with the title "Unpoly X.Y.Z released". You can copy the relevant CHANGELOG part from [here](http://localhost:4567/changes_google_groups).
84
83
 
85
84
 
86
85
  Credits
data/README_RAILS.md CHANGED
@@ -1,7 +1,9 @@
1
1
  unpoly-rails: Ruby on Rails bindings for Unpoly
2
2
  ===============================================
3
3
 
4
- [Unpoly](https://unpoly.com) is a backend-agnostic [unobtrusive JavaScript](https://en.wikipedia.org/wiki/Unobtrusive_JavaScript) framework. `unpoly-rails` gives your [Ruby on Rails](http://rubyonrails.org/) application some convenience candy when you are using Unpoly in your frontend.
4
+ [Unpoly](https://unpoly.com) is a backend-agnostic [unobtrusive JavaScript](https://en.wikipedia.org/wiki/Unobtrusive_JavaScript) framework. `unpoly-rails` gives a [Ruby on Rails](http://rubyonrails.org/) application some convenience methods to communicate with an Unpoly-enhanced frontend.
5
+
6
+ Note that the bindings provided by `unpoly-rails` are entirely optional. You are free to use Unpoly with Rails without the `unpoly-rails` gem.
5
7
 
6
8
 
7
9
  Features
@@ -11,28 +13,78 @@ The methods documented below are available in all controllers, views and helpers
11
13
 
12
14
  ### Detecting a fragment update
13
15
 
14
- To test whether the current request is a [fragment update](https://unpoly.com/up.link):
16
+ Use `up?` to test whether the current request is a [fragment update](https://unpoly.com/up.link):
15
17
 
16
18
  ```ruby
17
- up?
19
+ up? # => true or false
18
20
  ```
19
21
 
20
- To retrieve the CSS selector that is being [updated](https://unpoly.com/up.link):
22
+ To retrieve the CSS selector that is being [updated](https://unpoly.com/up.link), use `up.target`:
21
23
 
22
24
  ```ruby
23
- up.target
25
+ up.target # => '.content'
24
26
  ```
25
27
 
26
- The Unpoly frontend will expect an HTML response containing an element that matches this selector. If no such element is found, an error is shown to the user.
27
-
28
- Server-side code is free to optimize its response by only returning HTML that matches this selector:
28
+ The Unpoly frontend will expect an HTML response containing an element that matches this selector. Your Rails app is free to render a smaller response that only contains HTML matching the targeted selector. You may call `up.target?` to test whether a given CSS selector has been targeted:
29
29
 
30
30
  ```ruby
31
31
  if up.target?('.sidebar')
32
- = render 'expensive_sidebar_partial'
32
+ render('expensive_sidebar_partial')
33
+ end
34
+ ```
35
+
36
+ Fragment updates may target different selectors for successful (HTTP status `200 OK`) and failed (status `4xx` or `5xx`) responses.
37
+ Use these methods to inspect the target for failed responses:
38
+
39
+ - `up.fail_target`: The CSS selector targeted for a failed response
40
+ - `up.fail_target?(selector)`: Whether the given selector is targeted for a failed response
41
+ - `up.any_target?(selector)`: Whether the given selector is targeted for either a successful or a failed response
42
+
43
+ ### Changing the render target
44
+
45
+ The server may instruct the frontend to render a different target by assigning a new CSS selector to the `up.target` property:
46
+
47
+ ```ruby
48
+ unless signed_in?
49
+ up.target = 'body'
50
+ render 'sign_in'
51
+ end
52
+ ```
53
+
54
+ The frontend will use the server-provided target for both successful (HTTP status `200 OK`) and failed (status `4xx` or `5xx`) responses.
55
+
56
+
57
+ ### Rendering nothing
58
+
59
+ Sometimes it's OK to render nothing, e.g. when you know that the current layer is to be closed.
60
+
61
+ In this case you may call `up.render_nothing`:
62
+
63
+ ```ruby
64
+ class NotesController < ApplicationController
65
+ def create
66
+ @note = Note.new(note_params)
67
+ if @note.save
68
+ if up.layer.overlay?
69
+ up.accept_layer(@note.id)
70
+ up.render_nothing
71
+ else
72
+ redirect_to @note
73
+ end
74
+ end
75
+ end
33
76
  end
34
77
  ```
35
78
 
79
+ This will render a 200 OK response with a header `X-Up-Target: none` and an empty body.
80
+
81
+ You may render nothing with a different HTTP status by passing a `:status` option:
82
+
83
+ ```
84
+ up.render_nothing(status: :bad_request)
85
+ ```
86
+
87
+
36
88
  ### Pushing a document title to the client
37
89
 
38
90
  To force Unpoly to set a document title when processing the response:
@@ -43,6 +95,36 @@ up.title = 'Title from server'
43
95
 
44
96
  This is useful when you skip rendering the `<head>` in an Unpoly request.
45
97
 
98
+ ### Emitting events on the frontend
99
+
100
+ You may use `up.emit` to emit an event on the `document` after the
101
+ fragment was updated:
102
+
103
+ ```ruby
104
+ class UsersController < ApplicationController
105
+
106
+ def show
107
+ @user = User.find(params[:id])
108
+ up.emit('user:selected', id: @user.id)
109
+ end
110
+
111
+ end
112
+ ```
113
+
114
+ If you wish to emit an event on the current [layer](https://unpoly.com/up.layer)
115
+ instead of the `document`, use `up.layer.emit`:
116
+
117
+ ```ruby
118
+ class UsersController < ApplicationController
119
+
120
+ def show
121
+ @user = User.find(params[:id])
122
+ up.layer.emit('user:selected', id: @user.id)
123
+ end
124
+
125
+ end
126
+ ```
127
+
46
128
  ### Detecting an Unpoly form validation
47
129
 
48
130
  To test whether the current request is a [form validation](https://unpoly.com/input-up-validate):
@@ -72,12 +154,211 @@ class UsersController < ApplicationController
72
154
  end
73
155
  ```
74
156
 
157
+ ### Detecting a fragment reload
158
+
159
+ To test whether the current request was made to [reload](https://unpoly.com/up.reload) or [poll](https://unpoly.com/up-poll) a fragment:
160
+
161
+ ```ruby
162
+ up.reload?
163
+ ```
164
+
165
+ You also retrieve the time when the fragment being reloaded was previously inserted into the DOM:
166
+
167
+ ```ruby
168
+ up.reload_from_time # returns a Time object
169
+ ```
170
+
171
+ The server can compare the time from the request with the time of the last data update.
172
+ If no more recent data is available, the server can [render nothing](/X-Up-Target):
173
+
174
+ ```ruby
175
+ class MessagesController < ApplicationController
176
+
177
+ def index
178
+ if up.reload_from_time == current_user.last_message_at
179
+ up.render_nothing
180
+ else
181
+ @messages = current_user.messages.order(time: :desc).to_a
182
+ render 'index'
183
+ end
184
+ end
185
+
186
+ end
187
+ ```
188
+
189
+ Only rendering when needed saves <b>CPU time</b> on your server, which spends most of its response time rendering HTML.
190
+
191
+ This also reduces the <b>bandwidth cost</b> for a request/response exchange to **~1 KB**.
192
+
193
+
194
+ ### Working with context
195
+
196
+ Calling `up.context` will return the [context](https://unpoly.com/up.context) object of the targeted layer.
197
+
198
+ The context is a JSON object shared between the frontend and the server.
199
+ It persists for a series of Unpoly navigation, but is cleared when the user makes a full page load.
200
+ Different Unpoly [layers](https://unpoly.com/up.layer) will usually have separate context objects,
201
+ although layers may choose to share their context scope.
202
+
203
+ You may read and change the context object. Changes will be sent to the frontend with your response.
204
+
205
+ ```ruby
206
+ class GamesController < ApplicationController
207
+
208
+ def restart
209
+ up.context[:lives] = 3
210
+ render 'stage1'
211
+ end
212
+
213
+ end
214
+ ```
215
+
216
+ Keys can be accessed as either strings or symbols:
217
+
218
+ ```ruby
219
+ puts "You have " + up.layer.context[:lives] + " lives left"
220
+ puts "You have " + up.layer.context['lives'] + " lives left"
221
+ ````
222
+
223
+ You may delete a key from the frontend by calling `up.context.delete`:
224
+
225
+ ```ruby
226
+ up.context.delete(:foo)
227
+ ````
228
+
229
+ You may replace the entire context by calling `up.context.replace`:
230
+
231
+ ```
232
+ context_from_file = JSON.parse(File.read('context.json))
233
+ up.context.replace(context_from_file)
234
+ ```
235
+
236
+ `up.context` is an alias for `up.layer.context`.
237
+
238
+
239
+ ### Accessing the targeted layer
240
+
241
+ Use the methods below to interact with the [layer](/up.layer) of the fragment being targeted.
242
+
243
+ Note that fragment updates may target different layers for successful (HTTP status `200 OK`) and failed (status `4xx` or `5xx`) responses.
244
+
245
+ #### `up.layer.mode`
246
+
247
+ Returns the [mode](https://unpoly.com/up.layer.mode) of the targeted layer (e.g. `"root"` or `"modal"`).
248
+
249
+ #### `up.layer.root?`
250
+
251
+ Returns whether the targeted layer is the root layer.
252
+
253
+ #### `up.layer.overlay?`
254
+
255
+ Returns whether the targeted layer is an overlay (not the root layer).
256
+
257
+ #### `up.layer.context`
258
+
259
+ Returns the [context](https://unpoly.com/up.context) object of the targeted layer.
260
+ See documentation for `up.context`, which is an alias for `up.layer.context`.
261
+
262
+ #### `up.layer.accept(value)`
263
+
264
+ [Accepts](https://unpoly.com/up.layer.accept) the current overlay.
265
+
266
+ Does nothing if the root layer is targeted.
267
+
268
+ Note that Rails expects every controller action to render or redirect.
269
+ Your action should either call `up.render_nothing` or respond with `text/html` content matching the requested target.
270
+
271
+ #### `up.layer.dismiss(value)`
272
+
273
+ [Dismisses](https://unpoly.com/up.layer.dismisses) the current overlay.
274
+
275
+ Does nothing if the root layer is targeted.
276
+
277
+ Note that Rails expects every controller action to render or redirect.
278
+ Your action should either call `up.render_nothing` or respond with `text/html` content matching the requested target.
279
+
280
+ #### `up.layer.emit(type, options)`
281
+
282
+ [Emits an event](https://unpoly.com/up.layer.emit) on the targeted layer.
283
+
284
+ #### `up.fail_layer.mode`
285
+
286
+ Returns the [mode](https://unpoly.com/up.layer.mode) of the layer targeted for a failed response.
287
+
288
+ #### `up.fail_layer.root?`
289
+
290
+ Returns whether the layer targeted for a failed response is the root layer.
291
+
292
+ #### `up.fail_layer.overlay?`
293
+
294
+ Returns whether the layer targeted for a failed response is an overlay.
295
+
296
+ #### `up.fail_layer.context`
297
+
298
+ Returns the [context](https://unpoly.com/up.context) object of the layer targeted for a failed response.
299
+
300
+
301
+ ### Managing the client-side cache
302
+
303
+ The Unpoly frontend caches server responses for a few minutes, making requests to these URLs return instantly.
304
+ Only `GET` requests are cached. The *entire* cache is cleared after every non-`GET` request (like `POST` or `PUT`).
305
+
306
+ The server may override these defaults. For instance, the server can clear Unpoly's client-side response cache, even for `GET` requests:
307
+
308
+ ```ruby
309
+ up.cache.clear
310
+ ```
311
+
312
+ You may also clear a single page:
313
+
314
+ ```ruby
315
+ up.cache.clear('/notes/1034')
316
+ ```
317
+
318
+ You may also clear all entries matching a URL pattern:
319
+
320
+ ```ruby
321
+ up.cache.clear('/notes/*')
322
+ ```
323
+
324
+ You may also prevent cache clearing for an unsafe request:
325
+
326
+ ```ruby
327
+ up.cache.keep
328
+ ```
329
+
330
+ Here is an longer example where the server uses careful cache management to keep as much of the client-side cache as possible:
331
+
332
+ ```ruby
333
+ def NotesController < ApplicationController
334
+
335
+ def create
336
+ @note = Note.create!(params[:note].permit(...))
337
+ if @note.save
338
+ up.cache.clear('/notes/*') # Only clear affected entries
339
+ redirect_to(@note)
340
+ else
341
+ up.cache.keep # Keep the cache because we haven't saved
342
+ render 'new'
343
+ end
344
+ end
345
+ ...
346
+ end
347
+ ```
348
+
349
+
350
+ ### Preserving Unpoly-related request information through redirects
351
+
352
+ `unpoly-rails` patches [`redirect_to`](https://api.rubyonrails.org/classes/ActionController/Redirecting.html#method-i-redirect_to)
353
+ so Unpoly-related request information (like the CSS selector being targeted for a fragment
354
+ update) will be preserved for the action you redirect to.
355
+
356
+
75
357
  ### Automatic redirect detection
76
358
 
77
- `unpoly-rails` installs a `before_action` into all controllers which echoes the request's URL as a response header `X-Up-Location` and the request's
359
+ `unpoly-rails` installs a [`before_action`](https://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-before_action) into all controllers which echoes the request's URL as a response header `X-Up-Location` and the request's
78
360
  HTTP method as `X-Up-Method`.
79
361
 
80
- The Unpoly frontend [requires these headers to detect redirects](https://unpoly.com/form-up-target#redirects), which are otherwise undetectable for an AJAX client.
81
362
 
82
363
  ### Automatic method detection for initial page load
83
364
 
@@ -93,7 +374,7 @@ What you still need to do manually
93
374
 
94
375
  ### Failed form submissions must return a non-200 status code
95
376
 
96
- Unpoly lets you submit forms via AJAX by using the [`form[up-target]`](https://unpoly.com/form-up-target) selector or [`up.submit()`](https://unpoly.com/up.submit) function.
377
+ Unpoly lets you submit forms via AJAX by using the [`form[up-follow]`](https://unpoly.com/form-up-submit) selector or [`up.submit()`](https://unpoly.com/up.submit) function.
97
378
 
98
379
  For Unpoly to be able to detect a failed form submission,
99
380
  the form must be re-rendered with a non-200 HTTP status code.
@@ -122,11 +403,11 @@ Development
122
403
 
123
404
  ### Before you make a PR
124
405
 
125
- Before you make a PR, please have some discussion about the proposed change by [opening an issue on GitHub](https://github.com/unpoly/unpoly/issues/new).
406
+ Before you create a pull request, please have some discussion about the proposed change by [opening an issue on GitHub](https://github.com/unpoly/unpoly/issues/new).
126
407
 
127
408
  ### Running tests
128
409
 
129
- - Install Ruby 2.1.2
410
+ - Install Ruby 2.3.8
130
411
  - Install Bundler by running `gem install bundler`
131
412
  - `cd` into `spec_app`
132
413
  - Install dependencies by running `bundle install`
@@ -1,14 +1,9 @@
1
- .up-modal-content {
2
- padding: 0; }
3
-
4
- .up-modal-dialog {
5
- margin: 0; }
6
-
7
- .up-modal[up-flavor='drawer'] .up-modal-content {
8
- border-radius: 0;
9
- border-top: none;
10
- border-bottom: none; }
11
- .up-modal[up-flavor='drawer'][up-position='left'] .up-modal-content {
12
- border-left: none; }
13
- .up-modal[up-flavor='drawer'][up-position='right'] .up-modal-content {
14
- border-right: none; }
1
+ up-modal .container,
2
+ up-modal .container-fluid,
3
+ up-drawer .container,
4
+ up-drawer .container-fluid,
5
+ up-popup .container,
6
+ up-popup .container-fluid {
7
+ padding-left: 0;
8
+ padding-right: 0;
9
+ max-width: none; }
@@ -1,30 +1,16 @@
1
1
  (function() {
2
2
  up.feedback.config.currentClasses.push('active');
3
3
 
4
- up.feedback.config.navs.push('.nav');
4
+ up.feedback.config.navSelectors.push('.nav', '.navbar');
5
5
 
6
- }).call(this);
7
- (function() {
8
- up.form.config.validateTargets.unshift('.form-group:has(&)');
9
-
10
- }).call(this);
11
- (function() {
12
- up.modal.config.template = "<div class=\"up-modal\">\n <div class=\"up-modal-backdrop\"></div>\n <div class=\"up-modal-viewport\">\n <div class=\"up-modal-dialog modal-dialog\">\n <div class=\"up-modal-content modal-content\"></div>\n </div>\n </div>\n</div>";
6
+ up.form.config.validateTargets.unshift('.form-group:has(:origin)');
13
7
 
14
- }).call(this);
15
- (function() {
16
8
  up.viewport.config.fixedTop.push('.navbar-fixed-top');
17
9
 
18
10
  up.viewport.config.fixedBottom.push('.navbar-fixed-bottom');
19
11
 
20
- up.viewport.config.anchoredRight.push('.navbar-fixed-top');
21
-
22
- up.viewport.config.anchoredRight.push('.navbar-fixed-bottom');
23
-
24
- up.viewport.config.anchoredRight.push('.footer');
25
-
26
- }).call(this);
27
- (function() {
12
+ up.viewport.config.anchoredRight.push('.navbar-fixed-top', '.navbar-fixed-bottom');
28
13
 
14
+ up.fragment.config.badTargetClasses.push('row', /^col(-xs|-sm|-md|-lg)?(-\d+)?$/);
29
15
 
30
16
  }).call(this);
@@ -1 +1 @@
1
- .up-modal-content{padding:0}.up-modal-dialog{margin:0}.up-modal[up-flavor='drawer'] .up-modal-content{border-radius:0;border-top:none;border-bottom:none}.up-modal[up-flavor='drawer'][up-position='left'] .up-modal-content{border-left:none}.up-modal[up-flavor='drawer'][up-position='right'] .up-modal-content{border-right:none}
1
+ up-modal .container,up-modal .container-fluid,up-drawer .container,up-drawer .container-fluid,up-popup .container,up-popup .container-fluid{padding-left:0;padding-right:0;max-width:none}
@@ -1 +1 @@
1
- (function(){up.feedback.config.currentClasses.push("active"),up.feedback.config.navs.push(".nav")}).call(this),function(){up.form.config.validateTargets.unshift(".form-group:has(&)")}.call(this),function(){up.modal.config.template='<div class="up-modal">\n <div class="up-modal-backdrop"></div>\n <div class="up-modal-viewport">\n <div class="up-modal-dialog modal-dialog">\n <div class="up-modal-content modal-content"></div>\n </div>\n </div>\n</div>'}.call(this),function(){up.viewport.config.fixedTop.push(".navbar-fixed-top"),up.viewport.config.fixedBottom.push(".navbar-fixed-bottom"),up.viewport.config.anchoredRight.push(".navbar-fixed-top"),up.viewport.config.anchoredRight.push(".navbar-fixed-bottom"),up.viewport.config.anchoredRight.push(".footer")}.call(this),function(){}.call(this);
1
+ (function(){up.feedback.config.currentClasses.push("active"),up.feedback.config.navSelectors.push(".nav",".navbar"),up.form.config.validateTargets.unshift(".form-group:has(:origin)"),up.viewport.config.fixedTop.push(".navbar-fixed-top"),up.viewport.config.fixedBottom.push(".navbar-fixed-bottom"),up.viewport.config.anchoredRight.push(".navbar-fixed-top",".navbar-fixed-bottom"),up.fragment.config.badTargetClasses.push("row",/^col(-xs|-sm|-md|-lg)?(-\d+)?$/)}).call(this);
@@ -0,0 +1,9 @@
1
+ up-modal .container,
2
+ up-modal .container-fluid,
3
+ up-drawer .container,
4
+ up-drawer .container-fluid,
5
+ up-popup .container,
6
+ up-popup .container-fluid {
7
+ padding-left: 0;
8
+ padding-right: 0;
9
+ max-width: none; }
@@ -0,0 +1,16 @@
1
+ (function() {
2
+ up.feedback.config.currentClasses.push('active');
3
+
4
+ up.feedback.config.navSelectors.push('.nav', '.navbar');
5
+
6
+ up.form.config.validateTargets.unshift('.form-group:has(:origin)');
7
+
8
+ up.viewport.config.fixedTop.push('.navbar.fixed-top');
9
+
10
+ up.viewport.config.fixedBottom.push('.navbar.fixed-bottom');
11
+
12
+ up.viewport.config.anchoredRight.push('.navbar.fixed-top', '.navbar.fixed-bottom');
13
+
14
+ up.fragment.config.badTargetClasses.push('row', /^col(-xs|-sm|-md|-lg|-xl)?(-\d+)?$/, /^[mp][tblrxy]?-\d+$/);
15
+
16
+ }).call(this);
@@ -0,0 +1 @@
1
+ up-modal .container,up-modal .container-fluid,up-drawer .container,up-drawer .container-fluid,up-popup .container,up-popup .container-fluid{padding-left:0;padding-right:0;max-width:none}
@@ -0,0 +1 @@
1
+ (function(){up.feedback.config.currentClasses.push("active"),up.feedback.config.navSelectors.push(".nav",".navbar"),up.form.config.validateTargets.unshift(".form-group:has(:origin)"),up.viewport.config.fixedTop.push(".navbar.fixed-top"),up.viewport.config.fixedBottom.push(".navbar.fixed-bottom"),up.viewport.config.anchoredRight.push(".navbar.fixed-top",".navbar.fixed-bottom"),up.fragment.config.badTargetClasses.push("row",/^col(-xs|-sm|-md|-lg|-xl)?(-\d+)?$/,/^[mp][tblrxy]?-\d+$/)}).call(this);
@@ -0,0 +1,9 @@
1
+ up-modal .container,
2
+ up-modal .container-fluid,
3
+ up-drawer .container,
4
+ up-drawer .container-fluid,
5
+ up-popup .container,
6
+ up-popup .container-fluid {
7
+ padding-left: 0;
8
+ padding-right: 0;
9
+ max-width: none; }
@@ -0,0 +1,14 @@
1
+ (function() {
2
+ up.feedback.config.currentClasses.push('active');
3
+
4
+ up.feedback.config.navSelectors.push('.nav', '.navbar');
5
+
6
+ up.viewport.config.fixedTop.push('.navbar.fixed-top');
7
+
8
+ up.viewport.config.fixedBottom.push('.navbar.fixed-bottom');
9
+
10
+ up.viewport.config.anchoredRight.push('.navbar.fixed-top', '.navbar.fixed-bottom');
11
+
12
+ up.fragment.config.badTargetClasses.push('row', /^col(-xs|-sm|-md|-lg|-xl|-xxl)?(-\d+)?$/, /^[mp][tbsexy]?-\d+$/);
13
+
14
+ }).call(this);
@@ -0,0 +1 @@
1
+ up-modal .container,up-modal .container-fluid,up-drawer .container,up-drawer .container-fluid,up-popup .container,up-popup .container-fluid{padding-left:0;padding-right:0;max-width:none}
@@ -0,0 +1 @@
1
+ (function(){up.feedback.config.currentClasses.push("active"),up.feedback.config.navSelectors.push(".nav",".navbar"),up.viewport.config.fixedTop.push(".navbar.fixed-top"),up.viewport.config.fixedBottom.push(".navbar.fixed-bottom"),up.viewport.config.anchoredRight.push(".navbar.fixed-top",".navbar.fixed-bottom"),up.fragment.config.badTargetClasses.push("row",/^col(-xs|-sm|-md|-lg|-xl|-xxl)?(-\d+)?$/,/^[mp][tbsexy]?-\d+$/)}).call(this);