render_async 2.1.7 → 2.1.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.all-contributorsrc +31 -1
- data/.github/CONTRIBUTING.md +40 -0
- data/.gitignore +1 -0
- data/.gitmodules +4 -0
- data/CHANGELOG.md +22 -0
- data/README.md +137 -29
- data/app/views/render_async/_render_async.html.erb +5 -2
- data/app/views/render_async/_request_jquery.js.erb +52 -10
- data/app/views/render_async/_request_vanilla.js.erb +56 -11
- data/bin/integration-tests +7 -0
- data/lib/render_async/configuration.rb +4 -1
- data/lib/render_async/version.rb +1 -1
- data/lib/render_async/view_helper.rb +22 -6
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5eb3554f389bd0bcab8944c56c59238359d1c181c7dbc212d12e0335a9960fa6
|
4
|
+
data.tar.gz: a00cfb7925232e67825579356c33707d97258d369d41d92f676077c6e0b1d17e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: acd95e67267622528c723d41ba5dfe1114319173f3455004523fd0dab784d8626a21314a389373f473d5147465e29773defb75c40d7ff6cb15053b7eba44e1a2
|
7
|
+
data.tar.gz: ccb2a071554bdca88a02b8b3b178711b01d116067eda7d48f01385056459cd3f59e8561d489ce76380be26ad8979398f40300759915c07962899aef608751e24
|
data/.all-contributorsrc
CHANGED
@@ -138,7 +138,8 @@
|
|
138
138
|
"avatar_url": "https://avatars3.githubusercontent.com/u/1935686?v=4",
|
139
139
|
"profile": "https://github.com/reneklacan",
|
140
140
|
"contributions": [
|
141
|
-
"code"
|
141
|
+
"code",
|
142
|
+
"doc"
|
142
143
|
]
|
143
144
|
},
|
144
145
|
{
|
@@ -205,6 +206,35 @@
|
|
205
206
|
"contributions": [
|
206
207
|
"code"
|
207
208
|
]
|
209
|
+
},
|
210
|
+
{
|
211
|
+
"login": "villu164",
|
212
|
+
"name": "villu164",
|
213
|
+
"avatar_url": "https://avatars0.githubusercontent.com/u/998682?v=4",
|
214
|
+
"profile": "https://github.com/villu164",
|
215
|
+
"contributions": [
|
216
|
+
"doc"
|
217
|
+
]
|
218
|
+
},
|
219
|
+
{
|
220
|
+
"login": "Mbuckley0",
|
221
|
+
"name": "Mitchell Buckley",
|
222
|
+
"avatar_url": "https://avatars.githubusercontent.com/u/11203679?v=4",
|
223
|
+
"profile": "https://github.com/Mbuckley0",
|
224
|
+
"contributions": [
|
225
|
+
"code",
|
226
|
+
"doc"
|
227
|
+
]
|
228
|
+
},
|
229
|
+
{
|
230
|
+
"login": "yhirano55",
|
231
|
+
"name": "yhirano55",
|
232
|
+
"avatar_url": "https://avatars.githubusercontent.com/u/15371677?v=4",
|
233
|
+
"profile": "https://github.com/yhirano55",
|
234
|
+
"contributions": [
|
235
|
+
"code",
|
236
|
+
"doc"
|
237
|
+
]
|
208
238
|
}
|
209
239
|
],
|
210
240
|
"repoType": "github"
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# :pray: Contributing
|
2
|
+
|
3
|
+
Thank you for considering or deciding to contribute, this is much appreciated!
|
4
|
+
Any kind of bug reports and pull requests are encouraged and welcome on GitHub at
|
5
|
+
https://github.com/renderedtext/render_async.
|
6
|
+
|
7
|
+
## :inbox_tray: Installing dependencies
|
8
|
+
|
9
|
+
You can install all needed dependencies by running `bin/setup`.
|
10
|
+
|
11
|
+
## :runner: Running RSpec tests
|
12
|
+
|
13
|
+
You can run either `rake spec` or `bundle exec rspec` to run all the RSpec tests
|
14
|
+
in the project.
|
15
|
+
|
16
|
+
## :running_woman: Running integration tests
|
17
|
+
|
18
|
+
There is a simple command `bin/integration-tests` which sets up 2 submodules,
|
19
|
+
and runs Cucumber features in them.
|
20
|
+
|
21
|
+
There are 2 submodules for render_async. The submodules are Rails 5 and Rails 6
|
22
|
+
projects which are located in:
|
23
|
+
|
24
|
+
- `spec/fixtures/rails-5-base-app`, and
|
25
|
+
- `spec/fixtures/rails-6-base-app`.
|
26
|
+
|
27
|
+
You can find [Rails 5 base app here](https://github.com/nikolalsvk/rails-5-base-app/tree/render-async),
|
28
|
+
and the [Rails 6 base app here](https://github.com/nikolalsvk/rails-6-base-app/tree/render-async).
|
29
|
+
|
30
|
+
Each of them have different use cases of render_async defined in `app/views/render_asyncs/_use_cases.html.erb` in their repos.
|
31
|
+
All the feature tests are inside `features/render_async.feature` and `features/render_async_jquery.feature` files.
|
32
|
+
|
33
|
+
If you are adding one or more feature tests or use cases, make sure to make a
|
34
|
+
PR on those repos as well and include them in the PR on the render_async repo.
|
35
|
+
|
36
|
+
## :sos: Need help?
|
37
|
+
|
38
|
+
Got any issues or difficulties?
|
39
|
+
Join [render_async's Discord channel](https://discord.gg/SPfbeRm)
|
40
|
+
and ask questions there. We will try to respond to you as quickly as possible.
|
data/.gitignore
CHANGED
data/.gitmodules
CHANGED
@@ -2,3 +2,7 @@
|
|
2
2
|
path = spec/fixtures/rails-5-base-app
|
3
3
|
url = git@github.com:nikolalsvk/rails-5-base-app.git
|
4
4
|
branch = render-async
|
5
|
+
[submodule "spec/fixtures/rails-6-base-app"]
|
6
|
+
path = spec/fixtures/rails-6-base-app
|
7
|
+
url = git@github.com:nikolalsvk/rails-6-base-app.git
|
8
|
+
branch = render-async
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,25 @@
|
|
1
|
+
### 2.1.10 (2021/03/21)
|
2
|
+
|
3
|
+
* [#146](https://github.com/renderedtext/render_async/pull/146): Add comment when we check if container is present - [@nikolalsvk](https://github.com/nikolalsvk).
|
4
|
+
* [#145](https://github.com/renderedtext/render_async/pull/145): Wrap html_options for turbolinks - [@yhirano55](https://github.com/yhirano55).
|
5
|
+
* [#144](https://github.com/renderedtext/render_async/pull/144): Avoid TypeError if container has already disappear - [@yhirano55](https://github.com/yhirano55).
|
6
|
+
|
7
|
+
### 2.1.9 (2021/02/23)
|
8
|
+
|
9
|
+
* [#142](https://github.com/renderedtext/render_async/pull/142): Update Turbolinks docs - [@nikolalsvk](https://github.com/nikolalsvk).
|
10
|
+
* [#141](https://github.com/renderedtext/render_async/pull/141): Add Support for Turbo - [@MBuckley0](https://github.com/Mbuckley0).
|
11
|
+
* [#139](https://github.com/renderedtext/render_async/pull/139): Fix readme configuration-options anchor - [@richardvenneman](https://github.com/richardvenneman).
|
12
|
+
* [#138](https://github.com/renderedtext/render_async/pull/138): Add Rails 6 base app as a fixture - [@nikolalsvk](https://github.com/nikolalsvk).
|
13
|
+
* [#137](https://github.com/renderedtext/render_async/pull/137): Rename config - [@nikolalsvk](https://github.com/nikolalsvk).
|
14
|
+
|
15
|
+
### 2.1.8 (2020/10/24)
|
16
|
+
|
17
|
+
* [#134](https://github.com/renderedtext/render_async/pull/134): Add config option for setting nonce - [@nikolalsvk](https://github.com/nikolalsvk).
|
18
|
+
* [#132](https://github.com/renderedtext/render_async/pull/132): Refresh render_async with an event - [@nikolalsvk](https://github.com/nikolalsvk).
|
19
|
+
* [#131](https://github.com/renderedtext/render_async/pull/131): Start to poll on page load with toggle - [@nikolalsvk](https://github.com/nikolalsvk).
|
20
|
+
* [#130](https://github.com/renderedtext/render_async/pull/130): Set up control events after document loaded - [@nikolalsvk](https://github.com/nikolalsvk).
|
21
|
+
* [#127](https://github.com/renderedtext/render_async/pull/127): Update README.md, to reflect correct turbolinks configuration value - [@villu164](https://github.com/villu164).
|
22
|
+
|
1
23
|
### 2.1.7 (2020/8/1)
|
2
24
|
|
3
25
|
* [#125](https://github.com/renderedtext/render_async/pull/125): Implement retry after some time feature - [@nikolalsvk](https://github.com/nikolalsvk).
|
data/README.md
CHANGED
@@ -82,7 +82,7 @@ And then execute:
|
|
82
82
|
<%= render_async comment_stats_path %>
|
83
83
|
```
|
84
84
|
|
85
|
-
2. Then create a route
|
85
|
+
2. Then create a route for it `config/routes.rb`:
|
86
86
|
```ruby
|
87
87
|
get :comment_stats, controller: :comments
|
88
88
|
```
|
@@ -119,6 +119,7 @@ Advanced usage includes information on different options, such as:
|
|
119
119
|
- [Passing in a placeholder](#passing-in-a-placeholder)
|
120
120
|
- [Passing in an event name](#passing-in-an-event-name)
|
121
121
|
- [Using default events](#using-default-events)
|
122
|
+
- [Refreshing the partial](#refreshing-the-partial)
|
122
123
|
- [Retry on failure](#retry-on-failure)
|
123
124
|
- [Retry after some time](#retry-after-some-time)
|
124
125
|
- [Toggle event](#toggle-event)
|
@@ -129,10 +130,11 @@ Advanced usage includes information on different options, such as:
|
|
129
130
|
- [Caching](#caching)
|
130
131
|
- [Doing non-GET requests](#doing-non-get-requests)
|
131
132
|
- [Using with Turbolinks](#using-with-turbolinks)
|
133
|
+
- [Using with Turbo](#using-with-turbo)
|
132
134
|
- [Using with respond_to and JS format](#using-with-respond_to-and-js-format)
|
133
|
-
- [Nested
|
135
|
+
- [Nested async renders](#nested-async-renders)
|
134
136
|
- [Customizing the content_for name](#customizing-the-content_for-name)
|
135
|
-
- [Configuration](#configuration)
|
137
|
+
- [Configuration options](#configuration-options)
|
136
138
|
|
137
139
|
### Passing in a container ID
|
138
140
|
|
@@ -178,6 +180,7 @@ Rendered code in the view:
|
|
178
180
|
`javascript_tag`, to drop HTML tags into the `script` element.
|
179
181
|
|
180
182
|
Example of utilizing `html_options` with a [nonce](https://edgeguides.rubyonrails.org/security.html#content-security-policy):
|
183
|
+
|
181
184
|
```erb
|
182
185
|
<%= render_async users_path, html_options: { nonce: true } %>
|
183
186
|
```
|
@@ -196,6 +199,8 @@ Rendered code in the view:
|
|
196
199
|
</div>
|
197
200
|
```
|
198
201
|
|
202
|
+
> :bulb: You can enable `nonce` to be set everywhere by using [configuration option](#configuration-options) render_async provides.
|
203
|
+
|
199
204
|
### Passing in an HTML element name
|
200
205
|
|
201
206
|
`render_async` can take in an HTML element name, allowing you to control
|
@@ -287,7 +292,7 @@ document.addEventListener("users-loaded", function(event) {
|
|
287
292
|
### Using default events
|
288
293
|
|
289
294
|
`render_async` will fire the event `render_async_load` when an async partial
|
290
|
-
has loaded and rendered on page.
|
295
|
+
has loaded and rendered on the page.
|
291
296
|
|
292
297
|
In case there is an error, the event `render_async_error` will fire instead.
|
293
298
|
|
@@ -317,6 +322,36 @@ $(document).on('render_async_error', function(event) {
|
|
317
322
|
});
|
318
323
|
```
|
319
324
|
|
325
|
+
### Refreshing the partial
|
326
|
+
|
327
|
+
`render_async` lets you refresh (reload) the partial by letting you dispatch
|
328
|
+
the 'refresh' event on the `render_async`'s container. An example:
|
329
|
+
|
330
|
+
```erb
|
331
|
+
<%= render_async comments_path,
|
332
|
+
container_id: 'refresh-me',
|
333
|
+
replace_container: false %>
|
334
|
+
|
335
|
+
<button id="refresh-button">Refresh comments</button>
|
336
|
+
|
337
|
+
<script>
|
338
|
+
var button = document.getElementById('refresh-button')
|
339
|
+
var container = document.getElementById('refresh-me');
|
340
|
+
|
341
|
+
button.addEventListener('click', function() {
|
342
|
+
var event = new Event('refresh');
|
343
|
+
|
344
|
+
// Dispatch 'refresh' on the render_async container
|
345
|
+
container.dispatchEvent(event)
|
346
|
+
})
|
347
|
+
</script>
|
348
|
+
```
|
349
|
+
|
350
|
+
If you follow the example above, when you click "Refresh comments" button,
|
351
|
+
`render_async` will trigger again and reload the `comments_path`.
|
352
|
+
|
353
|
+
> :bulb: Note that you need to pass `replace_container: false` so you can later dispatch an event on that container.
|
354
|
+
|
320
355
|
### Retry on failure
|
321
356
|
|
322
357
|
`render_async` can retry your requests if they fail for some reason.
|
@@ -350,7 +385,7 @@ failure. In the end, if the request is still failing after 5th time, it will
|
|
350
385
|
dispatch a [default error event](#using-default-events).
|
351
386
|
|
352
387
|
> :candy: If you are catching an event after an error, you can get `retryCount` from
|
353
|
-
the event. `retryCount` will have number of retries it took before the event was dispatched.
|
388
|
+
the event. `retryCount` will have the number of retries it took before the event was dispatched.
|
354
389
|
|
355
390
|
Here is an example on how to get `retryCount`:
|
356
391
|
|
@@ -367,6 +402,20 @@ Here is an example on how to get `retryCount`:
|
|
367
402
|
</script>
|
368
403
|
```
|
369
404
|
|
405
|
+
If you need to pass retry count to the backend, you can pass `retry_count_header` in `render_async`'s options:
|
406
|
+
|
407
|
+
```erb
|
408
|
+
<%= render_async users_path,
|
409
|
+
retry_count: 5,
|
410
|
+
retry_count_header: 'Retry-Count-Current' %>
|
411
|
+
```
|
412
|
+
|
413
|
+
And then in controller you can read the value from request headers.
|
414
|
+
|
415
|
+
```
|
416
|
+
request.headers['Retry-Count-Current']&.to_i
|
417
|
+
```
|
418
|
+
|
370
419
|
### Toggle event
|
371
420
|
|
372
421
|
You can trigger `render_async` loading by clicking or doing another event to a
|
@@ -381,8 +430,8 @@ do this by doing the following:
|
|
381
430
|
```
|
382
431
|
|
383
432
|
This will trigger `render_async` to load the `comments_path` when you click the `#comments-button` element.
|
384
|
-
If you want to remove event once it's triggered, you can pass `once: true` in the toggle options.
|
385
|
-
The `once` option is false by default.
|
433
|
+
If you want to remove an event once it's triggered, you can pass `once: true` in the toggle options.
|
434
|
+
The `once` option is false (`nil`) by default.
|
386
435
|
|
387
436
|
You can also pass in a placeholder before the `render_async` is triggered. That
|
388
437
|
way, the element that started `render_async` logic will be removed after the
|
@@ -405,10 +454,28 @@ pass `toggle` and `interval` arguments to `render_async` call like this:
|
|
405
454
|
<%= render_async comments_path, toggle: { selector: '#comments-button', event: :click }, interval: 2000 %>
|
406
455
|
```
|
407
456
|
|
457
|
+
If you want `render_async` to render the request on load, you can pass `start:
|
458
|
+
true`. Passing the `start` option inside the `toggle` hash will trigger
|
459
|
+
`render_async` on page load. You can then toggle off polling by interacting
|
460
|
+
with the element you specified. An example:
|
461
|
+
|
462
|
+
```erb
|
463
|
+
<a href='#' id='comments-button'>Toggle comments loading</a>
|
464
|
+
<%= render_async comments_path,
|
465
|
+
toggle: { selector: '#comments-button',
|
466
|
+
event: :click,
|
467
|
+
start: true },
|
468
|
+
interval: 2000 %>
|
469
|
+
```
|
470
|
+
|
471
|
+
In the example above, the comments will load as soon as the page is rendered.
|
472
|
+
Then, you can stop polling for comments by clicking the "Toggle comments
|
473
|
+
loading" button.
|
474
|
+
|
408
475
|
### Polling
|
409
476
|
|
410
477
|
You can call `render_async` with interval argument. This will make render_async
|
411
|
-
call specified path at specified interval.
|
478
|
+
call specified path at the specified interval.
|
412
479
|
|
413
480
|
By doing this:
|
414
481
|
```erb
|
@@ -418,8 +485,8 @@ You are telling `render_async` to fetch comments_path every 5 seconds.
|
|
418
485
|
|
419
486
|
This can be handy if you want to enable polling for a specific URL.
|
420
487
|
|
421
|
-
> :warning: By passing interval to `render_async`, initial container element
|
422
|
-
> will remain in HTML tree
|
488
|
+
> :warning: By passing interval to `render_async`, the initial container element
|
489
|
+
> will remain in the HTML tree and it will not be replaced with request response.
|
423
490
|
> You can handle how that container element is rendered and its style by
|
424
491
|
> [passing in an HTML element name](#passing-in-an-html-element-name) and
|
425
492
|
> [HTML element class](#passing-in-a-container-class-name).
|
@@ -431,8 +498,8 @@ First one is pretty simple, and it involves using the [toggle](#toggle-event)
|
|
431
498
|
feature. To do this, you can follow instructions in the
|
432
499
|
[control polling with a toggle section](#control-polling-with-a-toggle).
|
433
500
|
|
434
|
-
|
435
|
-
container element. From your code, you can emit following events:
|
501
|
+
The second option is more advanced and it involves emitting events to the `render_async`'s
|
502
|
+
container element. From your code, you can emit the following events:
|
436
503
|
- 'async-stop' - this will stop polling
|
437
504
|
- 'async-start' - this will start polling.
|
438
505
|
|
@@ -470,13 +537,13 @@ An example of how you can do this looks like this:
|
|
470
537
|
```
|
471
538
|
|
472
539
|
We are rendering two buttons - "Stop polling" and "Start polling". Then, we
|
473
|
-
attach event listener to catch any clicking on the buttons. When the buttons
|
474
|
-
are clicked, we either stop the polling
|
540
|
+
attach an event listener to catch any clicking on the buttons. When the buttons
|
541
|
+
are clicked, we either stop the polling or start the polling, depending on which
|
475
542
|
button a user clicks.
|
476
543
|
|
477
544
|
### Handling errors
|
478
545
|
|
479
|
-
`render_async`
|
546
|
+
`render_async` lets you handle errors by allowing you to pass in `error_message`
|
480
547
|
and `error_event_name`.
|
481
548
|
|
482
549
|
- `error_message`
|
@@ -563,19 +630,49 @@ end
|
|
563
630
|
```
|
564
631
|
|
565
632
|
This way, you're not breaking Turbolinks flow of loading or reloading a page.
|
566
|
-
It
|
633
|
+
It is more efficient than the next option below.
|
567
634
|
|
568
635
|
Another option:
|
569
636
|
If you want, you can tell Turbolinks to reload your `render_async` call as follows:
|
570
637
|
|
571
638
|
```erb
|
572
|
-
<%= render_async events_path, 'data-turbolinks-track': 'reload' %>
|
639
|
+
<%= render_async events_path, html_options: { 'data-turbolinks-track': 'reload' } %>
|
573
640
|
```
|
574
641
|
|
575
642
|
This will reload the whole page with Turbolinks.
|
576
643
|
|
577
|
-
> :bulb:
|
578
|
-
the `<
|
644
|
+
> :bulb: If Turbolinks is misbehaving in some way, make sure to put `<%= content_for :render_async %>` in your base view file in
|
645
|
+
the `<body>` and not the `<head>`.
|
646
|
+
|
647
|
+
### Using with Turbo
|
648
|
+
|
649
|
+
On Turbo applications, you may experience caching issues when navigating
|
650
|
+
away from, and then back to, a page with a `render_async` call on it. This will
|
651
|
+
likely show up as an empty div.
|
652
|
+
|
653
|
+
If you're using Turbo, you can resolve this by setting Turbo
|
654
|
+
configuration of `render_async` to true:
|
655
|
+
|
656
|
+
```rb
|
657
|
+
RenderAsync.configure do |config|
|
658
|
+
config.turbo = true # Enable this option if you are using Turbo
|
659
|
+
end
|
660
|
+
```
|
661
|
+
|
662
|
+
This way, you're not breaking Turbos flow of loading or reloading a page.
|
663
|
+
It is more efficient than the next option below.
|
664
|
+
|
665
|
+
Another option:
|
666
|
+
If you want, you can tell Turbo to reload your `render_async` call as follows:
|
667
|
+
|
668
|
+
```erb
|
669
|
+
<%= render_async events_path, html_options: { 'data-turbo-track': 'reload' } %>
|
670
|
+
```
|
671
|
+
|
672
|
+
This will reload the whole page with Turbo.
|
673
|
+
|
674
|
+
> :bulb: If Turbo is misbehaving in some way, make sure to put `<%= content_for :render_async %>` in your base view file in
|
675
|
+
the `<body>` and not the `<head>`.
|
579
676
|
|
580
677
|
### Using with respond_to and JS format
|
581
678
|
|
@@ -594,7 +691,7 @@ def comment_stats
|
|
594
691
|
end
|
595
692
|
```
|
596
693
|
|
597
|
-
When you do this, Rails will
|
694
|
+
When you do this, Rails will sometimes set the response's `Content-Type` header
|
598
695
|
to `text/javascript`. This causes the partial not to be rendered in the HTML.
|
599
696
|
This usually happens when there's browser caching.
|
600
697
|
|
@@ -605,7 +702,7 @@ render call:
|
|
605
702
|
render partial: "comment_stats", content_type: 'text/html'
|
606
703
|
```
|
607
704
|
|
608
|
-
### Nested
|
705
|
+
### Nested async renders
|
609
706
|
|
610
707
|
It is possible to nest async templates within other async templates. When doing
|
611
708
|
so, another `content_for` is required to ensure the JavaScript needed to load
|
@@ -645,7 +742,7 @@ For example:
|
|
645
742
|
<%= content_for :render_async_comment_stats %>
|
646
743
|
```
|
647
744
|
|
648
|
-
### Configuration
|
745
|
+
### Configuration options
|
649
746
|
|
650
747
|
`render_async` renders Vanilla JS (regular JavaScript, non-jQuery code)
|
651
748
|
**by default** in order to fetch the request from the server.
|
@@ -655,10 +752,14 @@ so.
|
|
655
752
|
|
656
753
|
You can configure it by doing the following anywhere before you call
|
657
754
|
`render_async`:
|
755
|
+
|
658
756
|
```rb
|
659
757
|
RenderAsync.configure do |config|
|
660
|
-
config.jquery = true # This will render jQuery code, and skip Vanilla JS code
|
661
|
-
config.turbolinks =
|
758
|
+
config.jquery = true # This will render jQuery code, and skip Vanilla JS code. The default value is false.
|
759
|
+
config.turbolinks = true # Enable this option if you are using Turbolinks 5+. The default value is false.
|
760
|
+
config.turbo = true # Enable this option if you are using Turbo. The default value is false.
|
761
|
+
config.replace_container = false # Set to false if you want to keep the placeholder div element from render_async. The default value is true.
|
762
|
+
config.nonces = true # Set to true if you want render_async's javascript_tag always to receive nonce: true. The default value is false.
|
662
763
|
end
|
663
764
|
```
|
664
765
|
|
@@ -668,12 +769,20 @@ Also, you can do it like this:
|
|
668
769
|
RenderAsync.configuration.jquery = true
|
669
770
|
```
|
670
771
|
|
772
|
+
Aside from configuring whether the gem relies on jQuery or VanillaJS, you can
|
773
|
+
configure other options:
|
774
|
+
|
775
|
+
- `turbolinks` option - If you are using Turbolinks 5+, you should enable this option since it supports Turbolinks way of loading data. The default value for this option is false.
|
776
|
+
- `turbo` option - If you are using Turbo, you should enable this option since it supports Turbo way of loading data. The default value for this option is false.
|
777
|
+
- `replace_container` option - If you want render_async to replace its container with the request response, turn this on. You can turn this on globally for all render_async calls, but if you use this option in a specific render_async call, it will override the global configuration. The default value is true.
|
778
|
+
- `nonces` - If you need to pass in `nonce: true` to the `javascript_tag` in your application, it might make sense for you to turn this on globally for all render_async calls. To read more about nonces, check out [Rails' official guide on security](https://edgeguides.rubyonrails.org/security.html). The default value is false.
|
779
|
+
|
671
780
|
## :hammer_and_pick: Development
|
672
781
|
|
673
782
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
674
783
|
`rake spec` to run the tests. You can also run `bin/console` for an interactive
|
675
784
|
prompt that will allow you to experiment. To run integration tests, use
|
676
|
-
`bin/integration-tests`.
|
785
|
+
`bin/integration-tests`. For more information, check out [CONTRIBUTING](.github/CONTRIBUTING.md) file, please.
|
677
786
|
|
678
787
|
Got any questions or comments about development (or anything else)?
|
679
788
|
Join [render_async's Discord channel](https://discord.gg/SPfbeRm)
|
@@ -681,9 +790,7 @@ and let's make `render_async` even better!
|
|
681
790
|
|
682
791
|
## :pray: Contributing
|
683
792
|
|
684
|
-
|
685
|
-
Any kind of bug reports and pull requests are encouraged and welcome on GitHub at
|
686
|
-
https://github.com/renderedtext/render_async.
|
793
|
+
Check out [CONTRIBUTING](.github/CONTRIBUTING.md) file, please.
|
687
794
|
|
688
795
|
Got any issues or difficulties?
|
689
796
|
Join [render_async's Discord channel](https://discord.gg/SPfbeRm)
|
@@ -701,8 +808,9 @@ Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds
|
|
701
808
|
<!-- prettier-ignore -->
|
702
809
|
| [<img src="https://avatars2.githubusercontent.com/u/3028124?v=4" width="100px;"/><br /><sub><b>Nikola Đuza</b></sub>](https://nikolalsvk.github.io)<br />[💬](#question-nikolalsvk "Answering Questions") [💻](https://github.com/renderedtext/render_async/commits?author=nikolalsvk "Code") [📖](https://github.com/renderedtext/render_async/commits?author=nikolalsvk "Documentation") [👀](#review-nikolalsvk "Reviewed Pull Requests") | [<img src="https://avatars0.githubusercontent.com/u/3866868?v=4" width="100px;"/><br /><sub><b>Colin</b></sub>](http://www.colinxfleming.com)<br />[💻](https://github.com/renderedtext/render_async/commits?author=colinxfleming "Code") [📖](https://github.com/renderedtext/render_async/commits?author=colinxfleming "Documentation") [💡](#example-colinxfleming "Examples") | [<img src="https://avatars2.githubusercontent.com/u/334273?v=4" width="100px;"/><br /><sub><b>Kasper Grubbe</b></sub>](http://kaspergrubbe.com)<br />[💻](https://github.com/renderedtext/render_async/commits?author=kaspergrubbe "Code") | [<img src="https://avatars2.githubusercontent.com/u/163584?v=4" width="100px;"/><br /><sub><b>Sai Ram Kunala</b></sub>](https://sairam.xyz/)<br />[📖](https://github.com/renderedtext/render_async/commits?author=sairam "Documentation") | [<img src="https://avatars2.githubusercontent.com/u/3065882?v=4" width="100px;"/><br /><sub><b>Josh Arnold</b></sub>](https://github.com/nightsurge)<br />[💻](https://github.com/renderedtext/render_async/commits?author=nightsurge "Code") [📖](https://github.com/renderedtext/render_async/commits?author=nightsurge "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/107798?v=4" width="100px;"/><br /><sub><b>Elad Shahar</b></sub>](https://eladshahar.com)<br />[💻](https://github.com/renderedtext/render_async/commits?author=SaladFork "Code") [💡](#example-SaladFork "Examples") | [<img src="https://avatars3.githubusercontent.com/u/232392?v=4" width="100px;"/><br /><sub><b>Sasha</b></sub>](http://www.revzin.co.il)<br />[💻](https://github.com/renderedtext/render_async/commits?author=sasharevzin "Code") [📖](https://github.com/renderedtext/render_async/commits?author=sasharevzin "Documentation") |
|
703
810
|
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
|
704
|
-
| [<img src="https://avatars3.githubusercontent.com/u/50223?v=4" width="100px;"/><br /><sub><b>Ernest Surudo</b></sub>](http://elsurudo.com)<br />[💻](https://github.com/renderedtext/render_async/commits?author=elsurudo "Code") | [<img src="https://avatars1.githubusercontent.com/u/334809?v=4" width="100px;"/><br /><sub><b>Kurtis Rainbolt-Greene</b></sub>](https://kurtis.rainbolt-greene.online)<br />[💻](https://github.com/renderedtext/render_async/commits?author=krainboltgreene "Code") | [<img src="https://avatars2.githubusercontent.com/u/59744?v=4" width="100px;"/><br /><sub><b>Richard Schneeman</b></sub>](https://www.schneems.com)<br />[📖](https://github.com/renderedtext/render_async/commits?author=schneems "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/75705?v=4" width="100px;"/><br /><sub><b>Richard Venneman</b></sub>](https://www.cityspotters.com)<br />[📖](https://github.com/renderedtext/render_async/commits?author=richardvenneman "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/381395?v=4" width="100px;"/><br /><sub><b>Filipe W. Lima</b></sub>](https://github.com/filipewl)<br />[📖](https://github.com/renderedtext/render_async/commits?author=filipewl "Documentation") | [<img src="https://avatars0.githubusercontent.com/u/3135638?v=4" width="100px;"/><br /><sub><b>Jesús Eduardo Clemens Chong</b></sub>](https://github.com/eclemens)<br />[💻](https://github.com/renderedtext/render_async/commits?author=eclemens "Code") | [<img src="https://avatars3.githubusercontent.com/u/1935686?v=4" width="100px;"/><br /><sub><b>René Klačan</b></sub>](https://github.com/reneklacan)<br />[💻](https://github.com/renderedtext/render_async/commits?author=reneklacan "Code") |
|
811
|
+
| [<img src="https://avatars3.githubusercontent.com/u/50223?v=4" width="100px;"/><br /><sub><b>Ernest Surudo</b></sub>](http://elsurudo.com)<br />[💻](https://github.com/renderedtext/render_async/commits?author=elsurudo "Code") | [<img src="https://avatars1.githubusercontent.com/u/334809?v=4" width="100px;"/><br /><sub><b>Kurtis Rainbolt-Greene</b></sub>](https://kurtis.rainbolt-greene.online)<br />[💻](https://github.com/renderedtext/render_async/commits?author=krainboltgreene "Code") | [<img src="https://avatars2.githubusercontent.com/u/59744?v=4" width="100px;"/><br /><sub><b>Richard Schneeman</b></sub>](https://www.schneems.com)<br />[📖](https://github.com/renderedtext/render_async/commits?author=schneems "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/75705?v=4" width="100px;"/><br /><sub><b>Richard Venneman</b></sub>](https://www.cityspotters.com)<br />[📖](https://github.com/renderedtext/render_async/commits?author=richardvenneman "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/381395?v=4" width="100px;"/><br /><sub><b>Filipe W. Lima</b></sub>](https://github.com/filipewl)<br />[📖](https://github.com/renderedtext/render_async/commits?author=filipewl "Documentation") | [<img src="https://avatars0.githubusercontent.com/u/3135638?v=4" width="100px;"/><br /><sub><b>Jesús Eduardo Clemens Chong</b></sub>](https://github.com/eclemens)<br />[💻](https://github.com/renderedtext/render_async/commits?author=eclemens "Code") | [<img src="https://avatars3.githubusercontent.com/u/1935686?v=4" width="100px;"/><br /><sub><b>René Klačan</b></sub>](https://github.com/reneklacan)<br />[💻](https://github.com/renderedtext/render_async/commits?author=reneklacan "Code") [📖](https://github.com/renderedtext/render_async/commits?author=reneklacan "Documentation") |
|
705
812
|
| [<img src="https://avatars1.githubusercontent.com/u/1313442?v=4" width="100px;"/><br /><sub><b>Gil Gomes</b></sub>](http://gilgomes.com.br)<br />[📖](https://github.com/renderedtext/render_async/commits?author=gil27 "Documentation") | [<img src="https://avatars0.githubusercontent.com/u/6081795?v=4" width="100px;"/><br /><sub><b>Khoa Nguyen</b></sub>](https://github.com/ThanhKhoaIT)<br />[💻](https://github.com/renderedtext/render_async/commits?author=ThanhKhoaIT "Code") [📖](https://github.com/renderedtext/render_async/commits?author=ThanhKhoaIT "Documentation") | [<img src="https://avatars2.githubusercontent.com/u/8645918?v=4" width="100px;"/><br /><sub><b>Preet Sethi</b></sub>](https://www.linkedin.com/in/preetsethila/)<br />[💻](https://github.com/renderedtext/render_async/commits?author=preetsethi "Code") | [<img src="https://avatars3.githubusercontent.com/u/11586335?v=4" width="100px;"/><br /><sub><b>fangxing</b></sub>](https://github.com/fffx)<br />[💻](https://github.com/renderedtext/render_async/commits?author=fffx "Code") | [<img src="https://avatars3.githubusercontent.com/u/1191418?v=4" width="100px;"/><br /><sub><b>Emmanuel Pire</b></sub>](http://blog.lipsumarium.com)<br />[💻](https://github.com/renderedtext/render_async/commits?author=lipsumar "Code") [📖](https://github.com/renderedtext/render_async/commits?author=lipsumar "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/615509?v=4" width="100px;"/><br /><sub><b>Maxim Geerinck</b></sub>](https://github.com/maximgeerinck)<br />[💻](https://github.com/renderedtext/render_async/commits?author=maximgeerinck "Code") | [<img src="https://avatars1.githubusercontent.com/u/251706?v=4" width="100px;"/><br /><sub><b>Don</b></sub>](https://github.com/vanboom)<br />[💻](https://github.com/renderedtext/render_async/commits?author=vanboom "Code") |
|
813
|
+
| [<img src="https://avatars0.githubusercontent.com/u/998682?v=4" width="100px;"/><br /><sub><b>villu164</b></sub>](https://github.com/villu164)<br />[📖](https://github.com/renderedtext/render_async/commits?author=villu164 "Documentation") | [<img src="https://avatars.githubusercontent.com/u/11203679?v=4" width="100px;"/><br /><sub><b>Mitchell Buckley</b></sub>](https://github.com/Mbuckley0)<br />[💻](https://github.com/renderedtext/render_async/commits?author=Mbuckley0 "Code") [📖](https://github.com/renderedtext/render_async/commits?author=Mbuckley0 "Documentation") | [<img src="https://avatars.githubusercontent.com/u/15371677?v=4" width="100px;"/><br /><sub><b>yhirano55</b></sub>](https://github.com/yhirano55)<br />[💻](https://github.com/renderedtext/render_async/commits?author=yhirano55 "Code") [📖](https://github.com/renderedtext/render_async/commits?author=yhirano55 "Documentation") |
|
706
814
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
707
815
|
|
708
816
|
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!
|
@@ -8,6 +8,7 @@
|
|
8
8
|
<% content_for content_for_name do %>
|
9
9
|
<%= javascript_tag html_options do %>
|
10
10
|
<% locals = { container_id: container_id,
|
11
|
+
replace_container: replace_container,
|
11
12
|
path: path,
|
12
13
|
method: method,
|
13
14
|
data: data,
|
@@ -17,14 +18,16 @@
|
|
17
18
|
error_message: error_message,
|
18
19
|
error_event_name: error_event_name,
|
19
20
|
retry_count: retry_count,
|
21
|
+
retry_count_header: retry_count_header,
|
20
22
|
retry_delay: retry_delay,
|
21
23
|
interval: interval,
|
22
|
-
turbolinks: RenderAsync.configuration.turbolinks
|
24
|
+
turbolinks: RenderAsync.configuration.turbolinks,
|
25
|
+
turbo: RenderAsync.configuration.turbo} %>
|
23
26
|
|
24
27
|
<% if RenderAsync.configuration.jquery %>
|
25
28
|
<%= render partial: 'render_async/request_jquery',
|
26
29
|
formats: [:js],
|
27
|
-
locals: locals
|
30
|
+
locals: locals %>
|
28
31
|
<% else %>
|
29
32
|
<%= render partial: 'render_async/request_vanilla',
|
30
33
|
formats: [:js],
|
@@ -5,6 +5,11 @@ if (window.jQuery) {
|
|
5
5
|
return;
|
6
6
|
}
|
7
7
|
<% end %>
|
8
|
+
<% if turbo %>
|
9
|
+
if (document.documentElement.hasAttribute("data-turbo-preview")) {
|
10
|
+
return;
|
11
|
+
}
|
12
|
+
<% end %>
|
8
13
|
function createEvent(name, container) {
|
9
14
|
var event = undefined;
|
10
15
|
if (typeof(Event) === 'function') {
|
@@ -24,6 +29,8 @@ if (window.jQuery) {
|
|
24
29
|
} else {
|
25
30
|
<% if turbolinks %>
|
26
31
|
$(document).one('turbolinks:load', callback);
|
32
|
+
<% elsif turbo %>
|
33
|
+
$(document).one('turbo:load', callback);
|
27
34
|
<% else %>
|
28
35
|
$(document).ready(callback);
|
29
36
|
<% end %>
|
@@ -32,9 +39,15 @@ if (window.jQuery) {
|
|
32
39
|
|
33
40
|
function _makeRequest(currentRetryCount) {
|
34
41
|
var headers = <%= headers.to_json.html_safe %>;
|
35
|
-
var csrfTokenElement = document.querySelector('meta[name="csrf-token"]')
|
42
|
+
var csrfTokenElement = document.querySelector('meta[name="csrf-token"]');
|
36
43
|
if (csrfTokenElement)
|
37
|
-
headers['X-CSRF-Token'] = csrfTokenElement.content
|
44
|
+
headers['X-CSRF-Token'] = csrfTokenElement.content;
|
45
|
+
|
46
|
+
<% if retry_count_header %>
|
47
|
+
if (typeof(currentRetryCount) === 'number') {
|
48
|
+
headers['<%= retry_count_header.html_safe %>'] = currentRetryCount;
|
49
|
+
}
|
50
|
+
<% end %>
|
38
51
|
|
39
52
|
$.ajax({
|
40
53
|
url: '<%= path.html_safe %>',
|
@@ -43,11 +56,15 @@ if (window.jQuery) {
|
|
43
56
|
headers: headers
|
44
57
|
}).done(function(response) {
|
45
58
|
var container = $("#<%= container_id %>");
|
46
|
-
|
59
|
+
|
60
|
+
// If user navigated away before the request completed
|
61
|
+
if (!container.length) return;
|
62
|
+
|
63
|
+
<% if !interval && replace_container %>
|
64
|
+
container.replaceWith(response);
|
65
|
+
<% else %>
|
47
66
|
container.empty();
|
48
67
|
container.append(response);
|
49
|
-
<% else %>
|
50
|
-
container.replaceWith(response);
|
51
68
|
<% end %>
|
52
69
|
|
53
70
|
var loadEvent = createEvent('render_async_load', container);
|
@@ -66,6 +83,8 @@ if (window.jQuery) {
|
|
66
83
|
if (skipErrorMessage) return;
|
67
84
|
|
68
85
|
var container = $("#<%= container_id %>");
|
86
|
+
if (!container.length) return;
|
87
|
+
|
69
88
|
container.replaceWith("<%= error_message.try(:html_safe) %>");
|
70
89
|
|
71
90
|
var errorEvent = createEvent(
|
@@ -87,6 +106,8 @@ if (window.jQuery) {
|
|
87
106
|
_makeRequest(currentRetryCount)
|
88
107
|
}, <%= retry_delay %>)
|
89
108
|
}
|
109
|
+
<% else %>
|
110
|
+
_retryMakeRequest = _makeRequest
|
90
111
|
<% end %>
|
91
112
|
|
92
113
|
function retry(currentRetryCount) {
|
@@ -122,17 +143,34 @@ if (window.jQuery) {
|
|
122
143
|
}
|
123
144
|
}
|
124
145
|
|
125
|
-
|
146
|
+
function _setUpControlEvents() {
|
147
|
+
var container = $("#<%= container_id %>");
|
148
|
+
|
149
|
+
// Register a stop polling event on the container
|
150
|
+
$(container).on('async-stop', _clearRenderAsyncInterval)
|
126
151
|
|
127
|
-
|
128
|
-
|
152
|
+
// Register a start polling event on the container
|
153
|
+
$(container).on('async-start', _renderAsyncFunction)
|
154
|
+
}
|
129
155
|
|
130
|
-
|
131
|
-
$(container).on('async-start', _renderAsyncFunction)
|
156
|
+
_runAfterDocumentLoaded(_setUpControlEvents)
|
132
157
|
|
133
158
|
<% if turbolinks %>
|
134
159
|
$(document).one('turbolinks:visit', _clearRenderAsyncInterval);
|
135
160
|
<% end %>
|
161
|
+
<% if turbo %>
|
162
|
+
$(document).one('turbo:visit', _clearRenderAsyncInterval);
|
163
|
+
<% end %>
|
164
|
+
<% end %>
|
165
|
+
|
166
|
+
<% if !replace_container %>
|
167
|
+
function _setUpRefreshEvent() {
|
168
|
+
var container = $("#<%= container_id %>");
|
169
|
+
|
170
|
+
$(container).on('refresh', _renderAsyncFunction)
|
171
|
+
}
|
172
|
+
|
173
|
+
_runAfterDocumentLoaded(_setUpRefreshEvent)
|
136
174
|
<% end %>
|
137
175
|
|
138
176
|
<% if toggle %>
|
@@ -145,6 +183,10 @@ if (window.jQuery) {
|
|
145
183
|
_renderAsyncFunction();
|
146
184
|
}
|
147
185
|
});
|
186
|
+
|
187
|
+
<% if toggle[:start] %>
|
188
|
+
_renderAsyncFunction()
|
189
|
+
<% end %>
|
148
190
|
}
|
149
191
|
|
150
192
|
_runAfterDocumentLoaded(_setUpToggle);
|
@@ -4,6 +4,11 @@
|
|
4
4
|
return;
|
5
5
|
}
|
6
6
|
<% end %>
|
7
|
+
<% if turbo %>
|
8
|
+
if (document.documentElement.hasAttribute("data-turbo-preview")) {
|
9
|
+
return;
|
10
|
+
}
|
11
|
+
<% end %>
|
7
12
|
function createEvent(name, container) {
|
8
13
|
var event = undefined;
|
9
14
|
if (typeof(Event) === 'function') {
|
@@ -22,6 +27,11 @@
|
|
22
27
|
e.target.removeEventListener(e.type, arguments.callee);
|
23
28
|
callback();
|
24
29
|
});
|
30
|
+
<% elsif turbo %>
|
31
|
+
document.addEventListener("turbo:load", function(e) {
|
32
|
+
e.target.removeEventListener(e.type, arguments.callee);
|
33
|
+
callback();
|
34
|
+
});
|
25
35
|
<% else %>
|
26
36
|
document.addEventListener("DOMContentLoaded", callback);
|
27
37
|
<% end %>
|
@@ -36,9 +46,15 @@
|
|
36
46
|
request.open('<%= method %>', '<%= path.html_safe %>', asyncRequest);
|
37
47
|
|
38
48
|
var headers = <%= headers.to_json.html_safe %>;
|
39
|
-
var csrfTokenElement = document.querySelector('meta[name="csrf-token"]')
|
49
|
+
var csrfTokenElement = document.querySelector('meta[name="csrf-token"]');
|
40
50
|
if (csrfTokenElement)
|
41
|
-
headers['X-CSRF-Token'] = csrfTokenElement.content
|
51
|
+
headers['X-CSRF-Token'] = csrfTokenElement.content;
|
52
|
+
|
53
|
+
<% if retry_count_header %>
|
54
|
+
if (typeof(currentRetryCount) === 'number') {
|
55
|
+
headers['<%= retry_count_header.html_safe %>'] = currentRetryCount;
|
56
|
+
}
|
57
|
+
<% end %>
|
42
58
|
|
43
59
|
Object.keys(headers).map(function(key) {
|
44
60
|
request.setRequestHeader(key, headers[key]);
|
@@ -50,10 +66,14 @@
|
|
50
66
|
if (request.readyState === 4) {
|
51
67
|
if (request.status >= SUCCESS && request.status < ERROR) {
|
52
68
|
var container = document.getElementById('<%= container_id %>');
|
53
|
-
|
54
|
-
|
55
|
-
|
69
|
+
|
70
|
+
// If user navigated away before the request completed
|
71
|
+
if (!container) return;
|
72
|
+
|
73
|
+
<% if !interval && replace_container %>
|
56
74
|
container.outerHTML = request.response;
|
75
|
+
<% else %>
|
76
|
+
container.innerHTML = request.response;
|
57
77
|
<% end %>
|
58
78
|
|
59
79
|
var loadEvent = createEvent('render_async_load', container);
|
@@ -72,6 +92,8 @@
|
|
72
92
|
if (skipErrorMessage) return;
|
73
93
|
|
74
94
|
var container = document.getElementById('<%= container_id %>');
|
95
|
+
if (!container) return;
|
96
|
+
|
75
97
|
container.outerHTML = '<%= error_message.try(:html_safe) %>';
|
76
98
|
|
77
99
|
var errorEvent = createEvent(
|
@@ -92,11 +114,13 @@
|
|
92
114
|
<% if retry_count > 0 %>
|
93
115
|
|
94
116
|
<% if retry_delay %>
|
95
|
-
_retryMakeRequest = function(currentRetryCount) {
|
117
|
+
var _retryMakeRequest = function(currentRetryCount) {
|
96
118
|
setTimeout(function() {
|
97
119
|
_makeRequest(currentRetryCount)
|
98
120
|
}, <%= retry_delay %>)
|
99
121
|
}
|
122
|
+
<% else %>
|
123
|
+
var _retryMakeRequest = _makeRequest
|
100
124
|
<% end %>
|
101
125
|
|
102
126
|
function retry(currentRetryCount) {
|
@@ -132,17 +156,34 @@
|
|
132
156
|
}
|
133
157
|
}
|
134
158
|
|
135
|
-
|
159
|
+
function _setUpControlEvents() {
|
160
|
+
var container = document.getElementById('<%= container_id %>');
|
136
161
|
|
137
|
-
|
138
|
-
|
162
|
+
// Register a polling stop event on the container
|
163
|
+
container.addEventListener("async-stop", _clearRenderAsyncInterval)
|
139
164
|
|
140
|
-
|
141
|
-
|
165
|
+
// Register a start polling event on the container
|
166
|
+
container.addEventListener("async-start", _renderAsyncFunction)
|
167
|
+
}
|
168
|
+
|
169
|
+
_runAfterDocumentLoaded(_setUpControlEvents)
|
142
170
|
|
143
171
|
<% if turbolinks %>
|
144
172
|
document.addEventListener("turbolinks:visit", _clearRenderAsyncInterval)
|
145
173
|
<% end %>
|
174
|
+
<% if turbo %>
|
175
|
+
document.addEventListener("turbo:visit", _clearRenderAsyncInterval)
|
176
|
+
<% end %>
|
177
|
+
<% end %>
|
178
|
+
|
179
|
+
<% if !replace_container %>
|
180
|
+
function _setUpRefreshEvent() {
|
181
|
+
var container = document.getElementById('<%= container_id %>');
|
182
|
+
|
183
|
+
container.addEventListener('refresh', _renderAsyncFunction)
|
184
|
+
}
|
185
|
+
|
186
|
+
_runAfterDocumentLoaded(_setUpRefreshEvent)
|
146
187
|
<% end %>
|
147
188
|
|
148
189
|
<% if toggle %>
|
@@ -160,6 +201,10 @@
|
|
160
201
|
<% end %>
|
161
202
|
};
|
162
203
|
|
204
|
+
<% if toggle[:start] %>
|
205
|
+
_renderAsyncFunction()
|
206
|
+
<% end %>
|
207
|
+
|
163
208
|
for (var i = 0; i < selectors.length; ++i) {
|
164
209
|
selectors[i].addEventListener('<%= toggle[:event] || 'click' %>', handler)
|
165
210
|
}
|
data/bin/integration-tests
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
module RenderAsync
|
2
2
|
class Configuration
|
3
|
-
attr_accessor :jquery, :turbolinks
|
3
|
+
attr_accessor :jquery, :turbolinks, :turbo, :replace_container, :nonces
|
4
4
|
|
5
5
|
def initialize
|
6
6
|
@jquery = false
|
7
7
|
@turbolinks = false
|
8
|
+
@turbo = false
|
9
|
+
@replace_container = true
|
10
|
+
@nonces = false
|
8
11
|
end
|
9
12
|
end
|
10
13
|
end
|
data/lib/render_async/version.rb
CHANGED
@@ -2,7 +2,6 @@ require 'securerandom'
|
|
2
2
|
|
3
3
|
module RenderAsync
|
4
4
|
module ViewHelper
|
5
|
-
|
6
5
|
def render_async_cache_key(path)
|
7
6
|
"render_async_#{path}"
|
8
7
|
end
|
@@ -20,11 +19,10 @@ module RenderAsync
|
|
20
19
|
def render_async(path, options = {}, &placeholder)
|
21
20
|
event_name = options.delete(:event_name)
|
22
21
|
placeholder = capture(&placeholder) if block_given?
|
23
|
-
html_options = options.delete(:html_options) || {}
|
24
22
|
|
25
23
|
render 'render_async/render_async', **container_element_options(options),
|
26
24
|
path: path,
|
27
|
-
html_options: html_options,
|
25
|
+
html_options: html_options(options),
|
28
26
|
event_name: event_name,
|
29
27
|
placeholder: placeholder,
|
30
28
|
**request_options(options),
|
@@ -39,7 +37,16 @@ module RenderAsync
|
|
39
37
|
def container_element_options(options)
|
40
38
|
{ html_element_name: options[:html_element_name] || 'div',
|
41
39
|
container_id: options[:container_id] || generate_container_id,
|
42
|
-
container_class: options[:container_class]
|
40
|
+
container_class: options[:container_class],
|
41
|
+
replace_container: replace_container(options) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def html_options(options)
|
45
|
+
set_options = options.delete(:html_options) || {}
|
46
|
+
|
47
|
+
set_options[:nonce] = configuration.nonces if set_options[:nonce].nil?
|
48
|
+
|
49
|
+
set_options
|
43
50
|
end
|
44
51
|
|
45
52
|
def request_options(options)
|
@@ -56,6 +63,7 @@ module RenderAsync
|
|
56
63
|
def retry_options(options)
|
57
64
|
{
|
58
65
|
retry_count: options.delete(:retry_count) || 0,
|
66
|
+
retry_count_header: options.delete(:retry_count_header),
|
59
67
|
retry_delay: options.delete(:retry_delay)
|
60
68
|
}
|
61
69
|
end
|
@@ -71,10 +79,18 @@ module RenderAsync
|
|
71
79
|
}
|
72
80
|
end
|
73
81
|
|
74
|
-
private
|
75
|
-
|
76
82
|
def generate_container_id
|
77
83
|
"render_async_#{SecureRandom.hex(5)}#{Time.now.to_i}"
|
78
84
|
end
|
85
|
+
|
86
|
+
def replace_container(options)
|
87
|
+
return options[:replace_container] unless options[:replace_container].nil?
|
88
|
+
|
89
|
+
configuration.replace_container
|
90
|
+
end
|
91
|
+
|
92
|
+
def configuration
|
93
|
+
RenderAsync.configuration
|
94
|
+
end
|
79
95
|
end
|
80
96
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: render_async
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kasper Grubbe
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-10-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -61,6 +61,7 @@ extensions: []
|
|
61
61
|
extra_rdoc_files: []
|
62
62
|
files:
|
63
63
|
- ".all-contributorsrc"
|
64
|
+
- ".github/CONTRIBUTING.md"
|
64
65
|
- ".github/FUNDING.yml"
|
65
66
|
- ".gitignore"
|
66
67
|
- ".gitmodules"
|