maily 0.12.1 → 2.0.1
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/CHANGELOG.md +27 -0
- data/MIT-LICENSE +1 -1
- data/README.md +55 -17
- data/app/assets/images/maily/logo.png +0 -0
- data/app/controllers/maily/application_controller.rb +11 -0
- data/app/controllers/maily/emails_controller.rb +3 -3
- data/app/helpers/maily/application_helper.rb +18 -1
- data/app/helpers/maily/emails_helper.rb +10 -3
- data/app/views/layouts/maily/application.html.erb +1 -1
- data/app/views/maily/emails/edit.html.erb +2 -2
- data/app/views/maily/emails/show.html.erb +15 -4
- data/app/views/maily/shared/_flash_messages.html.erb +3 -3
- data/app/views/maily/shared/_header.html.erb +5 -2
- data/app/views/maily/shared/_sidebar.html.erb +12 -3
- data/app/views/maily/shared/_stylesheet.html.erb +283 -0
- data/lib/generators/maily/install_generator.rb +1 -1
- data/lib/generators/templates/initializer.rb +4 -4
- data/lib/maily.rb +3 -3
- data/lib/maily/email.rb +31 -9
- data/lib/maily/engine.rb +0 -7
- data/lib/maily/mailer.rb +17 -6
- data/lib/maily/version.rb +1 -1
- metadata +3 -18
- data/app/assets/stylesheets/maily/_variables.scss +0 -6
- data/app/assets/stylesheets/maily/application.scss +0 -305
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5d36fc2996857665c3ca2722d87efacccdd1a389e2ff2c96e00ce4f8a2d0de4
|
4
|
+
data.tar.gz: e48248be9469c2f524434855a48ccbe11743631456b4659c941cc7c6cb4c2e68
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb0e6fac2533eaf67e2c946ca7a7a18faa8d3765114d33cc7ae82036c010812f8a5849f445da776047a07a9cdcf8359b84a0279bf77068b23e1b707a42a6d90e
|
7
|
+
data.tar.gz: ad9bce77b87ed40340f2a3c491f17d722dab9d0922e11d34f0d1ebf94b5d2aca9218c7d8ba22bdea2ebf3e30f13f14a650049d1548b4f7b989efebf986d27966
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,28 @@
|
|
2
2
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
|
5
|
+
## [2.0.1]
|
6
|
+
|
7
|
+
- Don't show empty mailer classes in sidebar (#51)
|
8
|
+
|
9
|
+
## [2.0.0]
|
10
|
+
|
11
|
+
- Email versions (#49)
|
12
|
+
- Drop official support for EOL Rails versions: 5.1, 5.0 and 4.2
|
13
|
+
- Drop official support for EOL Rubies: 2.4
|
14
|
+
|
15
|
+
## [1.0.0]
|
16
|
+
|
17
|
+
- Avoid the dependency on Sprockets (#48)
|
18
|
+
|
19
|
+
## [0.12.3]
|
20
|
+
|
21
|
+
- Styles: fix input placeholder color in Firefox
|
22
|
+
|
23
|
+
## [0.12.2]
|
24
|
+
|
25
|
+
- Refine logo and UI (#45)
|
26
|
+
|
5
27
|
## [0.12.1]
|
6
28
|
|
7
29
|
- Sprockets v4 fixes (#44)
|
@@ -131,6 +153,11 @@ All notable changes to this project will be documented in this file.
|
|
131
153
|
|
132
154
|
- First real usable release :tada:
|
133
155
|
|
156
|
+
[2.0.1]: https://github.com/markets/maily/compare/v2.0.0...v2.0.1
|
157
|
+
[2.0.0]: https://github.com/markets/maily/compare/v1.0.0...v2.0.0
|
158
|
+
[1.0.0]: https://github.com/markets/maily/compare/v0.12.3...v1.0.0
|
159
|
+
[0.12.3]: https://github.com/markets/maily/compare/v0.12.2...v0.12.3
|
160
|
+
[0.12.2]: https://github.com/markets/maily/compare/v0.12.1...v0.12.2
|
134
161
|
[0.12.1]: https://github.com/markets/maily/compare/v0.12.0...v0.12.1
|
135
162
|
[0.12.0]: https://github.com/markets/maily/compare/v0.11.0...v0.12.0
|
136
163
|
[0.11.0]: https://github.com/markets/maily/compare/v0.10.1...v0.11.0
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
</p>
|
5
5
|
<p align="center">
|
6
6
|
<a href="https://rubygems.org/gems/maily"><img src="https://img.shields.io/gem/v/maily.svg?style=flat-square"></a>
|
7
|
-
<a href="https://travis-ci.
|
7
|
+
<a href="https://travis-ci.com/markets/maily"><img src="https://travis-ci.com/markets/maily.svg?branch=master"></a>
|
8
8
|
<a href="https://codeclimate.com/github/markets/maily/maintainability"><img src="https://api.codeclimate.com/v1/badges/fff01b2137fd73070b14/maintainability"></a>
|
9
9
|
<a href="https://github.com/markets/maily/blob/master/MIT-LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/markets/maily.svg?style=flat-square"></a>
|
10
10
|
</p>
|
@@ -20,10 +20,10 @@ Maily automatically picks up all your emails and make them accessible from a kin
|
|
20
20
|
* Visual preview in the browser (attachments as well)
|
21
21
|
* Template edition (only in development)
|
22
22
|
* Email delivery
|
23
|
-
*
|
23
|
+
* Easy way (aka `Hooks`) to define and customize data for emails
|
24
|
+
* Email versions
|
24
25
|
* Flexible authorization system
|
25
26
|
* Minimalistic and clean interface
|
26
|
-
* Easy way (aka `hooks`) to define and customize data for emails
|
27
27
|
* Generator to handle a comfortable installation
|
28
28
|
|
29
29
|

|
@@ -50,27 +50,20 @@ This generator runs some tasks for you:
|
|
50
50
|
|
51
51
|
## Initialization and configuration
|
52
52
|
|
53
|
-
You should
|
54
|
-
|
55
|
-
```ruby
|
56
|
-
Maily.enabled = ENV['MAILY_ENABLED']
|
57
|
-
|
58
|
-
Maily.enabled = Rails.env.production? ? false : true
|
59
|
-
```
|
60
|
-
|
61
|
-
Initializer sample (full options list):
|
53
|
+
You should use the `setup` method to configure and customize `Maily` settings:
|
62
54
|
|
63
55
|
```ruby
|
64
56
|
# config/initializers/maily.rb
|
57
|
+
|
65
58
|
Maily.setup do |config|
|
66
59
|
# On/off engine
|
67
|
-
# config.enabled = Rails.env.production?
|
60
|
+
# config.enabled = !Rails.env.production?
|
68
61
|
|
69
62
|
# Allow templates edition
|
70
|
-
# config.allow_edition = Rails.env.production?
|
63
|
+
# config.allow_edition = !Rails.env.production?
|
71
64
|
|
72
65
|
# Allow deliveries
|
73
|
-
# config.allow_delivery = Rails.env.production?
|
66
|
+
# config.allow_delivery = !Rails.env.production?
|
74
67
|
|
75
68
|
# Your application available_locales (or I18n.available_locales) by default
|
76
69
|
# config.available_locales = [:en, :es, :pt, :fr]
|
@@ -89,6 +82,13 @@ Maily.setup do |config|
|
|
89
82
|
end
|
90
83
|
```
|
91
84
|
|
85
|
+
You can use the following format too:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
Maily.enabled = ENV['MAILY_ENABLED']
|
89
|
+
Maily.allow_edition = false
|
90
|
+
```
|
91
|
+
|
92
92
|
### Templates edition (`allow_edition` option)
|
93
93
|
|
94
94
|
This feature was designed for the `development` environment. Since it's based on just a file edition, and while running in `production` mode, code is not reloaded between requests, Rails doesn't take into account your changes (without restarting the server). Actually, allowing arbitrary Ruby code evaluation is potentially dangerous, and that's not a good idea in `production`.
|
@@ -101,6 +101,7 @@ Most of emails need to populate some data to consume it and do interesting thing
|
|
101
101
|
|
102
102
|
```ruby
|
103
103
|
# lib/maily_hooks.rb
|
104
|
+
|
104
105
|
user = User.new(email: 'user@example.com')
|
105
106
|
lazy_user = -> { User.with_comments.first } # callable object, lazy evaluation
|
106
107
|
comment = Struct.new(:body).new('Lorem ipsum') # stub way
|
@@ -125,6 +126,20 @@ Maily.hooks_for('YourMailerClass') do |mailer|
|
|
125
126
|
end
|
126
127
|
```
|
127
128
|
|
129
|
+
### Email versions
|
130
|
+
|
131
|
+
You can add versions for special emails. This is useful in some cases where template content depends on the parameters you provide, for instance, a welcome message for trial accounts and gold accounts.
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
free_trial_account = -> { Account.free_trial.first }
|
135
|
+
gold_account = -> { Account.gold.first }
|
136
|
+
|
137
|
+
Maily.hooks_for('Notifier') do |mailer|
|
138
|
+
mailer.register_hook(:welcome, free_trial_account, version: 'Free trial account')
|
139
|
+
mailer.register_hook(:welcome, gold_account, version: 'Gold account')
|
140
|
+
end
|
141
|
+
```
|
142
|
+
|
128
143
|
### Email description
|
129
144
|
|
130
145
|
You can add a description to any email and it will be displayed along with its preview. This is useful in some cases like: someone from another team, for example, a marketing specialist, visiting Maily to review some texts and images; they can easily understand when this email is sent by the system.
|
@@ -209,7 +224,7 @@ Maily.http_authorization = { username: 'admin', password: 'secret' }
|
|
209
224
|
|
210
225
|
Rails 4.1 introduced a built-in mechanism to preview the application emails. It is in fact, a port of [basecamp/mail_view](https://github.com/basecamp/mail_view) gem to the core.
|
211
226
|
|
212
|
-
Alternatively, there are
|
227
|
+
Alternatively, there are more gems out there to get a similar functionality, but with different approaches and features. Like for example: [ryanb/letter_opener](https://github.com/ryanb/letter_opener), [sj26/mailcatcher](https://github.com/sj26/mailcatcher) or [glebm/rails_email_preview](https://github.com/glebm/rails_email_preview).
|
213
228
|
|
214
229
|
## Development
|
215
230
|
|
@@ -217,7 +232,30 @@ Any kind of feedback, bug report, idea or enhancement are really appreciated :ta
|
|
217
232
|
|
218
233
|
To contribute, just fork the repo, hack on it and send a pull request. Don't forget to add tests for behaviour changes and run the test suite:
|
219
234
|
|
220
|
-
|
235
|
+
```
|
236
|
+
> bundle exec rake
|
237
|
+
```
|
238
|
+
|
239
|
+
Run the test suite against all supported versions:
|
240
|
+
|
241
|
+
```
|
242
|
+
> bundle exec appraisal install
|
243
|
+
> bundle exec appraisal rake
|
244
|
+
```
|
245
|
+
|
246
|
+
Run specs against specific version:
|
247
|
+
|
248
|
+
```
|
249
|
+
> bundle exec appraisal rails-6.0 rake
|
250
|
+
```
|
251
|
+
|
252
|
+
### Demo
|
253
|
+
|
254
|
+
Start a sample Rails app ([source code](spec/dummy)) with `Maily` integrated:
|
255
|
+
|
256
|
+
```
|
257
|
+
> bundle exec rake web # PORT=4000 (default: 3000)
|
258
|
+
```
|
221
259
|
|
222
260
|
## License
|
223
261
|
|
Binary file
|
@@ -4,6 +4,17 @@ module Maily
|
|
4
4
|
|
5
5
|
layout 'maily/application'
|
6
6
|
|
7
|
+
def maily_params
|
8
|
+
_params = {}
|
9
|
+
|
10
|
+
[:mailer, :email, :version, :part, :locale, :version].each do |key|
|
11
|
+
_params[key] = params[key] if params[key].present?
|
12
|
+
end
|
13
|
+
|
14
|
+
_params
|
15
|
+
end
|
16
|
+
helper_method :maily_params
|
17
|
+
|
7
18
|
private
|
8
19
|
|
9
20
|
def maily_enabled?
|
@@ -43,7 +43,7 @@ module Maily
|
|
43
43
|
def update
|
44
44
|
@maily_email.update_template(params[:body], params[:part])
|
45
45
|
|
46
|
-
redirect_to maily_email_path(
|
46
|
+
redirect_to maily_email_path(maily_params), notice: 'Template updated!'
|
47
47
|
end
|
48
48
|
|
49
49
|
def deliver
|
@@ -51,7 +51,7 @@ module Maily
|
|
51
51
|
|
52
52
|
@email.deliver
|
53
53
|
|
54
|
-
redirect_to maily_email_path(
|
54
|
+
redirect_to maily_email_path(maily_params), notice: "Email sent to <b>#{params[:to]}</b>!"
|
55
55
|
end
|
56
56
|
|
57
57
|
private
|
@@ -66,7 +66,7 @@ module Maily
|
|
66
66
|
|
67
67
|
def load_mailer_and_email
|
68
68
|
mailer = Maily::Mailer.find(params[:mailer])
|
69
|
-
@maily_email = mailer.find_email(params[:email])
|
69
|
+
@maily_email = mailer.find_email(params[:email], params[:version])
|
70
70
|
|
71
71
|
if @maily_email
|
72
72
|
@email = @maily_email.call
|
@@ -14,8 +14,25 @@ module Maily
|
|
14
14
|
'selected_mail' if mailer.name == params[:mailer] && email.name == params[:email]
|
15
15
|
end
|
16
16
|
|
17
|
+
def version_list_class(email)
|
18
|
+
'selected_mail' if email.name == params[:email] && email.version == params[:version]
|
19
|
+
end
|
20
|
+
|
21
|
+
def logo
|
22
|
+
image_tag(file_to_base64('logo.png', 'image/png'))
|
23
|
+
end
|
24
|
+
|
17
25
|
def icon(name)
|
18
|
-
image_tag
|
26
|
+
image_tag(file_to_base64("icons/#{name}.svg", 'image/svg+xml'), class: :icon)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def file_to_base64(path, mime_type)
|
32
|
+
file = Maily::Engine.root.join('app/assets/images/maily').join(path)
|
33
|
+
base64_contents = Base64.strict_encode64(file.read)
|
34
|
+
|
35
|
+
"data:#{mime_type};base64,#{base64_contents}"
|
19
36
|
end
|
20
37
|
end
|
21
38
|
end
|
@@ -7,14 +7,21 @@ module Maily
|
|
7
7
|
def email_description(email)
|
8
8
|
return unless email.description
|
9
9
|
|
10
|
-
|
11
|
-
concat
|
10
|
+
tag.div(class: 'mail_description') do
|
11
|
+
concat tag.strong('Description ')
|
12
12
|
concat email.description
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def part_class(part)
|
17
|
-
'format_selected' if
|
17
|
+
'format_selected' if part == params[:part] || (part == 'html' && !params[:part])
|
18
|
+
end
|
19
|
+
|
20
|
+
def uniq_emails(email_list)
|
21
|
+
email_list.inject([]) do |memo, email|
|
22
|
+
memo << email unless memo.map(&:name).include?(email.name)
|
23
|
+
memo
|
24
|
+
end
|
18
25
|
end
|
19
26
|
end
|
20
27
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<%= email_description(@maily_email) %>
|
2
2
|
|
3
|
-
<%= form_tag(update_maily_email_path(
|
3
|
+
<%= form_tag(update_maily_email_path(maily_params), method: :put) do %>
|
4
4
|
<ul class="action_bar">
|
5
5
|
<li>
|
6
|
-
<%= link_to 'Show', maily_email_path(
|
6
|
+
<%= link_to 'Show', maily_email_path(maily_params) %>
|
7
7
|
</li>
|
8
8
|
|
9
9
|
<li class="splitter">|</li>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
<ul class="action_bar">
|
4
4
|
<li>
|
5
|
-
<%= link_to 'Edit', edit_maily_email_path(
|
5
|
+
<%= link_to 'Edit', edit_maily_email_path(maily_params) %>
|
6
6
|
</li>
|
7
7
|
|
8
8
|
<li class="languages">
|
@@ -21,7 +21,7 @@
|
|
21
21
|
<li class="splitter">|</li>
|
22
22
|
|
23
23
|
<li>
|
24
|
-
<%= form_tag(deliver_maily_email_path(
|
24
|
+
<%= form_tag(deliver_maily_email_path(maily_params), method: :post, class: 'mail_deliver') do %>
|
25
25
|
<ul>
|
26
26
|
<li>Send to</li>
|
27
27
|
<li><%= email_field_tag :to, nil, placeholder: "Enter email", required: true %></li>
|
@@ -31,6 +31,17 @@
|
|
31
31
|
</li>
|
32
32
|
</ul>
|
33
33
|
|
34
|
+
<% if @maily_email.has_versions? %>
|
35
|
+
<fieldset class="version_list_wrapper">
|
36
|
+
<legend>Versions</legend>
|
37
|
+
<ul class="version_list">
|
38
|
+
<% @maily_email.versions.each do |_version_key, version_email| %>
|
39
|
+
<li><%= link_to version_email.version.humanize, maily_email_path(maily_params.merge(version: version_email.version)), class: version_list_class(version_email) %></li>
|
40
|
+
<% end %>
|
41
|
+
</ul>
|
42
|
+
</fieldset>
|
43
|
+
<% end %>
|
44
|
+
|
34
45
|
<div class="mail_preview">
|
35
46
|
<ul class="mail_details">
|
36
47
|
<% if @email.subject %><li><b>Subject</b> <%= @email.subject %></li><% end %>
|
@@ -49,7 +60,7 @@
|
|
49
60
|
<% end %>
|
50
61
|
|
51
62
|
<% if @email.html_part || @email.text_part || @email.body.present? %>
|
52
|
-
<iframe class="mail_iframe" onload='resizeIframe(this)' src="<%= raw_maily_email_path(
|
63
|
+
<iframe class="mail_iframe" onload='resizeIframe(this)' src="<%= raw_maily_email_path(maily_params) %>" frameborder="1" width="100%"></iframe>
|
53
64
|
<% end %>
|
54
65
|
|
55
66
|
<% if @email.has_attachments? %>
|
@@ -60,7 +71,7 @@
|
|
60
71
|
<% @email.attachments.each do |attachment| %>
|
61
72
|
<li>
|
62
73
|
<%= icon 'paperclip' %>
|
63
|
-
<%= link_to attachment.filename, attachment_maily_email_path(
|
74
|
+
<%= link_to attachment.filename, attachment_maily_email_path(maily_params.merge(attachment: attachment.filename)) %>
|
64
75
|
</li>
|
65
76
|
<% end %>
|
66
77
|
</ul>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<% if flash[:alert].present? %>
|
2
|
-
<div class="alert
|
2
|
+
<div class="alert"><%= flash[:alert].html_safe %></div>
|
3
3
|
<% end %>
|
4
4
|
|
5
5
|
<% if flash[:notice].present? %>
|
6
|
-
<div class="alert
|
7
|
-
<% end %>
|
6
|
+
<div class="alert"><%= flash[:notice].html_safe %></div>
|
7
|
+
<% end %>
|
@@ -1,6 +1,9 @@
|
|
1
1
|
<header class="header">
|
2
2
|
<a href="<%= root_path %>" class="logo_link">
|
3
|
-
<%=
|
4
|
-
|
3
|
+
<%= logo %>
|
4
|
+
</a>
|
5
|
+
|
6
|
+
<a href="<%= main_app.root_path %>" class="back_to_app">
|
7
|
+
Back to app
|
5
8
|
</a>
|
6
9
|
</header>
|
@@ -1,12 +1,21 @@
|
|
1
1
|
<aside class="sidebar">
|
2
2
|
<% @mailers.each do |mailer| %>
|
3
|
+
<% next if mailer.total_emails.zero? %>
|
4
|
+
|
3
5
|
<section class="nav_list">
|
4
6
|
<h3 class="nav_title"><%= "#{mailer.name.humanize} (#{mailer.total_emails})" %></h3>
|
5
7
|
<ul>
|
6
|
-
<% mailer.emails_list.each do |email| %>
|
7
|
-
<li
|
8
|
+
<% uniq_emails(mailer.emails_list).each do |email| %>
|
9
|
+
<li>
|
10
|
+
<%= link_to maily_email_path(mailer: mailer.name, email: email.name, version: email.version), class: sidebar_class(mailer, email) do %>
|
11
|
+
<%= email.name.humanize %>
|
12
|
+
<% if email.has_versions? %>
|
13
|
+
<%= "(#{email.versions.count} #{'version'.pluralize(email.versions.count)})" %>
|
14
|
+
<% end %>
|
15
|
+
<% end %>
|
16
|
+
</li>
|
8
17
|
<% end %>
|
9
18
|
</ul>
|
10
19
|
</section>
|
11
20
|
<% end %>
|
12
|
-
</aside>
|
21
|
+
</aside>
|
@@ -0,0 +1,283 @@
|
|
1
|
+
<%
|
2
|
+
blue = "#59abc6"
|
3
|
+
grey = "#cccccc"
|
4
|
+
dark_blue = "#2f738a"
|
5
|
+
dark_grey = "#666666"
|
6
|
+
text_color = "#333333"
|
7
|
+
link_color = blue
|
8
|
+
hover_color = dark_blue
|
9
|
+
border_radius = "3px"
|
10
|
+
%>
|
11
|
+
|
12
|
+
<style>
|
13
|
+
/* Body */
|
14
|
+
body {
|
15
|
+
color: <%= text_color %>;
|
16
|
+
font-size: 1em;
|
17
|
+
font-family: "Helvetica Neue", Helvetica, sans-serif;
|
18
|
+
}
|
19
|
+
|
20
|
+
/* Links & Buttons */
|
21
|
+
a {
|
22
|
+
color: <%= link_color %>;
|
23
|
+
text-decoration: none;
|
24
|
+
}
|
25
|
+
a:hover {
|
26
|
+
color: <%= hover_color %>;
|
27
|
+
}
|
28
|
+
.button {
|
29
|
+
cursor: pointer;
|
30
|
+
box-sizing: border-box;
|
31
|
+
-moz-box-sizing: border-box;
|
32
|
+
padding: 0;
|
33
|
+
border: none;
|
34
|
+
background: none;
|
35
|
+
color: <%= link_color %>;
|
36
|
+
}
|
37
|
+
.button:hover {
|
38
|
+
color: <%= hover_color %>;
|
39
|
+
}
|
40
|
+
|
41
|
+
/* Inputs */
|
42
|
+
input {
|
43
|
+
font-size: 100%;
|
44
|
+
font-family: inherit;
|
45
|
+
height: 1.2em;
|
46
|
+
border: solid 1px <%= grey %>;
|
47
|
+
border-radius: <%= border_radius %>;
|
48
|
+
background: #ffffff
|
49
|
+
line-height: 1;
|
50
|
+
padding-left: 0.5em;
|
51
|
+
}
|
52
|
+
|
53
|
+
::-webkit-input-placeholder, ::-moz-placeholder {
|
54
|
+
font-weight: 300;
|
55
|
+
font-size: 0.9em;
|
56
|
+
color: <%= dark_grey %>;
|
57
|
+
}
|
58
|
+
|
59
|
+
/* Header */
|
60
|
+
header.header, footer.footer {
|
61
|
+
position: fixed;
|
62
|
+
left: 0;
|
63
|
+
z-index: 99;
|
64
|
+
width: 100%;
|
65
|
+
background-color: rgba(255, 255, 255, 0.95);
|
66
|
+
}
|
67
|
+
header.header {
|
68
|
+
padding: 0.6em;
|
69
|
+
top: 0;
|
70
|
+
box-shadow: 0 0.0625em 0.3125em rgba(0, 0, 0, 0.15);
|
71
|
+
}
|
72
|
+
header.header .logo_link {
|
73
|
+
margin-left: 1em;
|
74
|
+
}
|
75
|
+
header.header .logo_link img {
|
76
|
+
height: 45px;
|
77
|
+
}
|
78
|
+
header.header .back_to_app {
|
79
|
+
float: right;
|
80
|
+
margin-right: 2em;
|
81
|
+
margin-top: 1em;
|
82
|
+
}
|
83
|
+
|
84
|
+
/* Footer */
|
85
|
+
footer.footer {
|
86
|
+
padding: 0 1em;
|
87
|
+
bottom: 0;
|
88
|
+
box-shadow: 0 -0.0625em 0.3125em rgba(0, 0, 0, 0.15);
|
89
|
+
font-family: inherit;
|
90
|
+
font-size: 0.9em;
|
91
|
+
}
|
92
|
+
|
93
|
+
/* Main content */
|
94
|
+
.wrap_content {
|
95
|
+
display: inline-block;
|
96
|
+
box-sizing: border-box;
|
97
|
+
-moz-box-sizing: border-box;
|
98
|
+
padding: 6em 0.75em 4em;
|
99
|
+
width: 100%;
|
100
|
+
}
|
101
|
+
.content {
|
102
|
+
margin-right: 2em;
|
103
|
+
margin-left: 1em;
|
104
|
+
padding-left: 20%;
|
105
|
+
}
|
106
|
+
ul.action_bar, ul.version_list {
|
107
|
+
margin: 0 0 5px;
|
108
|
+
padding: 0;
|
109
|
+
list-style: none;
|
110
|
+
font-size: 1.2em;
|
111
|
+
}
|
112
|
+
ul.action_bar, ul.action_bar ul {
|
113
|
+
display: inline-block;
|
114
|
+
width: 100%;
|
115
|
+
}
|
116
|
+
ul.action_bar li, ul.action_bar ul li {
|
117
|
+
float: left;
|
118
|
+
margin-right: 0.5em;
|
119
|
+
}
|
120
|
+
ul.action_bar li:last-child, ul.action_bar ul li:last-child {
|
121
|
+
margin-right: 0;
|
122
|
+
}
|
123
|
+
ul.action_bar ul {
|
124
|
+
margin: 0;
|
125
|
+
padding: 0;
|
126
|
+
list-style: none;
|
127
|
+
}
|
128
|
+
ul.action_bar li.languages {
|
129
|
+
float: right;
|
130
|
+
}
|
131
|
+
ul.action_bar li.languages a {
|
132
|
+
font-size: 0.9em;
|
133
|
+
}
|
134
|
+
.version_list_wrapper {
|
135
|
+
box-sizing: border-box;
|
136
|
+
-moz-box-sizing: border-box;
|
137
|
+
border: solid 1px #cccccc;
|
138
|
+
border-radius: <%= border_radius %>;
|
139
|
+
margin: 2% 0;
|
140
|
+
}
|
141
|
+
ul.version_list {
|
142
|
+
font-size: 1em;
|
143
|
+
line-height: 1.5em;
|
144
|
+
}
|
145
|
+
li.splitter {
|
146
|
+
width: 1px;
|
147
|
+
border-left: 1px <%= grey %> solid;
|
148
|
+
text-indent: -999999em;
|
149
|
+
}
|
150
|
+
.mail_description {
|
151
|
+
margin-bottom: 2em;
|
152
|
+
}
|
153
|
+
.mail_deliver ul li {
|
154
|
+
float: left;
|
155
|
+
margin-right: 0.4em;
|
156
|
+
}
|
157
|
+
.mail_preview {
|
158
|
+
height: 100%;
|
159
|
+
box-sizing: border-box;
|
160
|
+
-moz-box-sizing: border-box;
|
161
|
+
padding: 1em;
|
162
|
+
border: solid 1px <%= grey %>;
|
163
|
+
border-radius: <%= border_radius %>;
|
164
|
+
}
|
165
|
+
.mail_preview .mail_details {
|
166
|
+
margin: 0 0 1em 0;
|
167
|
+
padding: 0;
|
168
|
+
color: <%= dark_grey %>;
|
169
|
+
list-style: none;
|
170
|
+
font-size: 0.9em;
|
171
|
+
}
|
172
|
+
.mail_preview .mail_details li {
|
173
|
+
line-height: 1em;
|
174
|
+
}
|
175
|
+
.mail_preview .mail_attachments {
|
176
|
+
padding: 1em 0 0 0;
|
177
|
+
border-top: solid 1px <%= grey %>;
|
178
|
+
color: <%= dark_grey %>;
|
179
|
+
list-style: none;
|
180
|
+
font-size: 0.9em;
|
181
|
+
}
|
182
|
+
.mail_preview .mail_attachments ul {
|
183
|
+
display: inline-block;
|
184
|
+
margin: 0;
|
185
|
+
padding: 0;
|
186
|
+
width: 100%;
|
187
|
+
list-style: none;
|
188
|
+
}
|
189
|
+
.mail_preview .mail_attachments ul li {
|
190
|
+
float: left;
|
191
|
+
margin: 1em 1em 0 0;
|
192
|
+
}
|
193
|
+
.mail_preview iframe.mail_iframe {
|
194
|
+
padding-top: 1em;
|
195
|
+
border: none;
|
196
|
+
border-top: solid 1px <%= grey %>;
|
197
|
+
border-radius: <%= border_radius %>;
|
198
|
+
min-height: 100px;
|
199
|
+
}
|
200
|
+
.welcome_message {
|
201
|
+
margin-top: 3em;
|
202
|
+
max-width: 80%;
|
203
|
+
}
|
204
|
+
.format_mail {
|
205
|
+
position: relative;
|
206
|
+
display: inline-block;
|
207
|
+
float: right;
|
208
|
+
margin: -2em 0 0 0;
|
209
|
+
padding: 0;
|
210
|
+
width: 6.5em;
|
211
|
+
list-style: none;
|
212
|
+
}
|
213
|
+
.format_mail li {
|
214
|
+
float: left;
|
215
|
+
}
|
216
|
+
.format_mail li a.format_selected {
|
217
|
+
color: <%= hover_color %>;
|
218
|
+
font-weight: bold;
|
219
|
+
}
|
220
|
+
.format_mail li + li {
|
221
|
+
margin: 0 0 0 0.4em;
|
222
|
+
padding: 0 0 0 0.4em;
|
223
|
+
border-left: solid 1px <%= grey %>;
|
224
|
+
}
|
225
|
+
.mail_updatearea {
|
226
|
+
position: relative;
|
227
|
+
overflow: visible;
|
228
|
+
min-height: 450px;
|
229
|
+
width: 100%;
|
230
|
+
height: 100%;
|
231
|
+
border: none;
|
232
|
+
}
|
233
|
+
|
234
|
+
/* Sidebar */
|
235
|
+
aside.sidebar {
|
236
|
+
float: left;
|
237
|
+
width: 20%;
|
238
|
+
max-height: 90vh;
|
239
|
+
overflow-y: scroll;
|
240
|
+
}
|
241
|
+
section.nav_list {
|
242
|
+
margin: 0 0 1em 0em;
|
243
|
+
}
|
244
|
+
section.nav_list .nav_title {
|
245
|
+
margin: 0 0 0.4em;
|
246
|
+
font-weight: 400;
|
247
|
+
font-size: 1.2em;
|
248
|
+
}
|
249
|
+
section.nav_list ul {
|
250
|
+
margin: 0;
|
251
|
+
padding: 0;
|
252
|
+
list-style: none;
|
253
|
+
}
|
254
|
+
section.nav_list ul li {
|
255
|
+
margin-bottom: 0.4em;
|
256
|
+
list-style: none;
|
257
|
+
}
|
258
|
+
section.nav_list a {
|
259
|
+
text-decoration: none;
|
260
|
+
font-size: 0.9em;
|
261
|
+
}
|
262
|
+
section.nav_list a.selected_mail, section.nav_list a:hover,
|
263
|
+
.version_list a.selected_mail, .version_list a:hover {
|
264
|
+
color: <%= hover_color %>;
|
265
|
+
font-weight: bold;
|
266
|
+
}
|
267
|
+
|
268
|
+
/* Alert messages */
|
269
|
+
.alert {
|
270
|
+
border-radius: <%= border_radius %>;
|
271
|
+
padding: 16px;
|
272
|
+
margin-bottom: 1.1em;
|
273
|
+
color: #ffffff;
|
274
|
+
background-color: <%= dark_blue %>;
|
275
|
+
}
|
276
|
+
|
277
|
+
/* Icons */
|
278
|
+
img.icon {
|
279
|
+
width: 20px;
|
280
|
+
font-size: 0.9em;
|
281
|
+
vertical-align: bottom;
|
282
|
+
}
|
283
|
+
</style>
|
@@ -1,12 +1,12 @@
|
|
1
1
|
Maily.setup do |config|
|
2
2
|
# On/off engine
|
3
|
-
# config.enabled = Rails.env.production?
|
3
|
+
# config.enabled = !Rails.env.production?
|
4
4
|
|
5
5
|
# Allow templates edition
|
6
|
-
# config.allow_edition = Rails.env.production?
|
6
|
+
# config.allow_edition = !Rails.env.production?
|
7
7
|
|
8
8
|
# Allow deliveries
|
9
|
-
# config.allow_delivery = Rails.env.production?
|
9
|
+
# config.allow_delivery = !Rails.env.production?
|
10
10
|
|
11
11
|
# Your application available_locales (or I18n.available_locales) by default
|
12
12
|
# config.available_locales = [:en, :es, :pt, :fr]
|
@@ -22,4 +22,4 @@ Maily.setup do |config|
|
|
22
22
|
|
23
23
|
# Customize welcome message
|
24
24
|
# config.welcome_message = "Welcome to our email testing platform. If you have any problem, please contact support team at support@example.com."
|
25
|
-
end
|
25
|
+
end
|
data/lib/maily.rb
CHANGED
@@ -10,9 +10,9 @@ module Maily
|
|
10
10
|
:base_controller, :http_authorization, :hooks_path, :welcome_message
|
11
11
|
|
12
12
|
def init!
|
13
|
-
self.enabled = Rails.env.production?
|
14
|
-
self.allow_edition = Rails.env.production?
|
15
|
-
self.allow_delivery = Rails.env.production?
|
13
|
+
self.enabled = !Rails.env.production?
|
14
|
+
self.allow_edition = !Rails.env.production?
|
15
|
+
self.allow_delivery = !Rails.env.production?
|
16
16
|
self.available_locales = Rails.application.config.i18n.available_locales || I18n.available_locales
|
17
17
|
self.base_controller = 'ActionController::Base'
|
18
18
|
self.http_authorization = nil
|
data/lib/maily/email.rb
CHANGED
@@ -1,6 +1,20 @@
|
|
1
1
|
module Maily
|
2
2
|
class Email
|
3
|
-
|
3
|
+
DEFAULT_VERSION = 'default'.freeze
|
4
|
+
|
5
|
+
attr_accessor :name, :mailer, :arguments, :template_path, :template_name, :description, :with_params, :version
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def name_with_version(name, version = nil)
|
9
|
+
_version = formatted_version(version)
|
10
|
+
[name, _version].join(':')
|
11
|
+
end
|
12
|
+
|
13
|
+
def formatted_version(version)
|
14
|
+
_version = version.presence || DEFAULT_VERSION
|
15
|
+
_version&.parameterize&.underscore
|
16
|
+
end
|
17
|
+
end
|
4
18
|
|
5
19
|
def initialize(name, mailer)
|
6
20
|
self.name = name
|
@@ -17,12 +31,8 @@ module Maily
|
|
17
31
|
end
|
18
32
|
|
19
33
|
def parameterized_mailer_klass
|
20
|
-
|
21
|
-
|
22
|
-
mailer_klass.with(params)
|
23
|
-
else
|
24
|
-
mailer_klass
|
25
|
-
end
|
34
|
+
params = with_params && with_params.transform_values { |param| param.respond_to?(:call) ? param.call : param }
|
35
|
+
mailer_klass.with(params)
|
26
36
|
end
|
27
37
|
|
28
38
|
def parameters
|
@@ -58,6 +68,8 @@ module Maily
|
|
58
68
|
def register_hook(*args)
|
59
69
|
if args.last.is_a?(Hash)
|
60
70
|
self.description = args.last.delete(:description)
|
71
|
+
self.with_params = args.last.delete(:with_params)
|
72
|
+
self.version = Maily::Email.formatted_version(args.last.delete(:version))
|
61
73
|
|
62
74
|
if tpl_path = args.last.delete(:template_path)
|
63
75
|
self.template_path = tpl_path
|
@@ -67,8 +79,6 @@ module Maily
|
|
67
79
|
self.template_name = tpl_name
|
68
80
|
end
|
69
81
|
|
70
|
-
self.with_params = args.last.delete(:with_params)
|
71
|
-
|
72
82
|
args.pop
|
73
83
|
end
|
74
84
|
|
@@ -109,5 +119,17 @@ module Maily
|
|
109
119
|
f.write(new_content)
|
110
120
|
end
|
111
121
|
end
|
122
|
+
|
123
|
+
def versions
|
124
|
+
regexp = Regexp.new("^#{self.name}:")
|
125
|
+
|
126
|
+
mailer.emails.select do |email_key, _email|
|
127
|
+
email_key.match?(regexp)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def has_versions?
|
132
|
+
versions.count > 1
|
133
|
+
end
|
112
134
|
end
|
113
135
|
end
|
data/lib/maily/engine.rb
CHANGED
data/lib/maily/mailer.rb
CHANGED
@@ -27,8 +27,9 @@ module Maily
|
|
27
27
|
all[mailer_name]
|
28
28
|
end
|
29
29
|
|
30
|
-
def find_email(email_name)
|
31
|
-
|
30
|
+
def find_email(email_name, version = nil)
|
31
|
+
key = Maily::Email.name_with_version(email_name, version)
|
32
|
+
emails[key]
|
32
33
|
end
|
33
34
|
|
34
35
|
def emails_list
|
@@ -40,13 +41,15 @@ module Maily
|
|
40
41
|
end
|
41
42
|
|
42
43
|
def register_hook(email_name, *args)
|
43
|
-
|
44
|
+
version = get_version(*args)
|
45
|
+
email = find_email(email_name, version) || add_email(email_name, version)
|
44
46
|
email && email.register_hook(*args)
|
45
47
|
end
|
46
48
|
|
47
49
|
def hide_email(*email_names)
|
48
50
|
email_names.each do |email_name|
|
49
|
-
|
51
|
+
_email_name = Maily::Email.name_with_version(email_name.to_s)
|
52
|
+
emails.delete(_email_name)
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
@@ -60,9 +63,17 @@ module Maily
|
|
60
63
|
end
|
61
64
|
end
|
62
65
|
|
63
|
-
def add_email(email_name)
|
66
|
+
def add_email(email_name, version = nil)
|
67
|
+
hide_email(email_name) if version
|
64
68
|
email = Maily::Email.new(email_name.to_s, self)
|
65
|
-
|
69
|
+
key = Maily::Email.name_with_version(email_name, version)
|
70
|
+
emails[key] = email
|
71
|
+
end
|
72
|
+
|
73
|
+
def get_version(*args)
|
74
|
+
return unless args.last.is_a?(Hash)
|
75
|
+
|
76
|
+
Maily::Email.formatted_version(args.last[:version])
|
66
77
|
end
|
67
78
|
end
|
68
79
|
end
|
data/lib/maily/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: maily
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- markets
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.2'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: sassc-rails
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rspec-rails
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,8 +66,6 @@ files:
|
|
80
66
|
- app/assets/images/maily/icons/globe.svg
|
81
67
|
- app/assets/images/maily/icons/paperclip.svg
|
82
68
|
- app/assets/images/maily/logo.png
|
83
|
-
- app/assets/stylesheets/maily/_variables.scss
|
84
|
-
- app/assets/stylesheets/maily/application.scss
|
85
69
|
- app/controllers/maily/application_controller.rb
|
86
70
|
- app/controllers/maily/emails_controller.rb
|
87
71
|
- app/helpers/maily/application_helper.rb
|
@@ -95,6 +79,7 @@ files:
|
|
95
79
|
- app/views/maily/shared/_header.html.erb
|
96
80
|
- app/views/maily/shared/_javascript.html.erb
|
97
81
|
- app/views/maily/shared/_sidebar.html.erb
|
82
|
+
- app/views/maily/shared/_stylesheet.html.erb
|
98
83
|
- config/routes.rb
|
99
84
|
- lib/generators/maily/install_generator.rb
|
100
85
|
- lib/generators/templates/initializer.rb
|
@@ -1,305 +0,0 @@
|
|
1
|
-
@import url("https://fonts.googleapis.com/css?family=Josefin+Sans:light");
|
2
|
-
|
3
|
-
@import "maily/variables";
|
4
|
-
|
5
|
-
/* Body */
|
6
|
-
body {
|
7
|
-
color: $textColor;
|
8
|
-
font-size: 1em;
|
9
|
-
font-family: "Helvetica Neue", Helvetica, sans-serif;
|
10
|
-
|
11
|
-
a {
|
12
|
-
color: $linkColor;
|
13
|
-
text-decoration: none;
|
14
|
-
&:hover {
|
15
|
-
color: darken($linkColor, 20%);
|
16
|
-
}
|
17
|
-
}
|
18
|
-
}
|
19
|
-
|
20
|
-
/* Inputs */
|
21
|
-
input {
|
22
|
-
font-size: 100%;
|
23
|
-
font-family: inherit;
|
24
|
-
height: 1.2em;
|
25
|
-
border: solid 1px $grey;
|
26
|
-
border-radius: 2px;
|
27
|
-
background: #fff;
|
28
|
-
line-height: 1;
|
29
|
-
}
|
30
|
-
|
31
|
-
::-webkit-input-placeholder {
|
32
|
-
padding: 0 .2em;
|
33
|
-
vertical-align: bottom;
|
34
|
-
font-weight: 300;
|
35
|
-
}
|
36
|
-
:-moz-placeholder { font-size: 0.6em; }
|
37
|
-
::-moz-placeholder { font-size: 0.6em; }
|
38
|
-
:-ms-input-placeholder { font-size: 0.6em; }
|
39
|
-
|
40
|
-
/* Header */
|
41
|
-
header.header, footer.footer {
|
42
|
-
position: fixed;
|
43
|
-
left: 0;
|
44
|
-
z-index: 99;
|
45
|
-
width: 100%;
|
46
|
-
background-color: rgba(255,255,255, .95);
|
47
|
-
}
|
48
|
-
|
49
|
-
header.header {
|
50
|
-
padding: 1em;
|
51
|
-
top: 0;
|
52
|
-
box-shadow: 0 .0625em .3125em rgba(0,0,0, .15);
|
53
|
-
|
54
|
-
.logo_link {
|
55
|
-
color: $textColor;
|
56
|
-
font: 400 2em/1 'Josefin Sans';
|
57
|
-
margin-left: 10px;
|
58
|
-
|
59
|
-
img, span {
|
60
|
-
vertical-align: text-bottom;
|
61
|
-
}
|
62
|
-
}
|
63
|
-
}
|
64
|
-
|
65
|
-
/* Footer */
|
66
|
-
footer.footer {
|
67
|
-
padding: 0 1em;
|
68
|
-
bottom: 0;
|
69
|
-
box-shadow: 0 -.0625em .3125em rgba(0,0,0, .15);
|
70
|
-
font-family: "Helvetica Neue", Helvetica, sans-serif;
|
71
|
-
font-size: .9em;
|
72
|
-
}
|
73
|
-
|
74
|
-
/* Main content */
|
75
|
-
.wrap_content {
|
76
|
-
display: inline-block;
|
77
|
-
box-sizing: border-box;
|
78
|
-
-moz-box-sizing: border-box;
|
79
|
-
padding: 6em .75em 4em;
|
80
|
-
width: 100%;
|
81
|
-
}
|
82
|
-
|
83
|
-
.content {
|
84
|
-
margin-right: 2em;
|
85
|
-
margin-left: 1em;
|
86
|
-
padding-left: 20%;
|
87
|
-
|
88
|
-
ul.action_bar {
|
89
|
-
margin: 0 0 5px;
|
90
|
-
padding: 0;
|
91
|
-
list-style: none;
|
92
|
-
font-size: 1.2em;
|
93
|
-
|
94
|
-
&, & ul {
|
95
|
-
display: inline-block;
|
96
|
-
width: 100%;
|
97
|
-
}
|
98
|
-
|
99
|
-
li, ul li {
|
100
|
-
float: left;
|
101
|
-
margin-right: .5em;
|
102
|
-
&:last-child { margin-right: 0; }
|
103
|
-
}
|
104
|
-
|
105
|
-
ul {
|
106
|
-
margin: 0;
|
107
|
-
padding: 0;
|
108
|
-
list-style: none;
|
109
|
-
}
|
110
|
-
|
111
|
-
li.languages {
|
112
|
-
float: right;
|
113
|
-
}
|
114
|
-
}
|
115
|
-
|
116
|
-
li.splitter {
|
117
|
-
width: 1px;
|
118
|
-
border-left: 1px $grey solid;
|
119
|
-
text-indent: -999999em;
|
120
|
-
}
|
121
|
-
|
122
|
-
.mail_description {
|
123
|
-
margin-bottom: 2em;
|
124
|
-
}
|
125
|
-
|
126
|
-
.mail_deliver {
|
127
|
-
ul {
|
128
|
-
li {
|
129
|
-
float: left;
|
130
|
-
margin-right: .4em;
|
131
|
-
}
|
132
|
-
}
|
133
|
-
}
|
134
|
-
|
135
|
-
.mail_preview {
|
136
|
-
height: 100%;
|
137
|
-
box-sizing: border-box;
|
138
|
-
-moz-box-sizing: border-box;
|
139
|
-
padding: 1em;
|
140
|
-
border: solid 1px $grey;
|
141
|
-
border-radius: 3px;
|
142
|
-
|
143
|
-
.mail_details {
|
144
|
-
margin: 0 0 1em 0;
|
145
|
-
padding: 0;
|
146
|
-
color: $darkgrey;
|
147
|
-
list-style: none;
|
148
|
-
font-size: .8em;
|
149
|
-
|
150
|
-
li { line-height: 1.5em; }
|
151
|
-
}
|
152
|
-
|
153
|
-
.mail_attachments {
|
154
|
-
padding: 1em 0 0 0;
|
155
|
-
border-top: solid 1px $grey;
|
156
|
-
color: $darkgrey;
|
157
|
-
list-style: none;
|
158
|
-
font-size: .8em;
|
159
|
-
|
160
|
-
ul {
|
161
|
-
display: inline-block;
|
162
|
-
margin: 0;
|
163
|
-
padding: 0;
|
164
|
-
width: 100%;
|
165
|
-
list-style: none;
|
166
|
-
|
167
|
-
li {
|
168
|
-
float: left;
|
169
|
-
margin: 1em 1em 0 0;
|
170
|
-
}
|
171
|
-
}
|
172
|
-
}
|
173
|
-
|
174
|
-
iframe.mail_iframe {
|
175
|
-
padding-top: 1em;
|
176
|
-
border: none;
|
177
|
-
border-top: solid 1px $grey;
|
178
|
-
border-radius: 2px;
|
179
|
-
min-height: 100px;
|
180
|
-
}
|
181
|
-
}
|
182
|
-
|
183
|
-
.welcome_message {
|
184
|
-
margin-top: 3em;
|
185
|
-
max-width: 80%;
|
186
|
-
}
|
187
|
-
|
188
|
-
.button {
|
189
|
-
box-sizing: border-box;
|
190
|
-
-moz-box-sizing: border-box;
|
191
|
-
padding: 0;
|
192
|
-
border: none;
|
193
|
-
background: none;
|
194
|
-
color: $linkColor;
|
195
|
-
&:hover {
|
196
|
-
color: darken($linkColor, 20%);
|
197
|
-
}
|
198
|
-
}
|
199
|
-
|
200
|
-
.format_mail {
|
201
|
-
position: relative;
|
202
|
-
display: inline-block;
|
203
|
-
float: right;
|
204
|
-
margin: -2em 0 0 0;
|
205
|
-
padding: 0;
|
206
|
-
width: 6.5em;
|
207
|
-
list-style: none;
|
208
|
-
|
209
|
-
li {
|
210
|
-
float: left;
|
211
|
-
|
212
|
-
a.format_selected {
|
213
|
-
color: darken($linkColor, 20%);
|
214
|
-
font-weight: bold;
|
215
|
-
}
|
216
|
-
|
217
|
-
+ li {
|
218
|
-
margin: 0 0 0 .4em;
|
219
|
-
padding: 0 0 0 .4em;
|
220
|
-
border-left: solid 1px $grey;
|
221
|
-
}
|
222
|
-
}
|
223
|
-
}
|
224
|
-
|
225
|
-
.mail_updatearea {
|
226
|
-
position: relative;
|
227
|
-
overflow: visible;
|
228
|
-
min-height: 450px;
|
229
|
-
width: 100%;
|
230
|
-
height: 100%;
|
231
|
-
border: none;
|
232
|
-
}
|
233
|
-
}
|
234
|
-
|
235
|
-
/* Sidebar */
|
236
|
-
aside.sidebar {
|
237
|
-
float: left;
|
238
|
-
width: 20%;
|
239
|
-
max-height: 90vh;
|
240
|
-
overflow-y: scroll;
|
241
|
-
|
242
|
-
section.nav_list {
|
243
|
-
margin: 0 0 1.5em 1.5em;
|
244
|
-
|
245
|
-
.nav_title {
|
246
|
-
margin: 0 0 .4em;
|
247
|
-
font-weight: 400;
|
248
|
-
font-size: 1.2em;
|
249
|
-
}
|
250
|
-
|
251
|
-
ul {
|
252
|
-
margin: 0;
|
253
|
-
padding: 0;
|
254
|
-
list-style: none;
|
255
|
-
|
256
|
-
li {
|
257
|
-
margin-bottom: .4em;
|
258
|
-
list-style: none;
|
259
|
-
|
260
|
-
a {
|
261
|
-
color: $linkColor;
|
262
|
-
text-decoration: none;
|
263
|
-
font-size: .9em;
|
264
|
-
|
265
|
-
&.selected_mail {
|
266
|
-
color: darken($linkColor, 20%);
|
267
|
-
font-weight: bold;
|
268
|
-
|
269
|
-
&:before {
|
270
|
-
content: "\003E";
|
271
|
-
font-weight: bolder;
|
272
|
-
font-size: 1.2em;
|
273
|
-
margin-right: 2px;
|
274
|
-
}
|
275
|
-
}
|
276
|
-
&:hover {
|
277
|
-
color: darken($linkColor, 20%);
|
278
|
-
}
|
279
|
-
}
|
280
|
-
}
|
281
|
-
}
|
282
|
-
}
|
283
|
-
}
|
284
|
-
|
285
|
-
/* Alert messages */
|
286
|
-
.alert {
|
287
|
-
border-radius: 3px;
|
288
|
-
padding: 16px;
|
289
|
-
margin-bottom: 1.1em;
|
290
|
-
}
|
291
|
-
.alert-warning {
|
292
|
-
color: $red;
|
293
|
-
background-color: lighten($red, 40%);
|
294
|
-
}
|
295
|
-
.alert-success {
|
296
|
-
color: #fff;
|
297
|
-
background-color: darken($blue, 20%);
|
298
|
-
}
|
299
|
-
|
300
|
-
/* Icons */
|
301
|
-
img.icon {
|
302
|
-
width: 20px;
|
303
|
-
font-size: .9em;
|
304
|
-
vertical-align: bottom;
|
305
|
-
}
|