maily 0.1.0 → 0.3.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.
- data/.gitignore +1 -0
- data/MIT-LICENSE +1 -1
- data/README.md +46 -7
- data/app/assets/images/maily/fonts/JosefinSans-Light.ttf +0 -0
- data/app/assets/images/maily/icons/maily.eot +0 -0
- data/app/assets/images/maily/icons/maily.svg +90 -0
- data/app/assets/images/maily/icons/maily.ttf +0 -0
- data/app/assets/images/maily/icons/maily.woff +0 -0
- data/app/assets/javascripts/maily/application.js +0 -14
- data/app/assets/javascripts/maily/html5shiv.js +8 -0
- data/app/assets/stylesheets/maily/application.scss +310 -0
- data/app/assets/stylesheets/maily/icons.css +199 -0
- data/app/assets/stylesheets/maily/normalize.css +406 -0
- data/app/controllers/maily/emails_controller.rb +14 -12
- data/app/helpers/maily/application_helper.rb +3 -0
- data/app/helpers/maily/emails_helper.rb +3 -0
- data/app/views/layouts/maily/application.html.erb +10 -4
- data/app/views/maily/emails/edit.html.erb +19 -10
- data/app/views/maily/emails/index.html.erb +2 -9
- data/app/views/maily/emails/show.html.erb +59 -36
- data/app/views/maily/shared/_footer.html.erb +3 -0
- data/app/views/maily/shared/_header.html.erb +3 -0
- data/app/views/maily/shared/_sidebar.html.erb +12 -0
- data/config/routes.rb +6 -6
- data/lib/generators/maily/install_generator.rb +9 -8
- data/lib/generators/templates/initializer.rb +6 -8
- data/lib/maily.rb +7 -1
- data/lib/maily/email.rb +39 -5
- data/lib/maily/mailer.rb +1 -1
- data/lib/maily/version.rb +1 -1
- data/maily.gemspec +2 -2
- data/screenshot.png +0 -0
- metadata +17 -6
- data/Gemfile.lock +0 -99
- data/app/assets/stylesheets/maily/application.css +0 -13
@@ -1,12 +1,11 @@
|
|
1
1
|
module Maily
|
2
2
|
class EmailsController < ApplicationController
|
3
|
-
|
4
3
|
before_filter :allowed_action?, only: [:edit, :update, :deliver]
|
5
|
-
before_filter :
|
4
|
+
before_filter :load_mailers, only: [:index, :show, :edit]
|
5
|
+
before_filter :load_mailer_and_email, except: [:index]
|
6
6
|
around_filter :perform_with_locale, only: [:show, :raw, :deliver]
|
7
7
|
|
8
8
|
def index
|
9
|
-
@mailers = Maily::Mailer.all
|
10
9
|
end
|
11
10
|
|
12
11
|
def show
|
@@ -28,15 +27,13 @@ module Maily
|
|
28
27
|
end
|
29
28
|
|
30
29
|
def edit
|
31
|
-
@
|
30
|
+
@template = @maily_email.template(params[:part])
|
32
31
|
end
|
33
32
|
|
34
33
|
def update
|
35
|
-
@
|
36
|
-
f.write(params[:body])
|
37
|
-
end
|
34
|
+
@maily_email.update_template(params[:body], params[:part])
|
38
35
|
|
39
|
-
redirect_to maily_email_path(mailer: params[:mailer],
|
36
|
+
redirect_to maily_email_path(mailer: params[:mailer], email: params[:email], part: params[:part])
|
40
37
|
end
|
41
38
|
|
42
39
|
def deliver
|
@@ -44,7 +41,7 @@ module Maily
|
|
44
41
|
|
45
42
|
@email.deliver
|
46
43
|
|
47
|
-
redirect_to maily_email_path(mailer: params[:mailer],
|
44
|
+
redirect_to maily_email_path(mailer: params[:mailer], email: params[:email])
|
48
45
|
end
|
49
46
|
|
50
47
|
private
|
@@ -53,9 +50,14 @@ module Maily
|
|
53
50
|
Maily.allowed_action?(action_name) || raise("Maily: action #{action_name} not allowed!")
|
54
51
|
end
|
55
52
|
|
53
|
+
def load_mailers
|
54
|
+
@mailers = Maily::Mailer.all
|
55
|
+
end
|
56
|
+
|
56
57
|
def load_mailer_and_email
|
57
|
-
|
58
|
-
@
|
58
|
+
mailer = Maily::Mailer.find(params[:mailer])
|
59
|
+
@maily_email = mailer.find_email(params[:email])
|
60
|
+
@email = @maily_email.call
|
59
61
|
end
|
60
62
|
|
61
63
|
def perform_with_locale
|
@@ -64,4 +66,4 @@ module Maily
|
|
64
66
|
end
|
65
67
|
end
|
66
68
|
end
|
67
|
-
end
|
69
|
+
end
|
@@ -5,13 +5,19 @@
|
|
5
5
|
<%= stylesheet_link_tag "maily/application", :media => "all" %>
|
6
6
|
<%= javascript_include_tag "maily/application" %>
|
7
7
|
<%= csrf_meta_tags %>
|
8
|
+
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
9
|
+
<!--[if lt IE 9]>
|
10
|
+
<script src="/assets/javascripts/html5shiv.js"></script>
|
11
|
+
<![endif]-->
|
8
12
|
</head>
|
9
13
|
<body>
|
14
|
+
<%= render 'maily/shared/header' %>
|
10
15
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
<div class="wrap_content clearfix">
|
17
|
+
<%= render 'maily/shared/sidebar' %>
|
18
|
+
<%= yield %>
|
19
|
+
</div>
|
15
20
|
|
21
|
+
<%= render 'maily/shared/footer' %>
|
16
22
|
</body>
|
17
23
|
</html>
|
@@ -1,12 +1,21 @@
|
|
1
|
-
<
|
1
|
+
<div class="content">
|
2
|
+
<%= form_tag(update_maily_email_path(mailer: params[:mailer], email: params[:email], part: params[:part]), method: :put) do %>
|
3
|
+
<ul class="maily_action_bar">
|
4
|
+
<li>
|
5
|
+
<em class="icon-maily-eye"></em>
|
6
|
+
<%= link_to 'Show', maily_email_path(mailer: params[:mailer], email: params[:email]) %>
|
7
|
+
</li>
|
2
8
|
|
3
|
-
<
|
4
|
-
<%= link_to 'Return to list', root_path %> |
|
5
|
-
<%= link_to 'Show', maily_email_path(mailer: params[:mailer], method: params[:method]) %>
|
6
|
-
</p>
|
9
|
+
<li class="maily_splitter">|</li>
|
7
10
|
|
8
|
-
<
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
<li>
|
12
|
+
<em class="icon-maily-checkmark"></em>
|
13
|
+
<%= submit_tag 'Update', class: 'maily_button' %>
|
14
|
+
</li>
|
15
|
+
</ul>
|
16
|
+
|
17
|
+
<div class="maily_mail_preview">
|
18
|
+
<%= text_area_tag :body, @template, class:'maily_mail_updatearea' %>
|
19
|
+
</div>
|
20
|
+
<% end %>
|
21
|
+
</div>
|
@@ -1,10 +1,3 @@
|
|
1
|
-
<
|
1
|
+
<div class="content">
|
2
|
+
</div>
|
2
3
|
|
3
|
-
<ul>
|
4
|
-
<% @mailers.each do |mailer| %>
|
5
|
-
<h2><%= mailer.name.humanize %></h2>
|
6
|
-
<% mailer.emails.each do |email| %>
|
7
|
-
<li><%= link_to email.name.humanize, maily_email_path(mailer: mailer.name, method: email.name) %></li>
|
8
|
-
<% end %>
|
9
|
-
<% end %>
|
10
|
-
</ul>
|
@@ -1,43 +1,66 @@
|
|
1
|
-
<
|
1
|
+
<div class="content">
|
2
|
+
<ul class="maily_action_bar">
|
3
|
+
<li>
|
4
|
+
<em class="icon-maily-pencil"></em>
|
5
|
+
<%= link_to 'Edit', edit_maily_email_path(mailer: params[:mailer], email: params[:email], part: params[:part]) %>
|
6
|
+
</li>
|
2
7
|
|
3
|
-
<
|
4
|
-
|
5
|
-
|
6
|
-
|
8
|
+
<li class="maily_languages">
|
9
|
+
<% if Maily.available_locales.present? %>
|
10
|
+
<ul>
|
11
|
+
<li>
|
12
|
+
<em class="icon-maily-earth"></em>
|
13
|
+
Languages:</li>
|
14
|
+
<% Maily.available_locales.each do |locale| %>
|
15
|
+
<li><%= link_to locale.upcase, url_for(params.merge(locale: locale)) %></li>
|
16
|
+
<% end %>
|
17
|
+
</ul>
|
18
|
+
<% end %>
|
19
|
+
</li>
|
7
20
|
|
8
|
-
<
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
21
|
+
<li class="maily_splitter">|</li>
|
22
|
+
<li>
|
23
|
+
<%= form_tag(deliver_maily_email_path(mailer: params[:mailer], email: params[:email], locale: params[:locale]), method: :post, class: 'maily_send') do %>
|
24
|
+
<ul>
|
25
|
+
<li>Send to:</li>
|
26
|
+
<li><%= email_field_tag :to, nil, class: 'maily_textfield', placeholder: "Enter email", required: true %></li>
|
27
|
+
<li><%= submit_tag 'Send', class: 'maily_button' %></li>
|
28
|
+
</ul>
|
29
|
+
<% end %>
|
30
|
+
</li>
|
31
|
+
</ul>
|
14
32
|
|
15
|
-
<
|
16
|
-
<
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
</
|
33
|
+
<div class="maily_mail_preview">
|
34
|
+
<ul class="maily_mail_details">
|
35
|
+
<% if @email.subject %><li><b>Subject</b> <%= @email.subject %></li><% end %>
|
36
|
+
<% if @email.from %><li><b>From</b> <%= @email.from.join(', ') %></li><% end %>
|
37
|
+
<% if @email.to %><li><b>To</b> <%= @email.to.join(', ') %></li><% end %>
|
38
|
+
<% if @email.cc %><li><b>Cc</b> <%= @email.cc.join(', ') %></li><% end %>
|
39
|
+
<% if @email.bcc %><li><b>Bcc</b> <%= @email.bcc.join(', ') %></li><% end %>
|
40
|
+
</ul>
|
21
41
|
|
22
|
-
|
23
|
-
<ul>
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
<li>Bcc: <%= @email.bcc %></li>
|
29
|
-
</ul>
|
42
|
+
<% if @email.html_part && @email.text_part %>
|
43
|
+
<ul class="maily_format_mail">
|
44
|
+
<li><%= link_to 'HTML', url_for(params.merge(part: 'html')), class: part_class('html') %></li>
|
45
|
+
<li><%= link_to 'TEXT', url_for(params.merge(part: 'text')), class: part_class('text') %></li>
|
46
|
+
</ul>
|
47
|
+
<% end %>
|
30
48
|
|
31
|
-
|
32
|
-
|
33
|
-
<%= link_to 'TEXT', url_for(params.merge(part: 'text')) if @email.text_part %>
|
34
|
-
<% if @email.attachments.present? %>
|
35
|
-
<% @email.attachments.each do |attachment| %>
|
36
|
-
<%= link_to attachment.filename, attachment_maily_email_path(mailer: params[:mailer], method: params[:method], attachment: attachment.filename) %>
|
49
|
+
<% if @email.html_part || @email.text_part || @email.body.present? %>
|
50
|
+
<iframe class="maily_preview" src="<%= raw_maily_email_path(mailer: params[:mailer], email: params[:email], locale: params[:locale], part: params[:part]) %>" frameborder="1" height="100%" width="100%"></iframe>
|
37
51
|
<% end %>
|
38
|
-
<% end %>
|
39
|
-
</p>
|
40
52
|
|
41
|
-
<% if @email.
|
42
|
-
|
43
|
-
|
53
|
+
<% if @email.attachments.present? %>
|
54
|
+
<ul class="maily_mail_attachments">
|
55
|
+
<li>Attachments:</li>
|
56
|
+
<li>
|
57
|
+
<ul>
|
58
|
+
<% @email.attachments.each do |attachment| %>
|
59
|
+
<li><em class="icon-maily-attachment"></em><%= link_to attachment.filename, attachment_maily_email_path(mailer: params[:mailer], email: params[:email], attachment: attachment.filename) %></li>
|
60
|
+
<% end %>
|
61
|
+
</ul>
|
62
|
+
</li>
|
63
|
+
</ul>
|
64
|
+
<% end %>
|
65
|
+
</div>
|
66
|
+
</div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<aside class="sidebar">
|
2
|
+
<% @mailers.each do |mailer| %>
|
3
|
+
<section class="nav_list">
|
4
|
+
<h3 class="title nav_title"><%= mailer.name.humanize %></h3>
|
5
|
+
<ul>
|
6
|
+
<% mailer.emails.each do |email| %>
|
7
|
+
<li><%= link_to email.name.humanize, maily_email_path(mailer: mailer.name, email: email.name), class: sidebar_class(mailer, email) %></li>
|
8
|
+
<% end %>
|
9
|
+
</ul>
|
10
|
+
</section>
|
11
|
+
<% end %>
|
12
|
+
</aside>
|
data/config/routes.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
Maily::Engine.routes.draw do
|
2
|
-
get ':mailer/:
|
3
|
-
get ':mailer/:
|
4
|
-
get ':mailer/:
|
5
|
-
put ':mailer/:
|
6
|
-
post ':mailer/:
|
7
|
-
get ':mailer/:
|
2
|
+
get ':mailer/:email' => 'emails#show', as: :maily_email
|
3
|
+
get ':mailer/:email/raw' => 'emails#raw', as: :raw_maily_email
|
4
|
+
get ':mailer/:email/edit' => 'emails#edit', as: :edit_maily_email
|
5
|
+
put ':mailer/:email' => 'emails#update', as: :update_maily_email
|
6
|
+
post ':mailer/:email/deliver' => 'emails#deliver', as: :deliver_maily_email
|
7
|
+
get ':mailer/:email/attachment' => 'emails#attachment', as: :attachment_maily_email
|
8
8
|
|
9
9
|
root :to => 'emails#index'
|
10
10
|
end
|
@@ -7,6 +7,7 @@ module Maily
|
|
7
7
|
def install
|
8
8
|
generate_routing
|
9
9
|
build_initializer
|
10
|
+
build_hooks
|
10
11
|
end
|
11
12
|
|
12
13
|
private
|
@@ -17,26 +18,26 @@ module Maily
|
|
17
18
|
|
18
19
|
def build_initializer
|
19
20
|
template 'initializer.rb', 'config/initializers/maily.rb'
|
21
|
+
end
|
20
22
|
|
21
|
-
|
23
|
+
def build_hooks
|
22
24
|
fixtures = []
|
25
|
+
hooks = []
|
23
26
|
|
24
27
|
Maily::Mailer.all.each do |mailer|
|
25
|
-
hooks << "
|
28
|
+
hooks << "\nMaily.hooks_for('#{mailer.name.classify}') do |mailer|"
|
26
29
|
mailer.emails.each do |email|
|
27
30
|
if email.require_hook?
|
28
31
|
fixtures << email.required_arguments
|
29
|
-
hooks << "
|
32
|
+
hooks << " mailer.register_hook(:#{email.name}, #{email.required_arguments.join(', ')})"
|
30
33
|
end
|
31
34
|
end
|
32
|
-
hooks << "
|
35
|
+
hooks << "end"
|
33
36
|
end
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
"\n" + hooks.join("\n")
|
38
|
+
create_file "lib/maily_hooks.rb" do
|
39
|
+
fixtures.flatten.uniq.map{ |f| f = "#{f.to_s} = ''" }.join("\n") + "\n" + hooks.join("\n") + "\n"
|
38
40
|
end
|
39
|
-
|
40
41
|
end
|
41
42
|
end
|
42
43
|
end
|
@@ -1,18 +1,16 @@
|
|
1
|
-
Maily.
|
2
|
-
|
3
|
-
# Maily.setup do |config|
|
1
|
+
Maily.setup do |config|
|
4
2
|
# On/off engine. True by default
|
5
|
-
# config.enabled
|
3
|
+
# config.enabled = Rails.env.production? ? false : true
|
6
4
|
|
7
5
|
# Allow views edition. True by default
|
8
|
-
# config.allow_edition
|
6
|
+
# config.allow_edition = Rails.env.production? ? false : true
|
9
7
|
|
10
8
|
# Allow deliveries. True by default
|
11
|
-
# config.allow_delivery
|
9
|
+
# config.allow_delivery = Rails.env.production? ? false : true
|
12
10
|
|
13
11
|
# I18n.available_locales by default
|
14
12
|
# config.available_locales = [:en, :es, :pt, :fr]
|
15
13
|
|
16
14
|
# 'ActionController::Base' by default
|
17
|
-
# config.base_controller
|
18
|
-
|
15
|
+
# config.base_controller = 'FooController'
|
16
|
+
end
|
data/lib/maily.rb
CHANGED
@@ -16,12 +16,17 @@ module Maily
|
|
16
16
|
self.base_controller = 'ActionController::Base'
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def load_emails_and_hooks
|
20
|
+
# Load emails
|
20
21
|
Dir[Rails.root + 'app/mailers/*.rb'].each do |mailer|
|
21
22
|
klass = File.basename(mailer, '.rb')
|
22
23
|
methods = klass.camelize.constantize.send(:instance_methods, false)
|
23
24
|
Maily::Mailer.new(klass, methods)
|
24
25
|
end
|
26
|
+
|
27
|
+
# Load hooks
|
28
|
+
hooks_file_path = "#{Rails.root}/lib/maily_hooks.rb"
|
29
|
+
require hooks_file_path if File.exists?(hooks_file_path)
|
25
30
|
end
|
26
31
|
|
27
32
|
def hooks_for(mailer_name)
|
@@ -30,6 +35,7 @@ module Maily
|
|
30
35
|
end
|
31
36
|
|
32
37
|
def setup
|
38
|
+
init!
|
33
39
|
yield(self)
|
34
40
|
end
|
35
41
|
|
data/lib/maily/email.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module Maily
|
2
2
|
class Email
|
3
3
|
|
4
|
-
attr_accessor :name, :mailer, :arguments
|
4
|
+
attr_accessor :name, :mailer, :arguments, :template_path
|
5
5
|
|
6
6
|
def initialize(name, mailer)
|
7
|
-
self.name
|
8
|
-
self.mailer
|
9
|
-
self.arguments
|
7
|
+
self.name = name.to_s
|
8
|
+
self.mailer = mailer
|
9
|
+
self.arguments = nil
|
10
|
+
self.template_path = mailer
|
10
11
|
end
|
11
12
|
|
12
13
|
def require_hook?
|
@@ -18,7 +19,14 @@ module Maily
|
|
18
19
|
end
|
19
20
|
|
20
21
|
def register_hook(*args)
|
21
|
-
|
22
|
+
args = args.flatten
|
23
|
+
|
24
|
+
if args.last.is_a?(Hash) && new_path = args.last.delete(:template_path)
|
25
|
+
self.template_path = new_path
|
26
|
+
args.pop
|
27
|
+
end
|
28
|
+
|
29
|
+
self.arguments = args
|
22
30
|
end
|
23
31
|
|
24
32
|
def mailer_klass_name
|
@@ -32,5 +40,31 @@ module Maily
|
|
32
40
|
def call
|
33
41
|
mailer_klass.send(name, *arguments)
|
34
42
|
end
|
43
|
+
|
44
|
+
def base_path(part)
|
45
|
+
"#{Rails.root}/app/views/#{template_path}/#{name}.#{part}.erb"
|
46
|
+
end
|
47
|
+
|
48
|
+
def path(part = nil)
|
49
|
+
if part
|
50
|
+
base_path(part)
|
51
|
+
else
|
52
|
+
if File.exist?(path('html'))
|
53
|
+
base_path('html')
|
54
|
+
else
|
55
|
+
base_path('text')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def template(part = nil)
|
61
|
+
File.read(path(part))
|
62
|
+
end
|
63
|
+
|
64
|
+
def update_template(new_content, part = nil)
|
65
|
+
File.open(path(part), 'w') do |f|
|
66
|
+
f.write(new_content)
|
67
|
+
end
|
68
|
+
end
|
35
69
|
end
|
36
70
|
end
|