simple_email_preview 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +7 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +162 -0
  5. data/Rakefile +62 -0
  6. data/app/assets/images/simple_email_preview/favicon.png +0 -0
  7. data/app/assets/javascripts/simple_email_preview/application.js +1 -0
  8. data/app/assets/stylesheets/simple_email_preview/_bootstrap3.sass +68 -0
  9. data/app/assets/stylesheets/simple_email_preview/_default.sass +230 -0
  10. data/app/assets/stylesheets/simple_email_preview/application.scss +10 -0
  11. data/app/controllers/simple_email_preview/application_controller.rb +19 -0
  12. data/app/controllers/simple_email_preview/emails_controller.rb +194 -0
  13. data/app/helpers/simple_email_preview/emails_helper.rb +85 -0
  14. data/app/models/simple_email_preview/preview.rb +86 -0
  15. data/app/presenters/simple_email_preview/preview_list_presenter.rb +38 -0
  16. data/app/views/layouts/simple_email_preview/_flash_notices.html.erb +7 -0
  17. data/app/views/layouts/simple_email_preview/application.html.erb +16 -0
  18. data/app/views/layouts/simple_email_preview/email.html.erb +30 -0
  19. data/app/views/simple_email_preview/emails/_email_iframe.html.erb +88 -0
  20. data/app/views/simple_email_preview/emails/_format_nav.html.erb +4 -0
  21. data/app/views/simple_email_preview/emails/_headers.html.erb +10 -0
  22. data/app/views/simple_email_preview/emails/_headers_and_nav.html.erb +12 -0
  23. data/app/views/simple_email_preview/emails/_i18n_nav.html.erb +3 -0
  24. data/app/views/simple_email_preview/emails/_nav.html.erb +18 -0
  25. data/app/views/simple_email_preview/emails/_send_form.html.erb +11 -0
  26. data/app/views/simple_email_preview/emails/index.html.erb +36 -0
  27. data/app/views/simple_email_preview/emails/show.html.erb +23 -0
  28. data/config/i18n-tasks.yml +10 -0
  29. data/config/initializers/simple_email_preview.rb +14 -0
  30. data/config/locales/de.yml +47 -0
  31. data/config/locales/en.yml +47 -0
  32. data/config/locales/es.yml +47 -0
  33. data/config/locales/ja.yml +47 -0
  34. data/config/locales/ru.yml +51 -0
  35. data/config/routes.rb +23 -0
  36. data/lib/generators/simple_email_preview/install_generator.rb +17 -0
  37. data/lib/generators/simple_email_preview/update_previews_generator.rb +45 -0
  38. data/lib/simple_email_preview.rb +105 -0
  39. data/lib/simple_email_preview/delivery_handler.rb +15 -0
  40. data/lib/simple_email_preview/engine.rb +14 -0
  41. data/lib/simple_email_preview/main_app_route_delegator.rb +20 -0
  42. data/lib/simple_email_preview/version.rb +3 -0
  43. data/lib/simple_email_preview/view_hooks.rb +102 -0
  44. metadata +231 -0
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <style type="text/css">
5
+ #message_body, #raw_message {
6
+ font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
7
+ word-break: break-word;
8
+ }
9
+
10
+ #error {
11
+ padding: 15px;
12
+ margin-bottom: 20px;
13
+ border: 1px solid transparent;
14
+ border-radius: 4px;
15
+ background-color: #f2dede;
16
+ border-color: #ebccd1;
17
+ color: #a94442;
18
+ }
19
+
20
+ body {
21
+ background-color: white;
22
+ }
23
+ </style>
24
+ <script>document.addEventListener('DOMContentLoaded', window.parent.rep.iframeOnDOMContentLoaded, true);</script>
25
+ </head>
26
+ <body>
27
+ <div id="content" class="container">
28
+ <%= yield %></div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,88 @@
1
+ <script>
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">
79
+ <div id="email-progress-bar" class="progress"
80
+ style="display: none; position: absolute; z-index: -1; width: 100%; text-align: center">
81
+ <div class="progress-bar progress-bar-striped active" style='width:100%'>
82
+ <%= t 'rep.base.loading' %>
83
+ </div>
84
+ </div>
85
+
86
+ <iframe id="src-iframe" srcdoc="<%= @mail_body_html.to_str %>" seamless="seamless" onload="rep.iframeOnLoad()"
87
+ style="width:100%;border:none;padding:0;margin:0;height:0"></iframe>
88
+ </div>
@@ -0,0 +1,4 @@
1
+ <p><span class="<%= rep_btn_group_class %>">
2
+ <% @preview.formats.each do |format| %><%= content_tag :a, format_label(format), change_format_attr(format) -%><% end %>
3
+ </span></p>
4
+
@@ -0,0 +1,10 @@
1
+ <%= with_show_hook :headers do %>
2
+ <dl class="rep--headers-list">
3
+ <%= with_show_hook :headers_content do %>
4
+ <% human_headers mail do |name, value| %>
5
+ <dt><%= name %></dt>
6
+ <dd><%= value %></dd>
7
+ <% end %>
8
+ <% end %>
9
+ </dl>
10
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <div class="rep--panel">
2
+ <div class="<%= rep_style[:row_class] %>">
3
+ <div id="email-headers" class="rep--email-headers"
4
+ data-url="<%= simple_email_preview.rep_email_headers_path(preview_params) %>">
5
+ <%# content updated by JS on demand from the iframe %>
6
+ <%= render 'simple_email_preview/emails/headers', mail: @mail %>
7
+ </div>
8
+ <div class="rep--email-nav-container">
9
+ <%= render 'nav' %>
10
+ </div>
11
+ </div>
12
+ </div>
@@ -0,0 +1,3 @@
1
+ <p><span class="<%= rep_btn_group_class %>">
2
+ <% @preview.locales.each do |locale| %><%= content_tag :a, locale_name(locale), change_locale_attr(locale) %><% end %>
3
+ </span></p>
@@ -0,0 +1,18 @@
1
+ <%# Locale, format and actions %>
2
+ <%= with_show_hook :nav do %>
3
+ <div class="rep--email-options">
4
+ <% if I18n.available_locales.length > 1 %>
5
+ <%= with_show_hook :nav_i18n do %>
6
+ <%= render 'simple_email_preview/emails/i18n_nav' %>
7
+ <% end %>
8
+ <% end %>
9
+ <%= with_show_hook :nav_format do %>
10
+ <%= render 'simple_email_preview/emails/format_nav' %>
11
+ <% end %>
12
+ <% if SimpleEmailPreview.enable_send_email %>
13
+ <%= with_show_hook :nav_send do %>
14
+ <%= render 'simple_email_preview/emails/send_form' %>
15
+ <% end %>
16
+ <% end %>
17
+ </div>
18
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <%= form_tag simple_email_preview.rep_test_deliver_url(params: preview_params), method: :post,
2
+ class: 'rep--send-to-form' do %>
3
+ <%= hidden_field_tag :email_locale, @email_locale %>
4
+ <%# Indentation ensures the lack of a space in between the button and the field: %>
5
+ <%= content_tag :button, t('.send_btn'), type: 'submit',
6
+ class: rep_style[:btn_danger_class],
7
+ 'data-confirm' => t('.send_are_you_sure') -%>
8
+ <%= text_field_tag :recipient_email, '', type: :email, required: true,
9
+ class: rep_style[:form_control_class],
10
+ placeholder: t('.send_recipient_placeholder') -%>
11
+ <% end %>
@@ -0,0 +1,36 @@
1
+ <%
2
+ list = @list
3
+ previews = @previews
4
+ %>
5
+
6
+ <div class="rep--main-container">
7
+ <h1><%= t '.list_title' %></h1>
8
+
9
+ <%= with_index_hook :list do %>
10
+ <div class="<%= rep_style[:row_class] %>">
11
+ <% list.columns do |groups| %>
12
+ <div class="rep--email-list-half">
13
+ <% groups.each do |title, group_previews| %>
14
+ <h2><%= title %></h2>
15
+ <div class="<%= rep_style[:list_group_class] %>">
16
+ <% group_previews.each do |p| %>
17
+ <a class="<%= rep_style[:list_group_item_class] %>"
18
+ href="<%= simple_email_preview.rep_email_path(preview_id: p.id, email_locale: @email_locale) %>">
19
+ <%= p.humanized_method_name %>
20
+ </a>
21
+ <% end %>
22
+ </div>
23
+ <% end %>
24
+ </div>
25
+ <% end %>
26
+ </div>
27
+ <% end %>
28
+ <hr/>
29
+ <p class="rep--footer">
30
+ <%= t 'rep.base.email', count: previews.length %> <%= t 'rep.base.in' %> <%= t 'rep.base.mailer', count: list.groups.length %>
31
+ <br/>
32
+ <a href="https://github.com/glebm/simple_email_preview" target="_blank">
33
+ <!-- REP <%#= SimpleEmailPreview::VERSION %>-->
34
+ </a>
35
+ </p>
36
+ </div>
@@ -0,0 +1,23 @@
1
+ <%- # Using ERB for this template to have precise control of tag indentation for correct rendering of raw and text. -%>
2
+ <div class="rep--main-container">
3
+ <div id="email-show" class="rep--email-show">
4
+ <%= with_show_hook :breadcrumb do %>
5
+ <ol class="rep--breadcrumbs">
6
+ <%= with_show_hook :breadcrumb_content do %>
7
+ <li class="rep--breadcrumbs__breadcrumb">
8
+ <a href="<%= simple_email_preview.rep_emails_path(email_locale: @email_locale) %>"><%= t '.breadcrumb_list' %></a>
9
+ </li><li class="rep--breadcrumbs__breadcrumb-active"><a href="<%= request.path %>"><%= @preview.name %></a></li>
10
+ <% end %>
11
+ </ol>
12
+ <% end %>
13
+
14
+ <%= with_show_hook :headers_and_nav do %>
15
+ <%= render 'simple_email_preview/emails/headers_and_nav' %>
16
+ <% end %>
17
+
18
+ <%= with_show_hook :email_body do %>
19
+ <%- # actual email content, rendered in an iframe to prevent browser styles from interfering -%>
20
+ <%= render 'simple_email_preview/emails/email_iframe' %>
21
+ <% end %>
22
+ </div>
23
+ </div>
@@ -0,0 +1,10 @@
1
+ base_locale: en
2
+ locales: [en, de, ru, es]
3
+ search:
4
+ paths:
5
+ - app/
6
+ - lib/
7
+ data:
8
+ yaml:
9
+ write:
10
+ line_width: -1
@@ -0,0 +1,14 @@
1
+ require 'simple_email_preview'
2
+ require 'breadcrumbs_on_rails'
3
+
4
+ Rails.application.config.to_prepare do
5
+ # Render REP inside a custom layout (set to 'application' to use app layout, default is REP's own layout)
6
+ # This will also make application routes accessible from within REP:
7
+ # SimpleEmailPreview.layout = 'admin'
8
+
9
+ # Set UI locale to something other than :en
10
+ SimpleEmailPreview.locale = :en
11
+
12
+ # Auto-load preview classes from:
13
+ SimpleEmailPreview.preview_classes = SimpleEmailPreview.find_preview_classes('app/mailer_previews')
14
+ end
@@ -0,0 +1,47 @@
1
+ ---
2
+ de:
3
+ rep:
4
+ base:
5
+ email:
6
+ one: 1 E-Mail
7
+ other: "%{count} E-Mails"
8
+ mailer:
9
+ one: 1 Mailer
10
+ other: "%{count} Mailer"
11
+ in: in
12
+ loading: Lade...
13
+ test_deliver:
14
+ no_delivery_method: Bitte setze 'config.action_mailer.delivery_method' um E-Mails in der „%{environment}“ Umgebung zu senden.
15
+ provide_email: An welche Adresse senden?
16
+ sent_notice: Senden an %{address} mit %{delivery_method}
17
+ headers:
18
+ subject: Betreff
19
+ from: Aus
20
+ to: Zu
21
+ reply_to: Beantworten
22
+ cc: CC
23
+ bcc: BCC
24
+ attachments: Anhänge
25
+ errors:
26
+ email_missing_format: Format fehlenden
27
+ layouts:
28
+ simple_email_preview:
29
+ application:
30
+ head_title: E-Mails - REP
31
+ simple_email_preview:
32
+ emails:
33
+ index:
34
+ list_title: Anwendungs E-Mails
35
+ show:
36
+ breadcrumb_list: E-Mails
37
+ send_form:
38
+ send_are_you_sure: Diese Aktion wird diese E-Mail wirklich versenden. Bist du sicher?
39
+ send_btn: Senden an
40
+ send_recipient_placeholder: E-Mails
41
+ integrations:
42
+ cms:
43
+ customize_cms_for_simple_email_preview:
44
+ edit_email: E-Mail bearbeiten
45
+ view_link: Anzeigen
46
+ errors:
47
+ site_missing: Bitte erstellen Sie eine CMS-Website für %{locale} zuerst. Bei der Verwendung von mehreren Gebietsschemas sollte der Standort gespiegelt werden.
@@ -0,0 +1,47 @@
1
+ ---
2
+ en:
3
+ rep:
4
+ headers:
5
+ subject: Subject
6
+ from: From
7
+ to: To
8
+ reply_to: Reply to
9
+ cc: CC
10
+ bcc: BCC
11
+ attachments: Attachments
12
+ base:
13
+ email:
14
+ one: 1 email
15
+ other: "%{count} emails"
16
+ mailer:
17
+ one: 1 mailer
18
+ other: "%{count} mailers"
19
+ in: in
20
+ loading: Loading...
21
+ test_deliver:
22
+ no_delivery_method: Please set 'config.action_mailer.delivery_method' to send emails in '%{environment}' environment
23
+ provide_email: Send to which address?
24
+ sent_notice: Sent to %{address} via %{delivery_method}
25
+ errors:
26
+ email_missing_format: Format missing
27
+ layouts:
28
+ simple_email_preview:
29
+ application:
30
+ head_title: Emails - REP
31
+ simple_email_preview:
32
+ emails:
33
+ index:
34
+ list_title: Application Emails
35
+ show:
36
+ breadcrumb_list: Emails
37
+ send_form:
38
+ send_are_you_sure: This will actually send this email. Are you sure?
39
+ send_btn: Send to
40
+ send_recipient_placeholder: Email
41
+ integrations:
42
+ cms:
43
+ errors:
44
+ site_missing: Please create a CMS site for %{locale} first. When using multiple locales the site should be Mirrored.
45
+ customize_cms_for_simple_email_preview:
46
+ edit_email: Editing email
47
+ view_link: View
@@ -0,0 +1,47 @@
1
+ ---
2
+ es:
3
+ rep:
4
+ headers:
5
+ subject: Asunto
6
+ from: De
7
+ to: A
8
+ reply_to: Responder a
9
+ cc: CC
10
+ bcc: BCC
11
+ attachments: Adjuntos
12
+ base:
13
+ email:
14
+ one: 1 email
15
+ other: "%{count} emails"
16
+ mailer:
17
+ one: 1 mailer
18
+ other: "%{count} mailers"
19
+ in: en
20
+ loading: Cargando...
21
+ test_deliver:
22
+ no_delivery_method: Por favor configura 'config.action_mailer.delivery_method' para enviar correos en el entorno de '%{environment}'
23
+ provide_email: ¿A que dirección?
24
+ sent_notice: Enviado a %{address} vía %{delivery_method}
25
+ errors:
26
+ email_missing_format: Falta formato
27
+ layouts:
28
+ simple_email_preview:
29
+ application:
30
+ head_title: Emails - REP
31
+ simple_email_preview:
32
+ emails:
33
+ index:
34
+ list_title: Emails de la aplicación
35
+ show:
36
+ breadcrumb_list: Emails
37
+ send_form:
38
+ send_are_you_sure: Esto enviara el email. ¿Estás seguro?
39
+ send_btn: Enviar a
40
+ send_recipient_placeholder: Email
41
+ integrations:
42
+ cms:
43
+ errors:
44
+ site_missing: Por favor, primero crea un CMS para %{locale}. Cuando estes usando varios idiomas el site debería estar
45
+ customize_cms_for_simple_email_preview:
46
+ edit_email: Editando el email
47
+ view_link: Ver
@@ -0,0 +1,47 @@
1
+ ---
2
+ en:
3
+ rep:
4
+ headers:
5
+ subject: Subject
6
+ from: From
7
+ to: To
8
+ reply_to: Reply to
9
+ cc: CC
10
+ bcc: BCC
11
+ attachments: Attachments
12
+ base:
13
+ email:
14
+ one: 1 email
15
+ other: "%{count} emails"
16
+ mailer:
17
+ one: 1 mailer
18
+ other: "%{count} mailers"
19
+ in: in
20
+ loading: Loading...
21
+ test_deliver:
22
+ no_delivery_method: Please set 'config.action_mailer.delivery_method' to send emails in '%{environment}' environment
23
+ provide_email: Send to which address?
24
+ sent_notice: Sent to %{address} via %{delivery_method}
25
+ errors:
26
+ email_missing_format: Format missing
27
+ layouts:
28
+ simple_email_preview:
29
+ application:
30
+ head_title: Emails - REP
31
+ simple_email_preview:
32
+ emails:
33
+ index:
34
+ list_title: Application Emails
35
+ show:
36
+ breadcrumb_list: Emails
37
+ send_form:
38
+ send_are_you_sure: This will actually send this email. Are you sure?
39
+ send_btn: Send to
40
+ send_recipient_placeholder: Email
41
+ integrations:
42
+ cms:
43
+ errors:
44
+ site_missing: Please create a CMS site for %{locale} first. When using multiple locales the site should be Mirrored.
45
+ customize_cms_for_simple_email_preview:
46
+ edit_email: Editing email
47
+ view_link: View