render_async 2.0.2 → 2.1.0
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 +4 -4
- data/README.md +39 -1
- data/app/views/render_async/_render_async.html.erb +4 -0
- data/app/views/render_async/_request_jquery.js.erb +35 -2
- data/app/views/render_async/_request_vanilla.js.erb +33 -1
- data/lib/render_async/version.rb +1 -1
- data/lib/render_async/view_helper.rb +5 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc0f4801636b4b88873e40623ea250d27f35ee11
|
4
|
+
data.tar.gz: e4407a2cd9bfd7cf409dfe0d6846446bb6370db7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ea2036461e908f64a6d3ee180a28663052f31393f1a7c600cc8a3ec7319b2bfbd4a6c7e5534175f933accc944c154d3b2e6629e69f0feaf71b46f7b02f2b343
|
7
|
+
data.tar.gz: d4df153331955b0bef1111e5a9095f8ab01568bd69bbfe1bca014a5423e7d71f11859658ec27d2a356b565ce25346c8331b30ad57fb7d7b60f16ba18941e1738
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
[](https://codeclimate.com/github/renderedtext/render_async/coverage)
|
6
6
|
[](https://www.codetriage.com/renderedtext/render_async)
|
7
7
|
|
8
|
-

|
9
9
|
|
10
10
|
# render_async
|
11
11
|
|
@@ -79,6 +79,8 @@ Advanced usage includes information on different options, such as:
|
|
79
79
|
- [Passing in an HTML element name](#passing-in-an-html-element-name)
|
80
80
|
- [Passing in a placeholder](#passing-in-a-placeholder)
|
81
81
|
- [Passing in an event name](#passing-in-an-event-name)
|
82
|
+
- [Retry on failure](#retry-on-failure)
|
83
|
+
- [Polling](#polling)
|
82
84
|
- [Handling errors](#handling-errors)
|
83
85
|
- [Caching](#caching)
|
84
86
|
- [Doing non-GET requests](#doing-non-get-requests)
|
@@ -233,6 +235,42 @@ document.addEventListener("users-loaded", function() {
|
|
233
235
|
NOTE: Dispatching events is also supported for older browsers that don't
|
234
236
|
support Event constructor.
|
235
237
|
|
238
|
+
### Retry on failure
|
239
|
+
|
240
|
+
`render_async` can retry your requests if they fail for some reason.
|
241
|
+
|
242
|
+
If you want `render_async` to retry a request for number of times, you can do
|
243
|
+
this:
|
244
|
+
```erb
|
245
|
+
<%= render_async users_path, retry_count: 5, error_message: "Couldn't fetch it" %>
|
246
|
+
```
|
247
|
+
|
248
|
+
Now render_async will retry `users_path` for 5 times. If it succedes in
|
249
|
+
between, it will stop with dispatching requests. If it fails after 5 times,
|
250
|
+
it will show an [error message](#handling-errors) which you need to specify.
|
251
|
+
|
252
|
+
This can show useful when you know your requests often fail, and you don't want
|
253
|
+
to refresh the whole page just to retry them.
|
254
|
+
|
255
|
+
### Polling
|
256
|
+
|
257
|
+
You can call `render_async` with interval argument. This will make render_async
|
258
|
+
call specified path at specified interval.
|
259
|
+
|
260
|
+
By doing this:
|
261
|
+
```erb
|
262
|
+
<%= render_async comments_path, interval: 5000 %>
|
263
|
+
```
|
264
|
+
You are telling `render_async` to fetch comments_path every 5 seconds.
|
265
|
+
|
266
|
+
This can be handy if you want to enable polling for a specific URL.
|
267
|
+
|
268
|
+
NOTE: By passing interval to `render_async`, initial container element
|
269
|
+
will remain in HTML tree, it will not be replaced with request response.
|
270
|
+
You can handle how that container element is rendered and its style by
|
271
|
+
[passing in an HTML element name](#passing-in-an-html-element-name) and
|
272
|
+
[HTML element class](#passing-in-a-container-class-name).
|
273
|
+
|
236
274
|
### Handling errors
|
237
275
|
|
238
276
|
`render_async` let's you handle errors by allowing you to pass in `error_message`
|
@@ -18,6 +18,8 @@
|
|
18
18
|
headers: headers,
|
19
19
|
error_message: error_message,
|
20
20
|
error_event_name: error_event_name,
|
21
|
+
retry_count: retry_count,
|
22
|
+
interval: interval,
|
21
23
|
turbolinks: RenderAsync.configuration.turbolinks } %>
|
22
24
|
<% else %>
|
23
25
|
<%= render partial: 'render_async/request_vanilla',
|
@@ -30,6 +32,8 @@
|
|
30
32
|
headers: headers,
|
31
33
|
error_message: error_message,
|
32
34
|
error_event_name: error_event_name,
|
35
|
+
retry_count: retry_count,
|
36
|
+
interval: interval,
|
33
37
|
turbolinks: RenderAsync.configuration.turbolinks } %>
|
34
38
|
<% end %>
|
35
39
|
<% end %>
|
@@ -6,7 +6,7 @@ if (window.jQuery) {
|
|
6
6
|
}
|
7
7
|
<% end %>
|
8
8
|
|
9
|
-
var _listener = function() {
|
9
|
+
var _listener = function(currentRetryCount) {
|
10
10
|
var headers = <%= headers.to_json.html_safe %>;
|
11
11
|
var csrfTokenElement = document.querySelector('meta[name="csrf-token"]')
|
12
12
|
if (csrfTokenElement)
|
@@ -18,7 +18,12 @@ if (window.jQuery) {
|
|
18
18
|
data: "<%= escape_javascript(data.to_s.html_safe) %>",
|
19
19
|
headers: headers
|
20
20
|
}).done(function(response) {
|
21
|
-
|
21
|
+
<% if interval %>
|
22
|
+
$("#<%= container_id %>").empty();
|
23
|
+
$("#<%= container_id %>").append(response);
|
24
|
+
<% else %>
|
25
|
+
$("#<%= container_id %>").replaceWith(response);
|
26
|
+
<% end %>
|
22
27
|
|
23
28
|
<% if event_name.present? %>
|
24
29
|
var event = undefined;
|
@@ -31,6 +36,13 @@ if (window.jQuery) {
|
|
31
36
|
document.dispatchEvent(event);
|
32
37
|
<% end %>
|
33
38
|
}).fail(function(response) {
|
39
|
+
var skipErrorMessage = false;
|
40
|
+
<% if retry_count > 0 %>
|
41
|
+
skipErrorMessage = retry(currentRetryCount)
|
42
|
+
<% end %>
|
43
|
+
|
44
|
+
if (skipErrorMessage) return;
|
45
|
+
|
34
46
|
$("#<%= container_id %>").replaceWith('<%= error_message.try(:html_safe) %>');
|
35
47
|
|
36
48
|
<% if error_event_name.present? %>
|
@@ -46,8 +58,29 @@ if (window.jQuery) {
|
|
46
58
|
});
|
47
59
|
};
|
48
60
|
|
61
|
+
<% if retry_count > 0 %>
|
62
|
+
var retry = function(currentRetryCount) {
|
63
|
+
if (typeof(currentRetryCount) === 'number') {
|
64
|
+
if (currentRetryCount >= <%= retry_count %>)
|
65
|
+
return false;
|
66
|
+
|
67
|
+
_listener(currentRetryCount + 1);
|
68
|
+
return true;
|
69
|
+
}
|
70
|
+
|
71
|
+
_listener(1);
|
72
|
+
return true;
|
73
|
+
}
|
74
|
+
<% end %>
|
75
|
+
|
49
76
|
<% if turbolinks %>
|
50
77
|
$(document).one('turbolinks:load', _listener);
|
78
|
+
<% elsif interval %>
|
79
|
+
var _intervalFunction = function() {
|
80
|
+
_listener();
|
81
|
+
setInterval(_listener, <%= interval %>);
|
82
|
+
}
|
83
|
+
$(document).ready(_intervalFunction);
|
51
84
|
<% else %>
|
52
85
|
$(document).ready(_listener);
|
53
86
|
<% end %>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
}
|
6
6
|
<% end %>
|
7
7
|
|
8
|
-
var _listener = function() {
|
8
|
+
var _listener = function(currentRetryCount) {
|
9
9
|
var request = new XMLHttpRequest();
|
10
10
|
var asyncRequest = true;
|
11
11
|
var SUCCESS = 200;
|
@@ -26,7 +26,11 @@
|
|
26
26
|
if (request.readyState === 4) {
|
27
27
|
if (request.status >= SUCCESS && request.status < ERROR) {
|
28
28
|
var container = document.getElementById('<%= container_id %>');
|
29
|
+
<% if interval %>
|
30
|
+
container.innerHTML = request.response;
|
31
|
+
<% else %>
|
29
32
|
container.outerHTML = request.response;
|
33
|
+
<% end %>
|
30
34
|
|
31
35
|
<% if event_name.present? %>
|
32
36
|
var event = undefined;
|
@@ -39,6 +43,13 @@
|
|
39
43
|
document.dispatchEvent(event);
|
40
44
|
<% end %>
|
41
45
|
} else {
|
46
|
+
var skipErrorMessage = false;
|
47
|
+
<% if retry_count > 0 %>
|
48
|
+
skipErrorMessage = retry(currentRetryCount)
|
49
|
+
<% end %>
|
50
|
+
|
51
|
+
if (skipErrorMessage) return;
|
52
|
+
|
42
53
|
var container = document.getElementById('<%= container_id %>');
|
43
54
|
container.outerHTML = '<%= error_message.try(:html_safe) %>';
|
44
55
|
|
@@ -60,11 +71,32 @@
|
|
60
71
|
request.send(body);
|
61
72
|
};
|
62
73
|
|
74
|
+
<% if retry_count > 0 %>
|
75
|
+
var retry = function(currentRetryCount) {
|
76
|
+
if (typeof(currentRetryCount) === 'number') {
|
77
|
+
if (currentRetryCount >= <%= retry_count %>)
|
78
|
+
return false;
|
79
|
+
|
80
|
+
_listener(currentRetryCount + 1);
|
81
|
+
return true;
|
82
|
+
}
|
83
|
+
|
84
|
+
_listener(1);
|
85
|
+
return true;
|
86
|
+
}
|
87
|
+
<% end %>
|
88
|
+
|
63
89
|
<% if turbolinks %>
|
64
90
|
document.addEventListener("turbolinks:load", function (e) {
|
65
91
|
e.target.removeEventListener(e.type, arguments.callee);
|
66
92
|
_listener.call(this);
|
67
93
|
});
|
94
|
+
<% elsif interval %>
|
95
|
+
var _intervalFunction = function() {
|
96
|
+
_listener();
|
97
|
+
setInterval(_listener, <%= interval %>);
|
98
|
+
}
|
99
|
+
document.addEventListener("DOMContentLoaded", _intervalFunction);
|
68
100
|
<% else %>
|
69
101
|
document.addEventListener("DOMContentLoaded", _listener);
|
70
102
|
<% end %>
|
data/lib/render_async/version.rb
CHANGED
@@ -28,6 +28,8 @@ module RenderAsync
|
|
28
28
|
headers = options.delete(:headers) || {}
|
29
29
|
error_message = options.delete(:error_message)
|
30
30
|
error_event_name = options.delete(:error_event_name)
|
31
|
+
retry_count = options.delete(:retry_count) || 0
|
32
|
+
interval = options.delete(:interval)
|
31
33
|
|
32
34
|
render 'render_async/render_async', html_element_name: html_element_name,
|
33
35
|
container_id: container_id,
|
@@ -40,7 +42,9 @@ module RenderAsync
|
|
40
42
|
data: data,
|
41
43
|
headers: headers,
|
42
44
|
error_message: error_message,
|
43
|
-
error_event_name: error_event_name
|
45
|
+
error_event_name: error_event_name,
|
46
|
+
retry_count: retry_count,
|
47
|
+
interval: interval
|
44
48
|
end
|
45
49
|
|
46
50
|
private
|
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.0
|
4
|
+
version: 2.1.0
|
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: 2019-
|
12
|
+
date: 2019-05-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|