rails_email_preview 0.2.31 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +30 -8
- data/app/assets/stylesheets/rails_email_preview/application.css.sass +228 -3
- data/app/assets/stylesheets/rails_email_preview/bootstrap3.css.sass +68 -0
- data/app/controllers/rails_email_preview/emails_controller.rb +14 -6
- data/app/helpers/rails_email_preview/emails_helper.rb +1 -14
- data/app/views/integrations/cms/{_customize_cms_for_rails_email_preview.html.slim → _customize_cms_for_rails_email_preview.html.erb} +16 -12
- data/app/views/layouts/rails_email_preview/_flash_notices.html.erb +7 -0
- data/app/views/layouts/rails_email_preview/application.html.erb +15 -0
- data/app/views/layouts/rails_email_preview/email.html.erb +30 -0
- data/app/views/rails_email_preview/emails/{_email_iframe.html.slim → _email_iframe.html.erb} +17 -14
- data/app/views/rails_email_preview/emails/_format_nav.html.erb +4 -0
- data/app/views/rails_email_preview/emails/_headers.html.erb +10 -0
- data/app/views/rails_email_preview/emails/_headers_and_nav.html.erb +12 -0
- data/app/views/rails_email_preview/emails/_i18n_nav.html.erb +3 -0
- data/app/views/rails_email_preview/emails/_nav.html.erb +18 -0
- data/app/views/rails_email_preview/emails/_send_form.html.erb +11 -0
- data/app/views/rails_email_preview/emails/index.html.erb +36 -0
- data/app/views/rails_email_preview/emails/show.html.erb +23 -0
- data/lib/rails_email_preview.rb +11 -12
- data/lib/rails_email_preview/version.rb +1 -1
- metadata +15 -32
- data/app/assets/stylesheets/rails_email_preview/_bootstrap.css.scss +0 -7844
- data/app/assets/stylesheets/rails_email_preview/_bootstrap_theme.css.scss +0 -345
- data/app/assets/stylesheets/rails_email_preview/_layout.css.sass +0 -13
- data/app/views/layouts/rails_email_preview/_flash_notices.html.slim +0 -5
- data/app/views/layouts/rails_email_preview/application.html.slim +0 -12
- data/app/views/layouts/rails_email_preview/email.html.slim +0 -28
- data/app/views/rails_email_preview/emails/_format_nav.html.slim +0 -6
- data/app/views/rails_email_preview/emails/_headers.html.slim +0 -6
- data/app/views/rails_email_preview/emails/_headers_and_nav.html.slim +0 -8
- data/app/views/rails_email_preview/emails/_headers_content.html.slim +0 -0
- data/app/views/rails_email_preview/emails/_i18n_nav.html.slim +0 -5
- data/app/views/rails_email_preview/emails/_nav.html.slim +0 -13
- data/app/views/rails_email_preview/emails/_send_form.html.slim +0 -6
- data/app/views/rails_email_preview/emails/index.html.slim +0 -21
- data/app/views/rails_email_preview/emails/show.html.slim +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02bcd4fe9bb7401449acd3b44245c93f8d5ab360
|
4
|
+
data.tar.gz: 5b7c64b281650e047e113cb020f83c4050156e20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 081630f21830afb463670897d4517670bc890a9ff47b927e0a035dbec1f0baf5866bec0ac4ef99d7d27527996a79d9cbf744c476f7ccd76fa82a19acc18c642f
|
7
|
+
data.tar.gz: 26f7398c358fa2b9041ba6a9bb0af737b87397c5ed2ce81f769d0d63bd6ccbe73fe922476e81464e4bf395b789a447ed64992290916366e0830fed3e0b1131f6
|
data/README.md
CHANGED
@@ -2,21 +2,22 @@
|
|
2
2
|
|
3
3
|
Preview email in the browser with this Rails engine. Compatible with Rails 3 and 4.
|
4
4
|
|
5
|
-
|
5
|
+
An email review:
|
6
|
+
|
6
7
|
![screenshot][rep-show-screenshot]
|
7
8
|
|
8
|
-
|
9
|
+
The list of all email previews:
|
10
|
+
|
9
11
|
![screenshot][rep-nav-screenshot]
|
10
12
|
|
11
|
-
REP
|
12
|
-
*These screenshots are using a custom Bootstrap theme*
|
13
|
+
REP comes with two themes: a simple standalone theme, and a theme that uses [Bootstrap 3][rep-show-default-screenshot].
|
13
14
|
|
14
15
|
## Installation
|
15
16
|
|
16
17
|
Add [![Gem Version][gem-badge]][gem] to Gemfile:
|
17
18
|
|
18
19
|
```ruby
|
19
|
-
gem 'rails_email_preview', '~> 0.
|
20
|
+
gem 'rails_email_preview', '~> 1.0.0'
|
20
21
|
```
|
21
22
|
|
22
23
|
Add an initializer and the routes:
|
@@ -154,7 +155,9 @@ RailsEmailPreview.locale = :de
|
|
154
155
|
|
155
156
|
### Views
|
156
157
|
|
157
|
-
|
158
|
+
By default REP views will render inside its own layout.
|
159
|
+
|
160
|
+
To render all REP views inside your app layout, first set the layout to use in the initializer:
|
158
161
|
|
159
162
|
```ruby
|
160
163
|
Rails.application.config.to_prepare do
|
@@ -163,9 +166,28 @@ Rails.application.config.to_prepare do
|
|
163
166
|
end
|
164
167
|
```
|
165
168
|
|
166
|
-
|
169
|
+
Then, import REP styles into your `application.css.scss`:
|
170
|
+
|
171
|
+
```scss
|
172
|
+
@import "rails_email_preview/application";
|
173
|
+
```
|
174
|
+
|
175
|
+
Alternatively, if you are using Bootstrap 3, `@import "rails_email_preview/application"`, and add the following
|
176
|
+
to the initializer:
|
167
177
|
|
168
|
-
|
178
|
+
```ruby
|
179
|
+
config.style.merge!(
|
180
|
+
btn_active_class_modifier: 'active',
|
181
|
+
btn_danger_class: 'btn btn-danger',
|
182
|
+
btn_default_class: 'btn btn-default',
|
183
|
+
btn_group_class: 'btn-group btn-group-sm',
|
184
|
+
btn_primary_class: 'btn btn-primary',
|
185
|
+
form_control_class: 'form-control',
|
186
|
+
list_group_class: 'list-group',
|
187
|
+
list_group_item_class: 'list-group-item',
|
188
|
+
row_class: 'row',
|
189
|
+
)
|
190
|
+
```
|
169
191
|
|
170
192
|
You can also override any individual view by placing a file with the same path in your project's `app/views`,
|
171
193
|
e.g. `app/views/rails_email_preview/emails/index.html.slim`.
|
@@ -1,3 +1,228 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
// A standalone theme for Rails Email Preview
|
2
|
+
|
3
|
+
$rep-brand-color: #4a90e2 !default
|
4
|
+
$rep-link-color: $rep-brand-color !default
|
5
|
+
$rep-gray: #818a91 !default
|
6
|
+
$rep-gray-light: #a6b2bb !default
|
7
|
+
$rep-gray-lighter: #f1f3f4 !default
|
8
|
+
|
9
|
+
$rep-breadcrumb-bg: $rep-gray-lighter !default
|
10
|
+
|
11
|
+
$rep-grid-gutter: 30px !default
|
12
|
+
$rep-grid-breakpoint-sm: 768px !default
|
13
|
+
$rep-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif !default
|
14
|
+
$rep-font-size-nav: 1.15em !default
|
15
|
+
$rep-text-color-secondary: #263238
|
16
|
+
|
17
|
+
=rep--media-sm-plus
|
18
|
+
@media (min-width: $rep-grid-breakpoint-sm)
|
19
|
+
@content
|
20
|
+
|
21
|
+
=clearfix
|
22
|
+
&::after
|
23
|
+
content: ""
|
24
|
+
display: table
|
25
|
+
clear: both
|
26
|
+
|
27
|
+
%rep--link
|
28
|
+
color: $rep-link-color
|
29
|
+
text-decoration: none
|
30
|
+
transition: color 0.1s linear
|
31
|
+
&:active, &:focus, &:hover
|
32
|
+
color: darken($rep-link-color, 15%)
|
33
|
+
&:active
|
34
|
+
outline: none
|
35
|
+
&:focus
|
36
|
+
outline: thin dotted
|
37
|
+
outline: 5px auto -webkit-focus-ring-color
|
38
|
+
outline-offset: -2px
|
39
|
+
|
40
|
+
%rep--hr
|
41
|
+
margin-top: 20px
|
42
|
+
margin-bottom: 20px
|
43
|
+
border: 0
|
44
|
+
border-top: 1px solid $rep-gray-lighter
|
45
|
+
|
46
|
+
.rep--main-container
|
47
|
+
font-family: $rep-font-family
|
48
|
+
box-sizing: border-box
|
49
|
+
*, *::before, *::after
|
50
|
+
box-sizing: inherit
|
51
|
+
a
|
52
|
+
@extend %rep--link
|
53
|
+
hr
|
54
|
+
@extend %rep--hr
|
55
|
+
|
56
|
+
.rep--row
|
57
|
+
margin-left: ($rep-grid-gutter / -2)
|
58
|
+
margin-right: ($rep-grid-gutter / -2)
|
59
|
+
+clearfix
|
60
|
+
|
61
|
+
%rep--row__col
|
62
|
+
position: relative
|
63
|
+
min-height: 1px
|
64
|
+
padding-right: ($rep-grid-gutter / 2)
|
65
|
+
padding-left: ($rep-grid-gutter / 2)
|
66
|
+
|
67
|
+
@each $col in (4, 6, 8)
|
68
|
+
%rep--row__col-#{$col}
|
69
|
+
@extend %rep--row__col
|
70
|
+
+rep--media-sm-plus
|
71
|
+
float: left
|
72
|
+
width: percentage($col / 12)
|
73
|
+
|
74
|
+
.rep--email-headers
|
75
|
+
@extend %rep--row__col-8
|
76
|
+
|
77
|
+
.rep--email-nav-container
|
78
|
+
@extend %rep--row__col-4
|
79
|
+
|
80
|
+
.rep--email-list-half
|
81
|
+
@extend %rep--row__col-6
|
82
|
+
|
83
|
+
.rep--breadcrumbs
|
84
|
+
padding: 0.75rem 1rem
|
85
|
+
margin-bottom: 1rem
|
86
|
+
font-size: $rep-font-size-nav
|
87
|
+
list-style: none
|
88
|
+
background-color: $rep-breadcrumb-bg
|
89
|
+
.rep--breadcrumbs__breadcrumb
|
90
|
+
display: inline-block
|
91
|
+
+ ::before
|
92
|
+
display: inline-block
|
93
|
+
padding: 0 0.5em
|
94
|
+
color: $rep-gray-light
|
95
|
+
content: "/"
|
96
|
+
.rep--breadcrumbs__breadcrumb-active
|
97
|
+
display: inline-block
|
98
|
+
|
99
|
+
.rep--headers-list
|
100
|
+
margin: 0
|
101
|
+
dt
|
102
|
+
color: $rep-text-color-secondary
|
103
|
+
font-weight: bold
|
104
|
+
+rep--media-sm-plus
|
105
|
+
float: left
|
106
|
+
clear: left
|
107
|
+
margin-right: 0.4em
|
108
|
+
text-align: right
|
109
|
+
width: 4.8em
|
110
|
+
dd
|
111
|
+
width: auto
|
112
|
+
margin-left: 0
|
113
|
+
margin-bottom: 0.2em
|
114
|
+
|
115
|
+
.rep--btn
|
116
|
+
appearance: none
|
117
|
+
-webkit-font-smoothing: antialiased
|
118
|
+
border: 1px solid
|
119
|
+
cursor: pointer
|
120
|
+
display: inline-block
|
121
|
+
font-weight: 600
|
122
|
+
padding: 0.75em 1em
|
123
|
+
text-decoration: none
|
124
|
+
user-select: none
|
125
|
+
vertical-align: middle
|
126
|
+
text-align: center
|
127
|
+
white-space: nowrap
|
128
|
+
transition: all .2s ease-in-out
|
129
|
+
&:active, &.rep--btn-active
|
130
|
+
background-image: none
|
131
|
+
outline: 0
|
132
|
+
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125)
|
133
|
+
&:focus
|
134
|
+
outline: none
|
135
|
+
|
136
|
+
=rep--btn($color, $background, $border-color: darken($background, 5%))
|
137
|
+
color: $color
|
138
|
+
background: $background
|
139
|
+
border-color: $border-color
|
140
|
+
&:hover
|
141
|
+
background: darken($background, 10%)
|
142
|
+
border-color: darken($border-color, 12%)
|
143
|
+
&:focus
|
144
|
+
box-shadow: 0 0 3px $background
|
145
|
+
background-color: darken($background, 17%)
|
146
|
+
border-color: darken($border-color, 25%)
|
147
|
+
|
148
|
+
.rep--btn-default
|
149
|
+
+rep--btn(#111, $rep-gray-lighter)
|
150
|
+
|
151
|
+
.rep--btn-primary
|
152
|
+
+rep--btn(#fff, $rep-brand-color)
|
153
|
+
|
154
|
+
.rep--btn-danger
|
155
|
+
+rep--btn(#fff, #d9534f)
|
156
|
+
|
157
|
+
.rep--btn-group
|
158
|
+
.rep--btn + .rep--btn
|
159
|
+
margin-left: -1px
|
160
|
+
.rep--btn
|
161
|
+
z-index: 1
|
162
|
+
&.rep--btn-active
|
163
|
+
z-index: 2
|
164
|
+
&:focus, &:hover
|
165
|
+
z-index: 3
|
166
|
+
|
167
|
+
.rep--list-group
|
168
|
+
font-size: $rep-font-size-nav
|
169
|
+
|
170
|
+
.rep--list-group__item
|
171
|
+
display: block
|
172
|
+
padding: 1rem 1.5rem
|
173
|
+
&:hover
|
174
|
+
background-color: $rep-gray-lighter
|
175
|
+
transition: background-color ease-in-out 0.15s, background-color ease-in-out 0.15s
|
176
|
+
+ .rep--list-group__item
|
177
|
+
border-top: 1px solid $rep-gray-light
|
178
|
+
|
179
|
+
.rep--panel
|
180
|
+
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .125)
|
181
|
+
padding: 1.25rem
|
182
|
+
margin-bottom: 1rem
|
183
|
+
|
184
|
+
.rep--email-options
|
185
|
+
font-size: 0.875rem
|
186
|
+
text-align: left
|
187
|
+
p
|
188
|
+
margin-top: 0
|
189
|
+
+rep--media-sm-plus
|
190
|
+
text-align: right
|
191
|
+
|
192
|
+
.rep--send-to-form
|
193
|
+
display: block
|
194
|
+
white-space: nowrap
|
195
|
+
padding-bottom: 4px
|
196
|
+
button, [type="email"]
|
197
|
+
display: inline-block
|
198
|
+
&:focus, &:active
|
199
|
+
z-index: 2
|
200
|
+
button
|
201
|
+
line-height: 1.25
|
202
|
+
padding: 0.5rem
|
203
|
+
[type="email"]
|
204
|
+
max-width: 135px
|
205
|
+
padding: 0.5rem
|
206
|
+
border-top-left-radius: 0
|
207
|
+
border-bottom-left-radius: 0
|
208
|
+
|
209
|
+
.rep--form-control
|
210
|
+
padding: 0.5rem 0.75rem
|
211
|
+
line-height: 1.25
|
212
|
+
background-image: none
|
213
|
+
background-clip: padding-box
|
214
|
+
border: 1px solid rgba(0, 0, 0, 0.15)
|
215
|
+
border-radius: 0.25rem
|
216
|
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075)
|
217
|
+
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s
|
218
|
+
&::placeholder
|
219
|
+
color: #999
|
220
|
+
opacity: 1
|
221
|
+
&:focus
|
222
|
+
border-color: lighten($rep-brand-color, 20%)
|
223
|
+
outline: none
|
224
|
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6)
|
225
|
+
|
226
|
+
.rep--footer
|
227
|
+
text-align: center
|
228
|
+
color: $rep-gray
|
@@ -0,0 +1,68 @@
|
|
1
|
+
// Bootstrap 3 theme for Rails Email Preview
|
2
|
+
|
3
|
+
.rep--email-headers
|
4
|
+
@extend .col-md-8
|
5
|
+
|
6
|
+
.rep--email-nav-container
|
7
|
+
@extend .col-md-4
|
8
|
+
|
9
|
+
.rep--email-list-half
|
10
|
+
@extend .col-md-6
|
11
|
+
|
12
|
+
.rep--headers-list
|
13
|
+
dt
|
14
|
+
color: $gray-dark
|
15
|
+
@media (min-width: $screen-sm-min)
|
16
|
+
float: left
|
17
|
+
clear: left
|
18
|
+
margin-right: 0.45em
|
19
|
+
text-align: right
|
20
|
+
width: 100px
|
21
|
+
&::after
|
22
|
+
content: ":"
|
23
|
+
dd
|
24
|
+
width: auto
|
25
|
+
margin-left: 0
|
26
|
+
margin-bottom: 0.3em
|
27
|
+
|
28
|
+
.rep--email-options
|
29
|
+
text-align: right
|
30
|
+
|
31
|
+
.rep--breadcrumbs
|
32
|
+
@extend .breadcrumb
|
33
|
+
|
34
|
+
.rep--breadcrumbs__breadcrumb-active
|
35
|
+
color: $breadcrumb-active-color
|
36
|
+
|
37
|
+
.rep--panel
|
38
|
+
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .125)
|
39
|
+
padding: 15px
|
40
|
+
margin-bottom: 20px
|
41
|
+
|
42
|
+
.rep--send-to-form
|
43
|
+
display: block
|
44
|
+
white-space: nowrap
|
45
|
+
padding-bottom: 4px
|
46
|
+
button, [type="email"]
|
47
|
+
display: inline-block
|
48
|
+
&:focus, &:active
|
49
|
+
z-index: 2
|
50
|
+
button
|
51
|
+
line-height: 1.3
|
52
|
+
border-top-right-radius: 0
|
53
|
+
border-bottom-right-radius: 0
|
54
|
+
[type="email"]
|
55
|
+
max-width: 140px
|
56
|
+
border-top-left-radius: 0
|
57
|
+
border-bottom-left-radius: 0
|
58
|
+
|
59
|
+
.rep--footer
|
60
|
+
text-align: center
|
61
|
+
color: $state-info-text
|
62
|
+
|
63
|
+
.rep--email-headers
|
64
|
+
+make-sm-column(8)
|
65
|
+
.rep--email-nav-container
|
66
|
+
+make-sm-column(4)
|
67
|
+
.rep--email-list-half
|
68
|
+
+make-sm-column(6)
|
@@ -5,6 +5,7 @@ module RailsEmailPreview
|
|
5
5
|
around_filter :set_locale
|
6
6
|
before_filter :set_email_preview_locale
|
7
7
|
helper_method :with_email_locale
|
8
|
+
helper_method :preview_params
|
8
9
|
|
9
10
|
# List of emails
|
10
11
|
def index
|
@@ -19,7 +20,7 @@ module RailsEmailPreview
|
|
19
20
|
with_email_locale do
|
20
21
|
if @preview.respond_to?(:preview_mail)
|
21
22
|
@mail, body = mail_and_body
|
22
|
-
@mail_body_html = render_to_string
|
23
|
+
@mail_body_html = render_to_string(inline: body, layout: 'rails_email_preview/email')
|
23
24
|
else
|
24
25
|
raise ArgumentError.new("#{@preview} is not a preview class, does not respond_to?(:preview_mail)")
|
25
26
|
end
|
@@ -47,14 +48,17 @@ module RailsEmailPreview
|
|
47
48
|
|
48
49
|
# Download attachment
|
49
50
|
def show_attachment
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
with_email_locale do
|
52
|
+
filename = "#{params[:filename]}.#{params[:format]}"
|
53
|
+
attachment = preview_mail(false).attachments.find { |a| a.filename == filename }
|
54
|
+
send_data attachment.body.raw_source, filename: filename
|
55
|
+
end
|
53
56
|
end
|
54
57
|
|
55
58
|
# Render headers partial. Used by the CMS integration to refetch headers after editing.
|
56
59
|
def show_headers
|
57
|
-
|
60
|
+
mail = with_email_locale { mail_and_body.first }
|
61
|
+
render partial: 'rails_email_preview/emails/headers', locals: {mail: mail}
|
58
62
|
end
|
59
63
|
|
60
64
|
# Render email body iframe HTML. Used by the CMS integration to provide a link back to Show from Edit.
|
@@ -69,6 +73,10 @@ module RailsEmailPreview
|
|
69
73
|
|
70
74
|
private
|
71
75
|
|
76
|
+
def preview_params
|
77
|
+
params.except(*(request.path_parameters.keys - [:email_locale]))
|
78
|
+
end
|
79
|
+
|
72
80
|
def deliver_email!(mail)
|
73
81
|
if mail.respond_to?(:deliver_now!)
|
74
82
|
# Rails 4.2+
|
@@ -92,7 +100,7 @@ module RailsEmailPreview
|
|
92
100
|
# @param [Boolean] run_handlers whether to run the registered handlers for Mail object
|
93
101
|
# @return [Mail]
|
94
102
|
def preview_mail(run_handlers = true)
|
95
|
-
@preview.preview_mail(run_handlers,
|
103
|
+
@preview.preview_mail(run_handlers, preview_params)
|
96
104
|
end
|
97
105
|
|
98
106
|
# @param [Mail] mail
|
@@ -57,27 +57,14 @@ module RailsEmailPreview::EmailsHelper
|
|
57
57
|
RailsEmailPreview.style
|
58
58
|
end
|
59
59
|
|
60
|
-
def preview_params
|
61
|
-
params.except(*request.path_parameters.keys)
|
62
|
-
end
|
63
|
-
|
64
60
|
def rep_btn_class(active = false)
|
65
|
-
rep_style[:
|
66
|
-
end
|
67
|
-
|
68
|
-
def rep_row_class
|
69
|
-
rep_style[:row_class]
|
70
|
-
end
|
71
|
-
|
72
|
-
def rep_col_class(n)
|
73
|
-
rep_style[:column_class] % {n: n}
|
61
|
+
[rep_style[:btn_default_class], (rep_style[:btn_active_class_modifier] if active)].compact * ' '
|
74
62
|
end
|
75
63
|
|
76
64
|
def rep_btn_group_class
|
77
65
|
rep_style[:btn_group_class]
|
78
66
|
end
|
79
67
|
|
80
|
-
|
81
68
|
def with_index_hook(key, &block)
|
82
69
|
render_hook key, list: @list, previews: @previews, &block
|
83
70
|
end
|