render_async 2.1.3 → 2.1.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,38 +5,31 @@
5
5
  <%= placeholder %>
6
6
  </<%= html_element_name %>>
7
7
 
8
- <% content_for :render_async do %>
8
+ <% content_for content_for_name do %>
9
9
  <%= javascript_tag html_options do %>
10
+ <% locals = { container_id: container_id,
11
+ replace_container: replace_container,
12
+ path: path,
13
+ method: method,
14
+ data: data,
15
+ event_name: event_name,
16
+ toggle: toggle,
17
+ headers: headers,
18
+ error_message: error_message,
19
+ error_event_name: error_event_name,
20
+ retry_count: retry_count,
21
+ retry_delay: retry_delay,
22
+ interval: interval,
23
+ turbolinks: RenderAsync.configuration.turbolinks } %>
24
+
10
25
  <% if RenderAsync.configuration.jquery %>
11
26
  <%= render partial: 'render_async/request_jquery',
12
27
  formats: [:js],
13
- locals: { container_id: container_id,
14
- path: path,
15
- method: method,
16
- data: data,
17
- event_name: event_name,
18
- toggle: toggle,
19
- headers: headers,
20
- error_message: error_message,
21
- error_event_name: error_event_name,
22
- retry_count: retry_count,
23
- interval: interval,
24
- turbolinks: RenderAsync.configuration.turbolinks } %>
28
+ locals: locals %>
25
29
  <% else %>
26
30
  <%= render partial: 'render_async/request_vanilla',
27
31
  formats: [:js],
28
- locals: { container_id: container_id,
29
- path: path,
30
- method: method,
31
- data: data,
32
- event_name: event_name,
33
- toggle: toggle,
34
- headers: headers,
35
- error_message: error_message,
36
- error_event_name: error_event_name,
37
- retry_count: retry_count,
38
- interval: interval,
39
- turbolinks: RenderAsync.configuration.turbolinks } %>
32
+ locals: locals %>
40
33
  <% end %>
41
34
  <% end %>
42
35
  <% end %>
@@ -5,8 +5,32 @@ if (window.jQuery) {
5
5
  return;
6
6
  }
7
7
  <% end %>
8
+ function createEvent(name, container) {
9
+ var event = undefined;
10
+ if (typeof(Event) === 'function') {
11
+ event = new Event(name);
12
+ } else {
13
+ event = document.createEvent('Event');
14
+ event.initEvent(name, true, true);
15
+ }
16
+ event.container = container
17
+ return event;
18
+ }
8
19
 
9
- var _makeRequest = function(currentRetryCount) {
20
+ function _runAfterDocumentLoaded(callback) {
21
+ if (document.readyState === 'complete' || document.readyState === 'interactive') {
22
+ // Handle a case where nested partials get loaded after the document loads
23
+ callback();
24
+ } else {
25
+ <% if turbolinks %>
26
+ $(document).one('turbolinks:load', callback);
27
+ <% else %>
28
+ $(document).ready(callback);
29
+ <% end %>
30
+ }
31
+ }
32
+
33
+ function _makeRequest(currentRetryCount) {
10
34
  var headers = <%= headers.to_json.html_safe %>;
11
35
  var csrfTokenElement = document.querySelector('meta[name="csrf-token"]')
12
36
  if (csrfTokenElement)
@@ -18,21 +42,19 @@ if (window.jQuery) {
18
42
  data: "<%= escape_javascript(data.to_s.html_safe) %>",
19
43
  headers: headers
20
44
  }).done(function(response) {
21
- <% if interval %>
22
- $("#<%= container_id %>").empty();
23
- $("#<%= container_id %>").append(response);
45
+ var container = $("#<%= container_id %>");
46
+ <% if !interval && replace_container %>
47
+ container.replaceWith(response);
24
48
  <% else %>
25
- $("#<%= container_id %>").replaceWith(response);
49
+ container.empty();
50
+ container.append(response);
26
51
  <% end %>
27
52
 
53
+ var loadEvent = createEvent('render_async_load', container);
54
+ document.dispatchEvent(loadEvent);
55
+
28
56
  <% if event_name.present? %>
29
- var event = undefined;
30
- if (typeof(Event) === 'function') {
31
- event = new Event("<%= event_name %>");
32
- } else {
33
- event = document.createEvent('Event');
34
- event.initEvent('<%= event_name %>', true, true);
35
- }
57
+ var event = createEvent("<%= event_name %>", container)
36
58
  document.dispatchEvent(event);
37
59
  <% end %>
38
60
  }).fail(function(response) {
@@ -43,64 +65,111 @@ if (window.jQuery) {
43
65
 
44
66
  if (skipErrorMessage) return;
45
67
 
46
- $("#<%= container_id %>").replaceWith("<%= error_message.try(:html_safe) %>");
68
+ var container = $("#<%= container_id %>");
69
+ container.replaceWith("<%= error_message.try(:html_safe) %>");
47
70
 
48
- <% if error_event_name.present? %>
49
- var event = undefined;
50
- if (typeof(Event) === 'function') {
51
- event = new Event("<%= error_event_name %>");
52
- } else {
53
- event = document.createEvent('Event');
54
- event.initEvent('<%= error_event_name %>', true, true);
55
- }
56
- document.dispatchEvent(event);
57
- <% end %>
71
+ var errorEvent = createEvent(
72
+ "<%= error_event_name || 'render_async_error' %>",
73
+ container
74
+ )
75
+ errorEvent.retryCount = currentRetryCount
76
+
77
+ document.dispatchEvent(errorEvent);
58
78
  });
59
79
  };
60
80
 
61
81
  <% if retry_count > 0 %>
62
- var retry = function(currentRetryCount) {
82
+ var _retryMakeRequest = _makeRequest
83
+
84
+ <% if retry_delay %>
85
+ _retryMakeRequest = function(currentRetryCount) {
86
+ setTimeout(function() {
87
+ _makeRequest(currentRetryCount)
88
+ }, <%= retry_delay %>)
89
+ }
90
+ <% end %>
91
+
92
+ function retry(currentRetryCount) {
63
93
  if (typeof(currentRetryCount) === 'number') {
64
94
  if (currentRetryCount >= <%= retry_count %>)
65
95
  return false;
66
96
 
67
- _makeRequest(currentRetryCount + 1);
97
+ _retryMakeRequest(currentRetryCount + 1);
68
98
  return true;
69
99
  }
70
100
 
71
- _makeRequest(1);
101
+ _retryMakeRequest(1);
72
102
  return true;
73
103
  }
74
104
  <% end %>
75
105
 
76
106
  var _renderAsyncFunction = _makeRequest;
77
107
 
78
- <% if interval %>
79
108
  var _interval;
109
+ <% if interval %>
80
110
  var _renderAsyncFunction = function() {
111
+ // If interval is already set, return
112
+ if (typeof(_interval) === 'number') return
113
+
81
114
  _makeRequest();
82
115
  _interval = setInterval(_makeRequest, <%= interval %>);
83
116
  }
84
- <% end %>
85
117
 
86
- <% if toggle %>
87
- $(document).on('<%= toggle[:event] || 'click' %>', '<%= toggle[:selector] %>', function(event) {
88
- event.preventDefault();
89
- if (typeof _interval === 'number') {
90
- clearInterval(_interval);
118
+ var _clearRenderAsyncInterval = function() {
119
+ if (typeof(_interval) === 'number'){
120
+ clearInterval(_interval)
91
121
  _interval = undefined;
92
- } else {
93
- _renderAsyncFunction();
94
122
  }
95
- });
123
+ }
124
+
125
+ function _setUpControlEvents() {
126
+ var container = $("#<%= container_id %>");
127
+
128
+ // Register a stop polling event on the container
129
+ $(container).on('async-stop', _clearRenderAsyncInterval)
130
+
131
+ // Register a start polling event on the container
132
+ $(container).on('async-start', _renderAsyncFunction)
133
+ }
134
+
135
+ _runAfterDocumentLoaded(_setUpControlEvents)
136
+
137
+ <% if turbolinks %>
138
+ $(document).one('turbolinks:visit', _clearRenderAsyncInterval);
139
+ <% end %>
96
140
  <% end %>
97
141
 
98
- <% if turbolinks && !toggle %>
99
- $(document).one('turbolinks:load', _renderAsyncFunction);
142
+ <% if !replace_container %>
143
+ function _setUpRefreshEvent() {
144
+ var container = $("#<%= container_id %>");
145
+
146
+ $(container).on('refresh', _renderAsyncFunction)
147
+ }
148
+
149
+ _runAfterDocumentLoaded(_setUpRefreshEvent)
150
+ <% end %>
151
+
152
+ <% if toggle %>
153
+ function _setUpToggle() {
154
+ $(document).<%= toggle[:once] ? 'one' : 'on' %>('<%= toggle[:event] || 'click' %>', '<%= toggle[:selector] %>', function(event) {
155
+ if (typeof(_interval) === 'number') {
156
+ clearInterval(_interval);
157
+ _interval = undefined;
158
+ } else {
159
+ _renderAsyncFunction();
160
+ }
161
+ });
162
+
163
+ <% if toggle[:start] %>
164
+ _renderAsyncFunction()
165
+ <% end %>
166
+ }
167
+
168
+ _runAfterDocumentLoaded(_setUpToggle);
100
169
  <% elsif !toggle %>
101
- $(document).ready(_renderAsyncFunction);
170
+ _runAfterDocumentLoaded(_renderAsyncFunction)
102
171
  <% end %>
103
172
  }(jQuery));
104
173
  } else {
105
- console.warn("Looks like you've enabled jQuery for render_async, but jQuery is not defined");
174
+ console.warn("Looks like you've enabled jQuery for render_async, but jQuery is not defined on the window object");
106
175
  };
@@ -4,8 +4,30 @@
4
4
  return;
5
5
  }
6
6
  <% end %>
7
+ function createEvent(name, container) {
8
+ var event = undefined;
9
+ if (typeof(Event) === 'function') {
10
+ event = new Event(name);
11
+ } else {
12
+ event = document.createEvent('Event');
13
+ event.initEvent(name, true, true);
14
+ }
15
+ event.container = container
16
+ return event;
17
+ }
18
+
19
+ function _runAfterDocumentLoaded(callback) {
20
+ <% if turbolinks %>
21
+ document.addEventListener("turbolinks:load", function(e) {
22
+ e.target.removeEventListener(e.type, arguments.callee);
23
+ callback();
24
+ });
25
+ <% else %>
26
+ document.addEventListener("DOMContentLoaded", callback);
27
+ <% end %>
28
+ }
7
29
 
8
- var _makeRequest = function(currentRetryCount) {
30
+ function _makeRequest(currentRetryCount) {
9
31
  var request = new XMLHttpRequest();
10
32
  var asyncRequest = true;
11
33
  var SUCCESS = 200;
@@ -22,24 +44,23 @@
22
44
  request.setRequestHeader(key, headers[key]);
23
45
  });
24
46
 
47
+ request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
48
+
25
49
  request.onreadystatechange = function() {
26
50
  if (request.readyState === 4) {
27
51
  if (request.status >= SUCCESS && request.status < ERROR) {
28
52
  var container = document.getElementById('<%= container_id %>');
29
- <% if interval %>
30
- container.innerHTML = request.response;
31
- <% else %>
53
+ <% if !interval && replace_container %>
32
54
  container.outerHTML = request.response;
55
+ <% else %>
56
+ container.innerHTML = request.response;
33
57
  <% end %>
34
58
 
59
+ var loadEvent = createEvent('render_async_load', container);
60
+ document.dispatchEvent(loadEvent);
61
+
35
62
  <% if event_name.present? %>
36
- var event = undefined;
37
- if (typeof(Event) === 'function') {
38
- event = new Event("<%= event_name %>");
39
- } else {
40
- event = document.createEvent('Event');
41
- event.initEvent('<%= event_name %>', true, true);
42
- }
63
+ var event = createEvent('<%= event_name %>', container);
43
64
  document.dispatchEvent(event);
44
65
  <% end %>
45
66
  } else {
@@ -51,18 +72,15 @@
51
72
  if (skipErrorMessage) return;
52
73
 
53
74
  var container = document.getElementById('<%= container_id %>');
54
- container.outerHTML = "<%= error_message.try(:html_safe) %>";
55
-
56
- <% if error_event_name.present? %>
57
- var event = undefined;
58
- if (typeof(Event) === 'function') {
59
- event = new Event("<%= error_event_name %>");
60
- } else {
61
- event = document.createEvent('Event');
62
- event.initEvent('<%= error_event_name %>', true, true);
63
- }
64
- document.dispatchEvent(event);
65
- <% end %>
75
+ container.outerHTML = '<%= error_message.try(:html_safe) %>';
76
+
77
+ var errorEvent = createEvent(
78
+ "<%= error_event_name || 'render_async_error' %>",
79
+ container
80
+ );
81
+ errorEvent.retryCount = currentRetryCount
82
+
83
+ document.dispatchEvent(errorEvent);
66
84
  }
67
85
  }
68
86
  };
@@ -72,52 +90,101 @@
72
90
  };
73
91
 
74
92
  <% if retry_count > 0 %>
75
- var retry = function(currentRetryCount) {
93
+
94
+ <% if retry_delay %>
95
+ _retryMakeRequest = function(currentRetryCount) {
96
+ setTimeout(function() {
97
+ _makeRequest(currentRetryCount)
98
+ }, <%= retry_delay %>)
99
+ }
100
+ <% end %>
101
+
102
+ function retry(currentRetryCount) {
76
103
  if (typeof(currentRetryCount) === 'number') {
77
104
  if (currentRetryCount >= <%= retry_count %>)
78
105
  return false;
79
106
 
80
- _makeRequest(currentRetryCount + 1);
107
+ _retryMakeRequest(currentRetryCount + 1);
81
108
  return true;
82
109
  }
83
110
 
84
- _makeRequest(1);
111
+ _retryMakeRequest(1);
85
112
  return true;
86
113
  }
87
114
  <% end %>
88
115
 
89
116
  var _renderAsyncFunction = _makeRequest;
90
117
 
91
- <% if interval %>
92
118
  var _interval;
119
+ <% if interval %>
93
120
  var _renderAsyncFunction = function() {
121
+ // If interval is already set, return
122
+ if (typeof(_interval) === 'number') return
123
+
94
124
  _makeRequest();
95
125
  _interval = setInterval(_makeRequest, <%= interval %>);
96
126
  }
127
+
128
+ var _clearRenderAsyncInterval = function() {
129
+ if (typeof(_interval) === 'number'){
130
+ clearInterval(_interval)
131
+ _interval = undefined;
132
+ }
133
+ }
134
+
135
+ function _setUpControlEvents() {
136
+ var container = document.getElementById('<%= container_id %>');
137
+
138
+ // Register a polling stop event on the container
139
+ container.addEventListener("async-stop", _clearRenderAsyncInterval)
140
+
141
+ // Register a start polling event on the container
142
+ container.addEventListener("async-start", _renderAsyncFunction)
143
+ }
144
+
145
+ _runAfterDocumentLoaded(_setUpControlEvents)
146
+
147
+ <% if turbolinks %>
148
+ document.addEventListener("turbolinks:visit", _clearRenderAsyncInterval)
149
+ <% end %>
97
150
  <% end %>
98
151
 
99
- <% if toggle %>
100
- var selectors = document.querySelectorAll('<%= toggle[:selector] %>');
152
+ <% if !replace_container %>
153
+ function _setUpRefreshEvent() {
154
+ var container = document.getElementById('<%= container_id %>');
101
155
 
102
- [...selectors].forEach(function(selector) {
103
- selector.addEventListener('<%= toggle[:event] || 'click' %>', function(event) {
104
- event.preventDefault();
105
- if (typeof _interval === 'number') {
156
+ container.addEventListener('refresh', _renderAsyncFunction)
157
+ }
158
+
159
+ _runAfterDocumentLoaded(_setUpRefreshEvent)
160
+ <% end %>
161
+
162
+ <% if toggle %>
163
+ function _setUpToggle() {
164
+ var selectors = document.querySelectorAll('<%= toggle[:selector] %>');
165
+ var handler = function(event) {
166
+ if (typeof(_interval) === 'number') {
106
167
  clearInterval(_interval);
107
168
  _interval = undefined;
108
169
  } else {
109
170
  _renderAsyncFunction();
110
171
  }
111
- })
112
- });
113
- <% end %>
172
+ <% if toggle[:once] %>
173
+ this.removeEventListener(event.type, handler);
174
+ <% end %>
175
+ };
176
+
177
+ <% if toggle[:start] %>
178
+ _renderAsyncFunction()
179
+ <% end %>
180
+
181
+ for (var i = 0; i < selectors.length; ++i) {
182
+ selectors[i].addEventListener('<%= toggle[:event] || 'click' %>', handler)
183
+ }
184
+ }
114
185
 
115
- <% if turbolinks && !toggle %>
116
- document.addEventListener("turbolinks:load", function (e) {
117
- e.target.removeEventListener(e.type, arguments.callee);
118
- _renderAsyncFunction();
119
- });
186
+ _runAfterDocumentLoaded(_setUpToggle);
120
187
  <% elsif !toggle %>
121
- document.addEventListener("DOMContentLoaded", _renderAsyncFunction);
188
+ _runAfterDocumentLoaded(_renderAsyncFunction);
122
189
  <% end %>
123
190
  })();