actionview 7.1.3.1 → 7.1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4c028f0367a08ba9d9b71bdcd7732e04e38e3bb500df6a041ec810be003a3a2d
4
- data.tar.gz: 0327e7e43ea3a612ba3be03b6231e44f3c65bcff9e7a67810bfaf13782cfbdfc
3
+ metadata.gz: db8d0f073efbefc07d2a92e639d64116ee5b0e0b0f4dc97be29cbda2df990213
4
+ data.tar.gz: 12eaf3595476b7ccab8b3ce3430cb8de9c98b078bb250abd2647f8e6f1339bd3
5
5
  SHA512:
6
- metadata.gz: 430bebb4eddeff1331508f07859cacc915defba66442dd95f6639c2045ec0bd175e7233c2102e8e727bb45c40f79664c675086946e028326134c0599f1b0a8f8
7
- data.tar.gz: 5eb8a3192a46553b3f57c58d45c9a2389b5f7dfad0b73f1c2ebefd562c4aed898a879da9f7b68afe01198283a968567732c55884ef1a19cd33e2cc86555abb01
6
+ metadata.gz: 93fa34626597623584116911465db89fdbb07d9633d30174054b336a08c81847d9494930b4951cfc14ff471852205aef5ba12d32d58a5ac0a693bc431aeb67ab
7
+ data.tar.gz: a9567f5db1e837d9a3cc6957a1b37cc33df352aa27d9faf54227f50a982c5d0407d4f56123ef90d82edda8aa5a63cfbbd150b9b88094e33bfd967d520b07c2bf
data/CHANGELOG.md CHANGED
@@ -1,3 +1,38 @@
1
+ ## Rails 7.1.4.1 (October 15, 2024) ##
2
+
3
+ * No changes.
4
+
5
+
6
+ ## Rails 7.1.4 (August 22, 2024) ##
7
+
8
+ * Action View Test Case `rendered` memoization.
9
+
10
+ *Sean Doyle*
11
+
12
+ * Restore the ability for templates to return any kind of object and not just strings
13
+
14
+ *Jean Boussier*
15
+
16
+ * Fix threading issue with strict locals.
17
+
18
+ *Robert Fletcher*
19
+
20
+
21
+ ## Rails 7.1.3.4 (June 04, 2024) ##
22
+
23
+ * No changes.
24
+
25
+
26
+ ## Rails 7.1.3.3 (May 16, 2024) ##
27
+
28
+ * No changes.
29
+
30
+
31
+ ## Rails 7.1.3.2 (February 21, 2024) ##
32
+
33
+ * No changes.
34
+
35
+
1
36
  ## Rails 7.1.3.1 (February 21, 2024) ##
2
37
 
3
38
  * No changes.
@@ -136,8 +136,7 @@ module ActionView # :nodoc:
136
136
  # end
137
137
  # end
138
138
  #
139
- # For more information on Builder please consult the {source
140
- # code}[https://github.com/jimweirich/builder].
139
+ # For more information on Builder please consult the {source code}[https://github.com/rails/builder].
141
140
  class Base
142
141
  include Helpers, ::ERB::Util, Context
143
142
 
@@ -9,7 +9,7 @@ module ActionView
9
9
  module VERSION
10
10
  MAJOR = 7
11
11
  MINOR = 1
12
- TINY = 3
12
+ TINY = 4
13
13
  PRE = "1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
@@ -645,11 +645,11 @@ module ActionView
645
645
  return if response_present && response.sending?
646
646
 
647
647
  if respond_to?(:request) && request
648
- request.send_early_hints("Link" => preload_links.join("\n"))
648
+ request.send_early_hints("link" => preload_links.join(","))
649
649
  end
650
650
 
651
651
  if response_present
652
- header = +response.headers["Link"].to_s
652
+ header = +response.headers["link"].to_s
653
653
  preload_links.each do |link|
654
654
  break if header.bytesize + link.bytesize > max_header_size
655
655
 
@@ -660,7 +660,7 @@ module ActionView
660
660
  end
661
661
  end
662
662
 
663
- response.headers["Link"] = header
663
+ response.headers["link"] = header
664
664
  end
665
665
  end
666
666
  end
@@ -76,11 +76,11 @@ module ActionView
76
76
  # render 'comments/comments'
77
77
  # render('comments/comments')
78
78
  #
79
- # render "header" translates to render("comments/header")
79
+ # render "header" # translates to render("comments/header")
80
80
  #
81
- # render(@topic) translates to render("topics/topic")
82
- # render(topics) translates to render("topics/topic")
83
- # render(message.topics) translates to render("topics/topic")
81
+ # render(@topic) # translates to render("topics/topic")
82
+ # render(topics) # translates to render("topics/topic")
83
+ # render(message.topics) # translates to render("topics/topic")
84
84
  #
85
85
  # It's not possible to derive all render calls like that, though.
86
86
  # Here are a few examples of things that can't be derived:
@@ -784,7 +784,7 @@ module ActionView
784
784
  end
785
785
 
786
786
  def add_method_to_attributes!(html_options, method)
787
- if method_not_get_method?(method) && !html_options["rel"]&.match?(/nofollow/)
787
+ if method_not_get_method?(method) && !html_options["rel"]&.include?("nofollow")
788
788
  if html_options["rel"].blank?
789
789
  html_options["rel"] = "nofollow"
790
790
  else
@@ -258,7 +258,8 @@ module ActionView
258
258
  view._run(method_name, self, locals, buffer, add_to_stack: add_to_stack, has_strict_locals: strict_locals?, &block)
259
259
  nil
260
260
  else
261
- view._run(method_name, self, locals, OutputBuffer.new, add_to_stack: add_to_stack, has_strict_locals: strict_locals?, &block)&.to_s
261
+ result = view._run(method_name, self, locals, OutputBuffer.new, add_to_stack: add_to_stack, has_strict_locals: strict_locals?, &block)
262
+ result.is_a?(OutputBuffer) ? result.to_s : result
262
263
  end
263
264
  end
264
265
  rescue => e
@@ -60,7 +60,7 @@ module ActionView
60
60
  include ActiveSupport::Testing::ConstantLookup
61
61
 
62
62
  delegate :lookup_context, to: :controller
63
- attr_accessor :controller, :request, :output_buffer
63
+ attr_accessor :controller, :request, :output_buffer, :rendered
64
64
 
65
65
  module ClassMethods
66
66
  def inherited(descendant) # :nodoc:
@@ -224,7 +224,7 @@ module ActionView
224
224
  @request = @controller.request
225
225
  @view_flow = ActionView::OutputFlow.new
226
226
  @output_buffer = ActionView::OutputBuffer.new
227
- @rendered = +""
227
+ @rendered = self.class.content_class.new(+"")
228
228
 
229
229
  test_case_instance = self
230
230
  controller_class.define_method(:_test_case) { test_case_instance }
@@ -244,6 +244,9 @@ module ActionView
244
244
  @_rendered_views ||= RenderedViewsCollection.new
245
245
  end
246
246
 
247
+ ##
248
+ # :method: rendered
249
+ #
247
250
  # Returns the content rendered by the last +render+ call.
248
251
  #
249
252
  # The returned object behaves like a string but also exposes a number of methods
@@ -291,9 +294,6 @@ module ActionView
291
294
  #
292
295
  # assert_pattern { rendered.json => { title: "Hello, world" } }
293
296
  # end
294
- def rendered
295
- @_rendered ||= self.class.content_class.new(@rendered)
296
- end
297
297
 
298
298
  def _routes
299
299
  @controller._routes if @controller.respond_to?(:_routes)
@@ -26,15 +26,15 @@ module ActionView
26
26
  # while holding the lock.
27
27
  template = (@templates[normalized_locals] ||= build_template(normalized_locals))
28
28
 
29
- # This may have already been assigned, but we've already de-dup'd so
30
- # reassignment is fine.
31
- @templates[locals.dup] = template
32
-
33
29
  if template.strict_locals?
34
30
  # Under strict locals, we only need one template.
35
31
  # This replaces the @templates Concurrent::Map with a hash which
36
32
  # returns this template for every key.
37
33
  @templates = Hash.new(template).freeze
34
+ else
35
+ # This may have already been assigned, but we've already de-dup'd so
36
+ # reassignment is fine.
37
+ @templates[locals.dup] = template
38
38
  end
39
39
  end
40
40
  end
data/lib/action_view.rb CHANGED
@@ -28,7 +28,7 @@ require "active_support/rails"
28
28
  require "action_view/version"
29
29
  require "action_view/deprecator"
30
30
 
31
- # :include: actionview/README.rdoc
31
+ # :include: ../README.rdoc
32
32
  module ActionView
33
33
  extend ActiveSupport::Autoload
34
34
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: actionview
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.3.1
4
+ version: 7.1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-21 00:00:00.000000000 Z
11
+ date: 2024-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 7.1.3.1
19
+ version: 7.1.4.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 7.1.3.1
26
+ version: 7.1.4.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: builder
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -86,28 +86,28 @@ dependencies:
86
86
  requirements:
87
87
  - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: 7.1.3.1
89
+ version: 7.1.4.1
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: 7.1.3.1
96
+ version: 7.1.4.1
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: activemodel
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - '='
102
102
  - !ruby/object:Gem::Version
103
- version: 7.1.3.1
103
+ version: 7.1.4.1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - '='
109
109
  - !ruby/object:Gem::Version
110
- version: 7.1.3.1
110
+ version: 7.1.4.1
111
111
  description: Simple, battle-tested conventions and helpers for building web pages.
112
112
  email: david@loudthinking.com
113
113
  executables: []
@@ -240,18 +240,17 @@ files:
240
240
  - lib/action_view/unbound_template.rb
241
241
  - lib/action_view/version.rb
242
242
  - lib/action_view/view_paths.rb
243
- - lib/assets/compiled/rails-ujs.js
244
243
  homepage: https://rubyonrails.org
245
244
  licenses:
246
245
  - MIT
247
246
  metadata:
248
247
  bug_tracker_uri: https://github.com/rails/rails/issues
249
- changelog_uri: https://github.com/rails/rails/blob/v7.1.3.1/actionview/CHANGELOG.md
250
- documentation_uri: https://api.rubyonrails.org/v7.1.3.1/
248
+ changelog_uri: https://github.com/rails/rails/blob/v7.1.4.1/actionview/CHANGELOG.md
249
+ documentation_uri: https://api.rubyonrails.org/v7.1.4.1/
251
250
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
252
- source_code_uri: https://github.com/rails/rails/tree/v7.1.3.1/actionview
251
+ source_code_uri: https://github.com/rails/rails/tree/v7.1.4.1/actionview
253
252
  rubygems_mfa_required: 'true'
254
- post_install_message:
253
+ post_install_message:
255
254
  rdoc_options: []
256
255
  require_paths:
257
256
  - lib
@@ -267,8 +266,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
267
266
  version: '0'
268
267
  requirements:
269
268
  - none
270
- rubygems_version: 3.4.10
271
- signing_key:
269
+ rubygems_version: 3.5.16
270
+ signing_key:
272
271
  specification_version: 4
273
272
  summary: Rendering framework putting the V in MVC (part of Rails).
274
273
  test_files: []
@@ -1,777 +0,0 @@
1
- /*
2
- Unobtrusive JavaScript
3
- https://github.com/rails/rails/blob/main/actionview/app/assets/javascripts
4
- Released under the MIT license
5
- */;
6
-
7
- (function() {
8
- var context = this;
9
-
10
- (function() {
11
- (function() {
12
- this.Rails = {
13
- linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote]:not([disabled]), a[data-disable-with], a[data-disable]',
14
- buttonClickSelector: {
15
- selector: 'button[data-remote]:not([form]), button[data-confirm]:not([form])',
16
- exclude: 'form button'
17
- },
18
- inputChangeSelector: 'select[data-remote], input[data-remote], textarea[data-remote]',
19
- formSubmitSelector: 'form:not([data-turbo=true])',
20
- formInputClickSelector: 'form:not([data-turbo=true]) input[type=submit], form:not([data-turbo=true]) input[type=image], form:not([data-turbo=true]) button[type=submit], form:not([data-turbo=true]) button:not([type]), input[type=submit][form], input[type=image][form], button[type=submit][form], button[form]:not([type])',
21
- formDisableSelector: 'input[data-disable-with]:enabled, button[data-disable-with]:enabled, textarea[data-disable-with]:enabled, input[data-disable]:enabled, button[data-disable]:enabled, textarea[data-disable]:enabled',
22
- formEnableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled, input[data-disable]:disabled, button[data-disable]:disabled, textarea[data-disable]:disabled',
23
- fileInputSelector: 'input[name][type=file]:not([disabled])',
24
- linkDisableSelector: 'a[data-disable-with], a[data-disable]',
25
- buttonDisableSelector: 'button[data-remote][data-disable-with], button[data-remote][data-disable]'
26
- };
27
-
28
- }).call(this);
29
- }).call(context);
30
-
31
- var Rails = context.Rails;
32
-
33
- (function() {
34
- (function() {
35
- var nonce;
36
-
37
- nonce = null;
38
-
39
- Rails.loadCSPNonce = function() {
40
- var ref;
41
- return nonce = (ref = document.querySelector("meta[name=csp-nonce]")) != null ? ref.content : void 0;
42
- };
43
-
44
- Rails.cspNonce = function() {
45
- return nonce != null ? nonce : Rails.loadCSPNonce();
46
- };
47
-
48
- }).call(this);
49
- (function() {
50
- var expando, m;
51
-
52
- m = Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector;
53
-
54
- Rails.matches = function(element, selector) {
55
- if (selector.exclude != null) {
56
- return m.call(element, selector.selector) && !m.call(element, selector.exclude);
57
- } else {
58
- return m.call(element, selector);
59
- }
60
- };
61
-
62
- expando = '_ujsData';
63
-
64
- Rails.getData = function(element, key) {
65
- var ref;
66
- return (ref = element[expando]) != null ? ref[key] : void 0;
67
- };
68
-
69
- Rails.setData = function(element, key, value) {
70
- if (element[expando] == null) {
71
- element[expando] = {};
72
- }
73
- return element[expando][key] = value;
74
- };
75
-
76
- Rails.isContentEditable = function(element) {
77
- var isEditable;
78
- isEditable = false;
79
- while (true) {
80
- if (element.isContentEditable) {
81
- isEditable = true;
82
- break;
83
- }
84
- element = element.parentElement;
85
- if (!element) {
86
- break;
87
- }
88
- }
89
- return isEditable;
90
- };
91
-
92
- Rails.$ = function(selector) {
93
- return Array.prototype.slice.call(document.querySelectorAll(selector));
94
- };
95
-
96
- }).call(this);
97
- (function() {
98
- var $, csrfParam, csrfToken;
99
-
100
- $ = Rails.$;
101
-
102
- csrfToken = Rails.csrfToken = function() {
103
- var meta;
104
- meta = document.querySelector('meta[name=csrf-token]');
105
- return meta && meta.content;
106
- };
107
-
108
- csrfParam = Rails.csrfParam = function() {
109
- var meta;
110
- meta = document.querySelector('meta[name=csrf-param]');
111
- return meta && meta.content;
112
- };
113
-
114
- Rails.CSRFProtection = function(xhr) {
115
- var token;
116
- token = csrfToken();
117
- if (token != null) {
118
- return xhr.setRequestHeader('X-CSRF-Token', token);
119
- }
120
- };
121
-
122
- Rails.refreshCSRFTokens = function() {
123
- var param, token;
124
- token = csrfToken();
125
- param = csrfParam();
126
- if ((token != null) && (param != null)) {
127
- return $('form input[name="' + param + '"]').forEach(function(input) {
128
- return input.value = token;
129
- });
130
- }
131
- };
132
-
133
- }).call(this);
134
- (function() {
135
- var CustomEvent, fire, matches, preventDefault;
136
-
137
- matches = Rails.matches;
138
-
139
- CustomEvent = window.CustomEvent;
140
-
141
- if (typeof CustomEvent !== 'function') {
142
- CustomEvent = function(event, params) {
143
- var evt;
144
- evt = document.createEvent('CustomEvent');
145
- evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
146
- return evt;
147
- };
148
- CustomEvent.prototype = window.Event.prototype;
149
- preventDefault = CustomEvent.prototype.preventDefault;
150
- CustomEvent.prototype.preventDefault = function() {
151
- var result;
152
- result = preventDefault.call(this);
153
- if (this.cancelable && !this.defaultPrevented) {
154
- Object.defineProperty(this, 'defaultPrevented', {
155
- get: function() {
156
- return true;
157
- }
158
- });
159
- }
160
- return result;
161
- };
162
- }
163
-
164
- fire = Rails.fire = function(obj, name, data) {
165
- var event;
166
- event = new CustomEvent(name, {
167
- bubbles: true,
168
- cancelable: true,
169
- detail: data
170
- });
171
- obj.dispatchEvent(event);
172
- return !event.defaultPrevented;
173
- };
174
-
175
- Rails.stopEverything = function(e) {
176
- fire(e.target, 'ujs:everythingStopped');
177
- e.preventDefault();
178
- e.stopPropagation();
179
- return e.stopImmediatePropagation();
180
- };
181
-
182
- Rails.delegate = function(element, selector, eventType, handler) {
183
- return element.addEventListener(eventType, function(e) {
184
- var target;
185
- target = e.target;
186
- while (!(!(target instanceof Element) || matches(target, selector))) {
187
- target = target.parentNode;
188
- }
189
- if (target instanceof Element && handler.call(target, e) === false) {
190
- e.preventDefault();
191
- return e.stopPropagation();
192
- }
193
- });
194
- };
195
-
196
- }).call(this);
197
- (function() {
198
- var AcceptHeaders, CSRFProtection, createXHR, cspNonce, fire, prepareOptions, processResponse;
199
-
200
- cspNonce = Rails.cspNonce, CSRFProtection = Rails.CSRFProtection, fire = Rails.fire;
201
-
202
- AcceptHeaders = {
203
- '*': '*/*',
204
- text: 'text/plain',
205
- html: 'text/html',
206
- xml: 'application/xml, text/xml',
207
- json: 'application/json, text/javascript',
208
- script: 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript'
209
- };
210
-
211
- Rails.ajax = function(options) {
212
- var xhr;
213
- options = prepareOptions(options);
214
- xhr = createXHR(options, function() {
215
- var ref, response;
216
- response = processResponse((ref = xhr.response) != null ? ref : xhr.responseText, xhr.getResponseHeader('Content-Type'));
217
- if (Math.floor(xhr.status / 100) === 2) {
218
- if (typeof options.success === "function") {
219
- options.success(response, xhr.statusText, xhr);
220
- }
221
- } else {
222
- if (typeof options.error === "function") {
223
- options.error(response, xhr.statusText, xhr);
224
- }
225
- }
226
- return typeof options.complete === "function" ? options.complete(xhr, xhr.statusText) : void 0;
227
- });
228
- if ((options.beforeSend != null) && !options.beforeSend(xhr, options)) {
229
- return false;
230
- }
231
- if (xhr.readyState === XMLHttpRequest.OPENED) {
232
- return xhr.send(options.data);
233
- }
234
- };
235
-
236
- prepareOptions = function(options) {
237
- options.url = options.url || location.href;
238
- options.type = options.type.toUpperCase();
239
- if (options.type === 'GET' && options.data) {
240
- if (options.url.indexOf('?') < 0) {
241
- options.url += '?' + options.data;
242
- } else {
243
- options.url += '&' + options.data;
244
- }
245
- }
246
- if (AcceptHeaders[options.dataType] == null) {
247
- options.dataType = '*';
248
- }
249
- options.accept = AcceptHeaders[options.dataType];
250
- if (options.dataType !== '*') {
251
- options.accept += ', */*; q=0.01';
252
- }
253
- return options;
254
- };
255
-
256
- createXHR = function(options, done) {
257
- var xhr;
258
- xhr = new XMLHttpRequest();
259
- xhr.open(options.type, options.url, true);
260
- xhr.setRequestHeader('Accept', options.accept);
261
- if (typeof options.data === 'string') {
262
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
263
- }
264
- if (!options.crossDomain) {
265
- xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
266
- CSRFProtection(xhr);
267
- }
268
- xhr.withCredentials = !!options.withCredentials;
269
- xhr.onreadystatechange = function() {
270
- if (xhr.readyState === XMLHttpRequest.DONE) {
271
- return done(xhr);
272
- }
273
- };
274
- return xhr;
275
- };
276
-
277
- processResponse = function(response, type) {
278
- var parser, script;
279
- if (typeof response === 'string' && typeof type === 'string') {
280
- if (type.match(/\bjson\b/)) {
281
- try {
282
- response = JSON.parse(response);
283
- } catch (error) {}
284
- } else if (type.match(/\b(?:java|ecma)script\b/)) {
285
- script = document.createElement('script');
286
- script.setAttribute('nonce', cspNonce());
287
- script.text = response;
288
- document.head.appendChild(script).parentNode.removeChild(script);
289
- } else if (type.match(/\b(xml|html|svg)\b/)) {
290
- parser = new DOMParser();
291
- type = type.replace(/;.+/, '');
292
- try {
293
- response = parser.parseFromString(response, type);
294
- } catch (error) {}
295
- }
296
- }
297
- return response;
298
- };
299
-
300
- Rails.href = function(element) {
301
- return element.href;
302
- };
303
-
304
- Rails.isCrossDomain = function(url) {
305
- var e, originAnchor, urlAnchor;
306
- originAnchor = document.createElement('a');
307
- originAnchor.href = location.href;
308
- urlAnchor = document.createElement('a');
309
- try {
310
- urlAnchor.href = url;
311
- return !(((!urlAnchor.protocol || urlAnchor.protocol === ':') && !urlAnchor.host) || (originAnchor.protocol + '//' + originAnchor.host === urlAnchor.protocol + '//' + urlAnchor.host));
312
- } catch (error) {
313
- e = error;
314
- return true;
315
- }
316
- };
317
-
318
- }).call(this);
319
- (function() {
320
- var matches, toArray;
321
-
322
- matches = Rails.matches;
323
-
324
- toArray = function(e) {
325
- return Array.prototype.slice.call(e);
326
- };
327
-
328
- Rails.serializeElement = function(element, additionalParam) {
329
- var inputs, params;
330
- inputs = [element];
331
- if (matches(element, 'form')) {
332
- inputs = toArray(element.elements);
333
- }
334
- params = [];
335
- inputs.forEach(function(input) {
336
- if (!input.name || input.disabled) {
337
- return;
338
- }
339
- if (matches(input, 'fieldset[disabled] *')) {
340
- return;
341
- }
342
- if (matches(input, 'select')) {
343
- return toArray(input.options).forEach(function(option) {
344
- if (option.selected) {
345
- return params.push({
346
- name: input.name,
347
- value: option.value
348
- });
349
- }
350
- });
351
- } else if (input.checked || ['radio', 'checkbox', 'submit'].indexOf(input.type) === -1) {
352
- return params.push({
353
- name: input.name,
354
- value: input.value
355
- });
356
- }
357
- });
358
- if (additionalParam) {
359
- params.push(additionalParam);
360
- }
361
- return params.map(function(param) {
362
- if (param.name != null) {
363
- return (encodeURIComponent(param.name)) + "=" + (encodeURIComponent(param.value));
364
- } else {
365
- return param;
366
- }
367
- }).join('&');
368
- };
369
-
370
- Rails.formElements = function(form, selector) {
371
- if (matches(form, 'form')) {
372
- return toArray(form.elements).filter(function(el) {
373
- return matches(el, selector);
374
- });
375
- } else {
376
- return toArray(form.querySelectorAll(selector));
377
- }
378
- };
379
-
380
- }).call(this);
381
- (function() {
382
- var allowAction, fire, stopEverything;
383
-
384
- fire = Rails.fire, stopEverything = Rails.stopEverything;
385
-
386
- Rails.handleConfirm = function(e) {
387
- if (!allowAction(this)) {
388
- return stopEverything(e);
389
- }
390
- };
391
-
392
- Rails.confirm = function(message, element) {
393
- return confirm(message);
394
- };
395
-
396
- allowAction = function(element) {
397
- var answer, callback, message;
398
- message = element.getAttribute('data-confirm');
399
- if (!message) {
400
- return true;
401
- }
402
- answer = false;
403
- if (fire(element, 'confirm')) {
404
- try {
405
- answer = Rails.confirm(message, element);
406
- } catch (error) {}
407
- callback = fire(element, 'confirm:complete', [answer]);
408
- }
409
- return answer && callback;
410
- };
411
-
412
- }).call(this);
413
- (function() {
414
- var disableFormElement, disableFormElements, disableLinkElement, enableFormElement, enableFormElements, enableLinkElement, formElements, getData, isContentEditable, isXhrRedirect, matches, setData, stopEverything;
415
-
416
- matches = Rails.matches, getData = Rails.getData, setData = Rails.setData, stopEverything = Rails.stopEverything, formElements = Rails.formElements, isContentEditable = Rails.isContentEditable;
417
-
418
- Rails.handleDisabledElement = function(e) {
419
- var element;
420
- element = this;
421
- if (element.disabled) {
422
- return stopEverything(e);
423
- }
424
- };
425
-
426
- Rails.enableElement = function(e) {
427
- var element;
428
- if (e instanceof Event) {
429
- if (isXhrRedirect(e)) {
430
- return;
431
- }
432
- element = e.target;
433
- } else {
434
- element = e;
435
- }
436
- if (isContentEditable(element)) {
437
- return;
438
- }
439
- if (matches(element, Rails.linkDisableSelector)) {
440
- return enableLinkElement(element);
441
- } else if (matches(element, Rails.buttonDisableSelector) || matches(element, Rails.formEnableSelector)) {
442
- return enableFormElement(element);
443
- } else if (matches(element, Rails.formSubmitSelector)) {
444
- return enableFormElements(element);
445
- }
446
- };
447
-
448
- Rails.disableElement = function(e) {
449
- var element;
450
- element = e instanceof Event ? e.target : e;
451
- if (isContentEditable(element)) {
452
- return;
453
- }
454
- if (matches(element, Rails.linkDisableSelector)) {
455
- return disableLinkElement(element);
456
- } else if (matches(element, Rails.buttonDisableSelector) || matches(element, Rails.formDisableSelector)) {
457
- return disableFormElement(element);
458
- } else if (matches(element, Rails.formSubmitSelector)) {
459
- return disableFormElements(element);
460
- }
461
- };
462
-
463
- disableLinkElement = function(element) {
464
- var replacement;
465
- if (getData(element, 'ujs:disabled')) {
466
- return;
467
- }
468
- replacement = element.getAttribute('data-disable-with');
469
- if (replacement != null) {
470
- setData(element, 'ujs:enable-with', element.innerHTML);
471
- element.innerHTML = replacement;
472
- }
473
- element.addEventListener('click', stopEverything);
474
- return setData(element, 'ujs:disabled', true);
475
- };
476
-
477
- enableLinkElement = function(element) {
478
- var originalText;
479
- originalText = getData(element, 'ujs:enable-with');
480
- if (originalText != null) {
481
- element.innerHTML = originalText;
482
- setData(element, 'ujs:enable-with', null);
483
- }
484
- element.removeEventListener('click', stopEverything);
485
- return setData(element, 'ujs:disabled', null);
486
- };
487
-
488
- disableFormElements = function(form) {
489
- return formElements(form, Rails.formDisableSelector).forEach(disableFormElement);
490
- };
491
-
492
- disableFormElement = function(element) {
493
- var replacement;
494
- if (getData(element, 'ujs:disabled')) {
495
- return;
496
- }
497
- replacement = element.getAttribute('data-disable-with');
498
- if (replacement != null) {
499
- if (matches(element, 'button')) {
500
- setData(element, 'ujs:enable-with', element.innerHTML);
501
- element.innerHTML = replacement;
502
- } else {
503
- setData(element, 'ujs:enable-with', element.value);
504
- element.value = replacement;
505
- }
506
- }
507
- element.disabled = true;
508
- return setData(element, 'ujs:disabled', true);
509
- };
510
-
511
- enableFormElements = function(form) {
512
- return formElements(form, Rails.formEnableSelector).forEach(enableFormElement);
513
- };
514
-
515
- enableFormElement = function(element) {
516
- var originalText;
517
- originalText = getData(element, 'ujs:enable-with');
518
- if (originalText != null) {
519
- if (matches(element, 'button')) {
520
- element.innerHTML = originalText;
521
- } else {
522
- element.value = originalText;
523
- }
524
- setData(element, 'ujs:enable-with', null);
525
- }
526
- element.disabled = false;
527
- return setData(element, 'ujs:disabled', null);
528
- };
529
-
530
- isXhrRedirect = function(event) {
531
- var ref, xhr;
532
- xhr = (ref = event.detail) != null ? ref[0] : void 0;
533
- return (xhr != null ? xhr.getResponseHeader("X-Xhr-Redirect") : void 0) != null;
534
- };
535
-
536
- }).call(this);
537
- (function() {
538
- var isContentEditable, stopEverything;
539
-
540
- stopEverything = Rails.stopEverything;
541
-
542
- isContentEditable = Rails.isContentEditable;
543
-
544
- Rails.handleMethod = function(e) {
545
- var csrfParam, csrfToken, form, formContent, href, link, method;
546
- link = this;
547
- method = link.getAttribute('data-method');
548
- if (!method) {
549
- return;
550
- }
551
- if (isContentEditable(this)) {
552
- return;
553
- }
554
- href = Rails.href(link);
555
- csrfToken = Rails.csrfToken();
556
- csrfParam = Rails.csrfParam();
557
- form = document.createElement('form');
558
- formContent = "<input name='_method' value='" + method + "' type='hidden' />";
559
- if ((csrfParam != null) && (csrfToken != null) && !Rails.isCrossDomain(href)) {
560
- formContent += "<input name='" + csrfParam + "' value='" + csrfToken + "' type='hidden' />";
561
- }
562
- formContent += '<input type="submit" />';
563
- form.method = 'post';
564
- form.action = href;
565
- form.target = link.target;
566
- form.innerHTML = formContent;
567
- form.style.display = 'none';
568
- document.body.appendChild(form);
569
- form.querySelector('[type="submit"]').click();
570
- return stopEverything(e);
571
- };
572
-
573
- }).call(this);
574
- (function() {
575
- var ajax, fire, getData, isContentEditable, isCrossDomain, isRemote, matches, serializeElement, setData, stopEverything,
576
- slice = [].slice;
577
-
578
- matches = Rails.matches, getData = Rails.getData, setData = Rails.setData, fire = Rails.fire, stopEverything = Rails.stopEverything, ajax = Rails.ajax, isCrossDomain = Rails.isCrossDomain, serializeElement = Rails.serializeElement, isContentEditable = Rails.isContentEditable;
579
-
580
- isRemote = function(element) {
581
- var value;
582
- value = element.getAttribute('data-remote');
583
- return (value != null) && value !== 'false';
584
- };
585
-
586
- Rails.handleRemote = function(e) {
587
- var button, data, dataType, element, method, url, withCredentials;
588
- element = this;
589
- if (!isRemote(element)) {
590
- return true;
591
- }
592
- if (!fire(element, 'ajax:before')) {
593
- fire(element, 'ajax:stopped');
594
- return false;
595
- }
596
- if (isContentEditable(element)) {
597
- fire(element, 'ajax:stopped');
598
- return false;
599
- }
600
- withCredentials = element.getAttribute('data-with-credentials');
601
- dataType = element.getAttribute('data-type') || 'script';
602
- if (matches(element, Rails.formSubmitSelector)) {
603
- button = getData(element, 'ujs:submit-button');
604
- method = getData(element, 'ujs:submit-button-formmethod') || element.method;
605
- url = getData(element, 'ujs:submit-button-formaction') || element.getAttribute('action') || location.href;
606
- if (method.toUpperCase() === 'GET') {
607
- url = url.replace(/\?.*$/, '');
608
- }
609
- if (element.enctype === 'multipart/form-data') {
610
- data = new FormData(element);
611
- if (button != null) {
612
- data.append(button.name, button.value);
613
- }
614
- } else {
615
- data = serializeElement(element, button);
616
- }
617
- setData(element, 'ujs:submit-button', null);
618
- setData(element, 'ujs:submit-button-formmethod', null);
619
- setData(element, 'ujs:submit-button-formaction', null);
620
- } else if (matches(element, Rails.buttonClickSelector) || matches(element, Rails.inputChangeSelector)) {
621
- method = element.getAttribute('data-method');
622
- url = element.getAttribute('data-url');
623
- data = serializeElement(element, element.getAttribute('data-params'));
624
- } else {
625
- method = element.getAttribute('data-method');
626
- url = Rails.href(element);
627
- data = element.getAttribute('data-params');
628
- }
629
- ajax({
630
- type: method || 'GET',
631
- url: url,
632
- data: data,
633
- dataType: dataType,
634
- beforeSend: function(xhr, options) {
635
- if (fire(element, 'ajax:beforeSend', [xhr, options])) {
636
- return fire(element, 'ajax:send', [xhr]);
637
- } else {
638
- fire(element, 'ajax:stopped');
639
- return false;
640
- }
641
- },
642
- success: function() {
643
- var args;
644
- args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
645
- return fire(element, 'ajax:success', args);
646
- },
647
- error: function() {
648
- var args;
649
- args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
650
- return fire(element, 'ajax:error', args);
651
- },
652
- complete: function() {
653
- var args;
654
- args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
655
- return fire(element, 'ajax:complete', args);
656
- },
657
- crossDomain: isCrossDomain(url),
658
- withCredentials: (withCredentials != null) && withCredentials !== 'false'
659
- });
660
- return stopEverything(e);
661
- };
662
-
663
- Rails.formSubmitButtonClick = function(e) {
664
- var button, form;
665
- button = this;
666
- form = button.form;
667
- if (!form) {
668
- return;
669
- }
670
- if (button.name) {
671
- setData(form, 'ujs:submit-button', {
672
- name: button.name,
673
- value: button.value
674
- });
675
- }
676
- setData(form, 'ujs:formnovalidate-button', button.formNoValidate);
677
- setData(form, 'ujs:submit-button-formaction', button.getAttribute('formaction'));
678
- return setData(form, 'ujs:submit-button-formmethod', button.getAttribute('formmethod'));
679
- };
680
-
681
- Rails.preventInsignificantClick = function(e) {
682
- var data, insignificantMetaClick, link, metaClick, method, nonPrimaryMouseClick;
683
- link = this;
684
- method = (link.getAttribute('data-method') || 'GET').toUpperCase();
685
- data = link.getAttribute('data-params');
686
- metaClick = e.metaKey || e.ctrlKey;
687
- insignificantMetaClick = metaClick && method === 'GET' && !data;
688
- nonPrimaryMouseClick = (e.button != null) && e.button !== 0;
689
- if (nonPrimaryMouseClick || insignificantMetaClick) {
690
- return e.stopImmediatePropagation();
691
- }
692
- };
693
-
694
- }).call(this);
695
- (function() {
696
- var $, CSRFProtection, delegate, disableElement, enableElement, fire, formSubmitButtonClick, getData, handleConfirm, handleDisabledElement, handleMethod, handleRemote, loadCSPNonce, preventInsignificantClick, refreshCSRFTokens;
697
-
698
- fire = Rails.fire, delegate = Rails.delegate, getData = Rails.getData, $ = Rails.$, refreshCSRFTokens = Rails.refreshCSRFTokens, CSRFProtection = Rails.CSRFProtection, loadCSPNonce = Rails.loadCSPNonce, enableElement = Rails.enableElement, disableElement = Rails.disableElement, handleDisabledElement = Rails.handleDisabledElement, handleConfirm = Rails.handleConfirm, preventInsignificantClick = Rails.preventInsignificantClick, handleRemote = Rails.handleRemote, formSubmitButtonClick = Rails.formSubmitButtonClick, handleMethod = Rails.handleMethod;
699
-
700
- if ((typeof jQuery !== "undefined" && jQuery !== null) && (jQuery.ajax != null)) {
701
- if (jQuery.rails) {
702
- throw new Error('If you load both jquery_ujs and rails-ujs, use rails-ujs only.');
703
- }
704
- jQuery.rails = Rails;
705
- jQuery.ajaxPrefilter(function(options, originalOptions, xhr) {
706
- if (!options.crossDomain) {
707
- return CSRFProtection(xhr);
708
- }
709
- });
710
- }
711
-
712
- Rails.start = function() {
713
- if (window._rails_loaded) {
714
- throw new Error('rails-ujs has already been loaded!');
715
- }
716
- window.addEventListener('pageshow', function() {
717
- $(Rails.formEnableSelector).forEach(function(el) {
718
- if (getData(el, 'ujs:disabled')) {
719
- return enableElement(el);
720
- }
721
- });
722
- return $(Rails.linkDisableSelector).forEach(function(el) {
723
- if (getData(el, 'ujs:disabled')) {
724
- return enableElement(el);
725
- }
726
- });
727
- });
728
- delegate(document, Rails.linkDisableSelector, 'ajax:complete', enableElement);
729
- delegate(document, Rails.linkDisableSelector, 'ajax:stopped', enableElement);
730
- delegate(document, Rails.buttonDisableSelector, 'ajax:complete', enableElement);
731
- delegate(document, Rails.buttonDisableSelector, 'ajax:stopped', enableElement);
732
- delegate(document, Rails.linkClickSelector, 'click', preventInsignificantClick);
733
- delegate(document, Rails.linkClickSelector, 'click', handleDisabledElement);
734
- delegate(document, Rails.linkClickSelector, 'click', handleConfirm);
735
- delegate(document, Rails.linkClickSelector, 'click', disableElement);
736
- delegate(document, Rails.linkClickSelector, 'click', handleRemote);
737
- delegate(document, Rails.linkClickSelector, 'click', handleMethod);
738
- delegate(document, Rails.buttonClickSelector, 'click', preventInsignificantClick);
739
- delegate(document, Rails.buttonClickSelector, 'click', handleDisabledElement);
740
- delegate(document, Rails.buttonClickSelector, 'click', handleConfirm);
741
- delegate(document, Rails.buttonClickSelector, 'click', disableElement);
742
- delegate(document, Rails.buttonClickSelector, 'click', handleRemote);
743
- delegate(document, Rails.inputChangeSelector, 'change', handleDisabledElement);
744
- delegate(document, Rails.inputChangeSelector, 'change', handleConfirm);
745
- delegate(document, Rails.inputChangeSelector, 'change', handleRemote);
746
- delegate(document, Rails.formSubmitSelector, 'submit', handleDisabledElement);
747
- delegate(document, Rails.formSubmitSelector, 'submit', handleConfirm);
748
- delegate(document, Rails.formSubmitSelector, 'submit', handleRemote);
749
- delegate(document, Rails.formSubmitSelector, 'submit', function(e) {
750
- return setTimeout((function() {
751
- return disableElement(e);
752
- }), 13);
753
- });
754
- delegate(document, Rails.formSubmitSelector, 'ajax:send', disableElement);
755
- delegate(document, Rails.formSubmitSelector, 'ajax:complete', enableElement);
756
- delegate(document, Rails.formInputClickSelector, 'click', preventInsignificantClick);
757
- delegate(document, Rails.formInputClickSelector, 'click', handleDisabledElement);
758
- delegate(document, Rails.formInputClickSelector, 'click', handleConfirm);
759
- delegate(document, Rails.formInputClickSelector, 'click', formSubmitButtonClick);
760
- document.addEventListener('DOMContentLoaded', refreshCSRFTokens);
761
- document.addEventListener('DOMContentLoaded', loadCSPNonce);
762
- return window._rails_loaded = true;
763
- };
764
-
765
- if (window.Rails === Rails && fire(document, 'rails:attachBindings')) {
766
- Rails.start();
767
- }
768
-
769
- }).call(this);
770
- }).call(this);
771
-
772
- if (typeof module === "object" && module.exports) {
773
- module.exports = Rails;
774
- } else if (typeof define === "function" && define.amd) {
775
- define(Rails);
776
- }
777
- }).call(this);