rails_email_preview 2.1.0 → 2.2.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 +1 -1
- data/app/assets/stylesheets/rails_email_preview/_bootstrap3.sass +1 -0
- data/app/assets/stylesheets/rails_email_preview/_default.sass +1 -0
- data/app/assets/stylesheets/rails_email_preview/_iframe.scss +15 -0
- data/app/views/integrations/cms/_customize_cms_for_rails_email_preview.html.erb +4 -2
- data/app/views/layouts/rails_email_preview/application.html.erb +5 -2
- data/app/views/layouts/rails_email_preview/email.html.erb +3 -1
- data/app/views/rails_email_preview/emails/_email_iframe.html.erb +5 -81
- data/app/views/rails_email_preview/emails/email_iframe.js +77 -0
- data/lib/rails_email_preview.rb +6 -0
- data/lib/rails_email_preview/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4b2792359dab619a4a3d002e0e988589d22f608e4fe03e91781203179ed8bce
|
4
|
+
data.tar.gz: b95c10950a144e7974fc80c38707aa1b257f4683dd1c45732d7e43c8c63ef9f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8427304dba19af417e56d27a538e11e7fc91e6e0f03f2edd26ce3efe5c44109d2067512e0faa7715cf4adbae7f19e8d2e6a8ccbbf5242204f7c0cf3a601af44f
|
7
|
+
data.tar.gz: 7a2b96a6aa5010ff8b24aec87f6cdf54cc69eaa0cf4324ecd123b3157fd42ca3ea296a025383cd82b77876159618d738ce7786a241726d131061daac2398f003
|
data/README.md
CHANGED
@@ -17,7 +17,7 @@ REP comes with two themes: a simple standalone theme, and a theme that uses [Boo
|
|
17
17
|
Add [![Gem Version][gem-badge]][gem] to Gemfile:
|
18
18
|
|
19
19
|
```ruby
|
20
|
-
gem 'rails_email_preview', '~> 2.
|
20
|
+
gem 'rails_email_preview', '~> 2.2.0'
|
21
21
|
```
|
22
22
|
|
23
23
|
Add an initializer and the routes:
|
@@ -14,8 +14,10 @@
|
|
14
14
|
data-view-link-label="<%= t '.view_link' %>"
|
15
15
|
data-edit-email-label="<%= t '.edit_email'%>"></div>
|
16
16
|
<% if adapter.cms_v2_plus? %>
|
17
|
-
|
17
|
+
<%= javascript_tag render(file: 'integrations/cms/comfy_v2_integration.js'),
|
18
|
+
**({nonce: true} if RailsEmailPreview.rails_supports_csp_nonce?) %>
|
18
19
|
<% else # CMS v1 %>
|
19
|
-
|
20
|
+
<%= javascript_tag render(file: 'integrations/cms/comfy_v1_integration.js'),
|
21
|
+
**({nonce: true} if RailsEmailPreview.rails_supports_csp_nonce?) %>
|
20
22
|
<% end %>
|
21
23
|
<% end %>
|
@@ -2,8 +2,11 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title><%= t('.head_title') %></title>
|
5
|
-
<%= stylesheet_link_tag 'rails_email_preview/application' %>
|
6
|
-
<%=
|
5
|
+
<%= stylesheet_link_tag 'rails_email_preview/application', 'data-turbolinks-track': 'reload' %>
|
6
|
+
<%= csrf_meta_tag %>
|
7
|
+
<%= csp_meta_tag if RailsEmailPreview.rails_supports_csp_nonce? %>
|
8
|
+
<%= javascript_include_tag 'rails_email_preview/application',
|
9
|
+
'data-turbolinks-track': 'reload' %>
|
7
10
|
<%= favicon_link_tag 'rails_email_preview/favicon.png' %>
|
8
11
|
<%= yield(:head) %>
|
9
12
|
</head>
|
@@ -21,7 +21,9 @@
|
|
21
21
|
background-color: white;
|
22
22
|
}
|
23
23
|
</style>
|
24
|
-
|
24
|
+
<%= javascript_tag **({nonce: true} if RailsEmailPreview.rails_supports_csp_nonce?) do %>
|
25
|
+
document.addEventListener('DOMContentLoaded', window.parent.rep.iframeOnDOMContentLoaded, true);
|
26
|
+
<% end %>
|
25
27
|
</head>
|
26
28
|
<body>
|
27
29
|
<div id="content" class="container">
|
@@ -1,88 +1,12 @@
|
|
1
|
-
<
|
2
|
-
(function (doc) {
|
3
|
-
var rep = window['rep'] || (window['rep'] = { resizeAttached: false });
|
4
|
-
rep.loaded = false;
|
5
|
-
|
6
|
-
function findIframe() {
|
7
|
-
return doc.getElementById('src-iframe');
|
8
|
-
}
|
9
|
-
|
10
|
-
function resizeIframe() {
|
11
|
-
var el = findIframe();
|
12
|
-
if (!el) {
|
13
|
-
rep.loaded = false;
|
14
|
-
return;
|
15
|
-
}
|
16
|
-
var iframeBody = el.contentWindow.document.body;
|
17
|
-
if (iframeBody) {
|
18
|
-
el.style.height = (getBodyHeight(iframeBody)) + "px";
|
19
|
-
}
|
20
|
-
}
|
21
|
-
|
22
|
-
function getBodyHeight(body) {
|
23
|
-
var boundingRect = body.getBoundingClientRect();
|
24
|
-
var style = body.ownerDocument.defaultView.getComputedStyle(body);
|
25
|
-
var marginY = parseInt(style['margin-bottom'], 10) +
|
26
|
-
parseInt(style['margin-top'], 10);
|
27
|
-
// There may be a horizontal scrollbar adding to the height.
|
28
|
-
var scrollbarHeight = 17;
|
29
|
-
return scrollbarHeight + marginY + Math.max(
|
30
|
-
body.scrollHeight, body.offsetHeight, body.clientHeight,
|
31
|
-
boundingRect.height + boundingRect.top) +
|
32
|
-
// no idea why these 4px are needed:
|
33
|
-
4;
|
34
|
-
}
|
35
|
-
|
36
|
-
function fetchHeaders() {
|
37
|
-
var headersView = doc.getElementById('email-headers'),
|
38
|
-
xhr = new XMLHttpRequest();
|
39
|
-
xhr.open('GET', headersView.getAttribute('data-url'), true);
|
40
|
-
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
41
|
-
xhr.send(null);
|
42
|
-
xhr.onreadystatechange = function () {
|
43
|
-
if (xhr.readyState === 4) {
|
44
|
-
headersView.innerHTML = xhr.responseText;
|
45
|
-
}
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
|
-
// Called from the iframe via window.parent
|
50
|
-
rep.iframeOnDOMContentLoaded = function () {
|
51
|
-
rep.loaded = true;
|
52
|
-
resizeIframe();
|
53
|
-
// CMS refresh headers hook
|
54
|
-
if (rep.fetchHeadersOnNextLoad) {
|
55
|
-
rep.fetchHeadersOnNextLoad = false;
|
56
|
-
fetchHeaders();
|
57
|
-
}
|
58
|
-
};
|
59
|
-
|
60
|
-
// This is only called back once the iframe has finished loading everything, including images
|
61
|
-
rep.iframeOnLoad = resizeIframe;
|
62
|
-
|
63
|
-
// Resize on window resize
|
64
|
-
if (!rep.resizeAttached) {
|
65
|
-
window.addEventListener('resize', function () {
|
66
|
-
if (rep.loaded) resizeIframe();
|
67
|
-
}, true);
|
68
|
-
rep.resizeAttached = true
|
69
|
-
}
|
70
|
-
|
71
|
-
// Only show progress bar after some time to avoid flashing
|
72
|
-
setTimeout(function () {
|
73
|
-
doc.getElementById('email-progress-bar').style.display = 'block';
|
74
|
-
}, 350);
|
75
|
-
})(document);
|
76
|
-
</script>
|
77
|
-
|
78
|
-
<div style="min-height: 450px; position: relative">
|
1
|
+
<div id="rep-src-iframe-container">
|
79
2
|
<div id="email-progress-bar" class="progress"
|
80
3
|
style="display: none; position: absolute; z-index: -1; width: 100%; text-align: center">
|
81
|
-
<div class="progress-bar progress-bar-striped active"
|
4
|
+
<div class="progress-bar progress-bar-striped active">
|
82
5
|
<%= t 'rep.base.loading' %>
|
83
6
|
</div>
|
84
7
|
</div>
|
85
8
|
|
86
|
-
<iframe id="src-iframe" srcdoc="<%= @mail_body_html.to_str %>" seamless="seamless"
|
87
|
-
|
9
|
+
<iframe id="rep-src-iframe" srcdoc="<%= @mail_body_html.to_str %>" seamless="seamless"></iframe>
|
10
|
+
<%= javascript_tag render(file: 'rails_email_preview/emails/email_iframe.js'),
|
11
|
+
**({nonce: true} if RailsEmailPreview.rails_supports_csp_nonce?) %>
|
88
12
|
</div>
|
@@ -0,0 +1,77 @@
|
|
1
|
+
(function (doc) {
|
2
|
+
var rep = window['rep'] || (window['rep'] = { resizeAttached: false });
|
3
|
+
rep.loaded = false;
|
4
|
+
|
5
|
+
function findIframe() {
|
6
|
+
return doc.getElementById('rep-src-iframe');
|
7
|
+
}
|
8
|
+
|
9
|
+
function resizeIframe() {
|
10
|
+
var el = findIframe();
|
11
|
+
if (!el) {
|
12
|
+
rep.loaded = false;
|
13
|
+
return;
|
14
|
+
}
|
15
|
+
var iframeBody = el.contentWindow.document.body;
|
16
|
+
if (iframeBody) {
|
17
|
+
el.style.height = (getBodyHeight(iframeBody)) + "px";
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
function getBodyHeight(body) {
|
22
|
+
var boundingRect = body.getBoundingClientRect();
|
23
|
+
var style = body.ownerDocument.defaultView.getComputedStyle(body);
|
24
|
+
var marginY = parseInt(style['margin-bottom'], 10) +
|
25
|
+
parseInt(style['margin-top'], 10);
|
26
|
+
// There may be a horizontal scrollbar adding to the height.
|
27
|
+
var scrollbarHeight = 17;
|
28
|
+
return scrollbarHeight + marginY + Math.max(
|
29
|
+
body.scrollHeight, body.offsetHeight, body.clientHeight,
|
30
|
+
boundingRect.height + boundingRect.top) +
|
31
|
+
// no idea why these 4px are needed:
|
32
|
+
4;
|
33
|
+
}
|
34
|
+
|
35
|
+
function fetchHeaders() {
|
36
|
+
var headersView = doc.getElementById('email-headers'),
|
37
|
+
xhr = new XMLHttpRequest();
|
38
|
+
xhr.open('GET', headersView.getAttribute('data-url'), true);
|
39
|
+
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
40
|
+
xhr.send(null);
|
41
|
+
xhr.onreadystatechange = function () {
|
42
|
+
if (xhr.readyState === 4) {
|
43
|
+
headersView.innerHTML = xhr.responseText;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
// Called from the iframe via window.parent
|
49
|
+
rep.iframeOnDOMContentLoaded = function () {
|
50
|
+
rep.loaded = true;
|
51
|
+
resizeIframe();
|
52
|
+
// CMS refresh headers hook
|
53
|
+
if (rep.fetchHeadersOnNextLoad) {
|
54
|
+
rep.fetchHeadersOnNextLoad = false;
|
55
|
+
fetchHeaders();
|
56
|
+
}
|
57
|
+
};
|
58
|
+
|
59
|
+
// This is only called back once the iframe has finished loading everything, including images
|
60
|
+
rep.iframeOnLoad = resizeIframe;
|
61
|
+
|
62
|
+
// Resize on window resize
|
63
|
+
if (!rep.resizeAttached) {
|
64
|
+
window.addEventListener('resize', function () {
|
65
|
+
if (rep.loaded) resizeIframe();
|
66
|
+
}, true);
|
67
|
+
rep.resizeAttached = true
|
68
|
+
}
|
69
|
+
|
70
|
+
// Only show progress bar after some time to avoid flashing
|
71
|
+
setTimeout(function () {
|
72
|
+
doc.getElementById('email-progress-bar').style.display = 'block';
|
73
|
+
}, 350);
|
74
|
+
|
75
|
+
findIframe().addEventListener('load', resizeIframe);
|
76
|
+
resizeIframe();
|
77
|
+
})(document);
|
data/lib/rails_email_preview.rb
CHANGED
@@ -85,6 +85,12 @@ module RailsEmailPreview
|
|
85
85
|
def setup
|
86
86
|
yield self
|
87
87
|
end
|
88
|
+
|
89
|
+
# @api private
|
90
|
+
def rails_supports_csp_nonce?
|
91
|
+
@rails_supports_csp_nonce = (Rails.gem_version >= Gem::Version.new('5.2.0')) if @rails_supports_csp_nonce.nil?
|
92
|
+
@rails_supports_csp_nonce
|
93
|
+
end
|
88
94
|
end
|
89
95
|
|
90
96
|
# = Editing settings
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_email_preview
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gleb Mazovetskiy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -150,6 +150,7 @@ files:
|
|
150
150
|
- app/assets/javascripts/rails_email_preview/application.js
|
151
151
|
- app/assets/stylesheets/rails_email_preview/_bootstrap3.sass
|
152
152
|
- app/assets/stylesheets/rails_email_preview/_default.sass
|
153
|
+
- app/assets/stylesheets/rails_email_preview/_iframe.scss
|
153
154
|
- app/assets/stylesheets/rails_email_preview/application.scss
|
154
155
|
- app/controllers/rails_email_preview/application_controller.rb
|
155
156
|
- app/controllers/rails_email_preview/emails_controller.rb
|
@@ -169,6 +170,7 @@ files:
|
|
169
170
|
- app/views/rails_email_preview/emails/_i18n_nav.html.erb
|
170
171
|
- app/views/rails_email_preview/emails/_nav.html.erb
|
171
172
|
- app/views/rails_email_preview/emails/_send_form.html.erb
|
173
|
+
- app/views/rails_email_preview/emails/email_iframe.js
|
172
174
|
- app/views/rails_email_preview/emails/index.html.erb
|
173
175
|
- app/views/rails_email_preview/emails/show.html.erb
|
174
176
|
- config/i18n-tasks.yml
|
@@ -207,8 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
207
209
|
- !ruby/object:Gem::Version
|
208
210
|
version: '0'
|
209
211
|
requirements: []
|
210
|
-
|
211
|
-
rubygems_version: 2.7.7
|
212
|
+
rubygems_version: 3.0.2
|
212
213
|
signing_key:
|
213
214
|
specification_version: 4
|
214
215
|
summary: Preview emails in browser (rails engine)
|