maily 0.1.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|