mail_manager 0.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.
Files changed (197) hide show
  1. checksums.yaml +15 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +20 -0
  4. data/.rspec +1 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/Gemfile +27 -0
  8. data/Guardfile +24 -0
  9. data/LICENSE.txt +22 -0
  10. data/MIT-LICENSE +20 -0
  11. data/Manifest.txt +141 -0
  12. data/Procfile +4 -0
  13. data/README +243 -0
  14. data/README.md +29 -0
  15. data/README.rdoc +3 -0
  16. data/Rakefile +33 -0
  17. data/app/.DS_Store +0 -0
  18. data/app/assets/javascripts/mail_manager/application.js +15 -0
  19. data/app/assets/stylesheets/mail_manager/application.css +13 -0
  20. data/app/controllers/mail_manager/application_controller.rb +4 -0
  21. data/app/controllers/mail_manager/base_controller.rb +22 -0
  22. data/app/controllers/mail_manager/bounces_controller.rb +32 -0
  23. data/app/controllers/mail_manager/contacts_controller.rb +75 -0
  24. data/app/controllers/mail_manager/mailing_lists_controller.rb +49 -0
  25. data/app/controllers/mail_manager/mailings_controller.rb +102 -0
  26. data/app/controllers/mail_manager/messages_controller.rb +30 -0
  27. data/app/controllers/mail_manager/subscriptions_controller.rb +104 -0
  28. data/app/helpers/mail_manager/application_helper.rb +4 -0
  29. data/app/helpers/mail_manager/subscriptions_helper.rb +8 -0
  30. data/app/models/.DS_Store +0 -0
  31. data/app/models/mail_manager.rb +12 -0
  32. data/app/models/mail_manager/bounce.rb +133 -0
  33. data/app/models/mail_manager/contact.rb +91 -0
  34. data/app/models/mail_manager/contactable_registry.rb +190 -0
  35. data/app/models/mail_manager/mailable_registry.rb +127 -0
  36. data/app/models/mail_manager/mailer.rb +267 -0
  37. data/app/models/mail_manager/mailing.rb +266 -0
  38. data/app/models/mail_manager/mailing_list.rb +36 -0
  39. data/app/models/mail_manager/message.rb +127 -0
  40. data/app/models/mail_manager/subscription.rb +126 -0
  41. data/app/models/mail_manager/test_message.rb +175 -0
  42. data/app/models/status_history.rb +60 -0
  43. data/app/views/layouts/mail_manager/application.html.erb +14 -0
  44. data/app/views/mail_manager/bounces/_email_parts.html.erb +30 -0
  45. data/app/views/mail_manager/bounces/index.html.erb +32 -0
  46. data/app/views/mail_manager/bounces/show.html.erb +38 -0
  47. data/app/views/mail_manager/contacts/_form.html.erb +27 -0
  48. data/app/views/mail_manager/contacts/double_opt_in.html.erb +1 -0
  49. data/app/views/mail_manager/contacts/edit.html.erb +12 -0
  50. data/app/views/mail_manager/contacts/index.html.erb +86 -0
  51. data/app/views/mail_manager/contacts/new.html.erb +9 -0
  52. data/app/views/mail_manager/contacts/show.html.erb +22 -0
  53. data/app/views/mail_manager/contacts/subscribe.html.erb +2 -0
  54. data/app/views/mail_manager/contacts/thank_you.html.erb +12 -0
  55. data/app/views/mail_manager/help/_available_email_substitutions.html.erb +5 -0
  56. data/app/views/mail_manager/mailer/double_opt_in.erb +6 -0
  57. data/app/views/mail_manager/mailer/unsubscribed.erb +5 -0
  58. data/app/views/mail_manager/mailer/unsubscribed.html.erb +5 -0
  59. data/app/views/mail_manager/mailing_lists/_form.html.erb +20 -0
  60. data/app/views/mail_manager/mailing_lists/edit.html.erb +13 -0
  61. data/app/views/mail_manager/mailing_lists/index.html.erb +39 -0
  62. data/app/views/mail_manager/mailing_lists/new.html.erb +9 -0
  63. data/app/views/mail_manager/mailing_lists/show.html.erb +13 -0
  64. data/app/views/mail_manager/mailings/_form.html.erb +81 -0
  65. data/app/views/mail_manager/mailings/edit.html.erb +12 -0
  66. data/app/views/mail_manager/mailings/index.html.erb +52 -0
  67. data/app/views/mail_manager/mailings/new.html.erb +9 -0
  68. data/app/views/mail_manager/mailings/show.html.erb +28 -0
  69. data/app/views/mail_manager/mailings/test.html.erb +12 -0
  70. data/app/views/mail_manager/messages/index.html.erb +37 -0
  71. data/app/views/mail_manager/subscriptions/_form.html.erb +37 -0
  72. data/app/views/mail_manager/subscriptions/_subscriptions.html.erb +13 -0
  73. data/app/views/mail_manager/subscriptions/edit.html.erb +11 -0
  74. data/app/views/mail_manager/subscriptions/index.html.erb +32 -0
  75. data/app/views/mail_manager/subscriptions/new.html.erb +9 -0
  76. data/app/views/mail_manager/subscriptions/show.html.erb +8 -0
  77. data/app/views/mail_manager/subscriptions/unsubscribe.html.erb +2 -0
  78. data/app/views/mail_manager/subscriptions/unsubscribe_by_email_address.html.erb +13 -0
  79. data/config/daemons.yml +5 -0
  80. data/config/routes.rb +43 -0
  81. data/db/migrate/001_mail_mgr_initial.rb +84 -0
  82. data/db/migrate/002_mail_mgr_create_contact.rb +60 -0
  83. data/db/migrate/003_mail_mgr_test_message.rb +23 -0
  84. data/db/migrate/004_add_deleted_at_to_mailing_lists.rb +15 -0
  85. data/db/migrate/005_contacts_deleted_at.rb +15 -0
  86. data/db/migrate/006_mail_mgr_mailing_list_add_defaults_to_active.rb +15 -0
  87. data/db/migrate/007_mail_mgr_message_add_from_email_address.rb +15 -0
  88. data/db/mlm_migrate/001_mlm_initial.rb +67 -0
  89. data/db/mlm_migrate/002_mailable_as_polymorphic.rb +27 -0
  90. data/db/mlm_migrate/003_contact_as_polymorphic.rb +64 -0
  91. data/db/mlm_migrate/004_bounce_mlm_mailing_id.rb +26 -0
  92. data/db/mlm_migrate/005_mlm_to_mail_mgr_scoped.rb +29 -0
  93. data/engine_plan.rb +13 -0
  94. data/features/bounce_management.feature +0 -0
  95. data/features/contact_management.feature +24 -0
  96. data/features/mailable.feature +23 -0
  97. data/features/mailing_management.feature +78 -0
  98. data/features/message.feature +11 -0
  99. data/features/step_definitions/email_steps.rb +50 -0
  100. data/features/step_definitions/mlm_steps.rb +11 -0
  101. data/features/step_definitions/pickle_steps.rb +41 -0
  102. data/features/step_definitions/webrat_steps.rb +115 -0
  103. data/features/subscription_management.feature +17 -0
  104. data/features/support/env.rb +31 -0
  105. data/features/support/paths.rb +44 -0
  106. data/lib/daemons/mail_manager.rb +38 -0
  107. data/lib/daemons/mail_manager_ctl +15 -0
  108. data/lib/deleteable.rb +50 -0
  109. data/lib/lock.rb +36 -0
  110. data/lib/mail_manager.rb +5 -0
  111. data/lib/mail_manager/config.rb +50 -0
  112. data/lib/mail_manager/engine.rb +43 -0
  113. data/lib/mail_manager/version.rb +3 -0
  114. data/lib/tasks/mail_manager.rake +143 -0
  115. data/lib/tasks/mail_manager_tasks.rake +4 -0
  116. data/lib/tasks/rspec.rake +165 -0
  117. data/lib/workers/mail_manager/bounce_job.rb +52 -0
  118. data/lib/workers/mail_manager/mailing_job.rb +30 -0
  119. data/lib/workers/mail_manager/message_job.rb +38 -0
  120. data/lib/workers/mail_manager/test_message_job.rb +37 -0
  121. data/mail_manager.gemspec +29 -0
  122. data/script/rails +8 -0
  123. data/spec/rcov.opts +2 -0
  124. data/spec/spec.opts +4 -0
  125. data/spec/spec_helper.rb +47 -0
  126. data/spec/test_app/README.rdoc +261 -0
  127. data/spec/test_app/Rakefile +7 -0
  128. data/spec/test_app/app/assets/javascripts/application.js +15 -0
  129. data/spec/test_app/app/assets/javascripts/users.js +2 -0
  130. data/spec/test_app/app/assets/stylesheets/application.css +13 -0
  131. data/spec/test_app/app/assets/stylesheets/scaffold.css +56 -0
  132. data/spec/test_app/app/assets/stylesheets/users.css +4 -0
  133. data/spec/test_app/app/controllers/application_controller.rb +3 -0
  134. data/spec/test_app/app/controllers/users_controller.rb +83 -0
  135. data/spec/test_app/app/helpers/application_helper.rb +2 -0
  136. data/spec/test_app/app/helpers/users_helper.rb +2 -0
  137. data/spec/test_app/app/models/user.rb +13 -0
  138. data/spec/test_app/app/views/layouts/application.html.erb +14 -0
  139. data/spec/test_app/app/views/users/_form.html.erb +33 -0
  140. data/spec/test_app/app/views/users/edit.html.erb +6 -0
  141. data/spec/test_app/app/views/users/index.html.erb +29 -0
  142. data/spec/test_app/app/views/users/new.html.erb +5 -0
  143. data/spec/test_app/app/views/users/show.html.erb +25 -0
  144. data/spec/test_app/config.ru +4 -0
  145. data/spec/test_app/config/application.rb +65 -0
  146. data/spec/test_app/config/boot.rb +10 -0
  147. data/spec/test_app/config/database.yml +25 -0
  148. data/spec/test_app/config/environment.rb +14 -0
  149. data/spec/test_app/config/environments/development.rb +37 -0
  150. data/spec/test_app/config/environments/production.rb +67 -0
  151. data/spec/test_app/config/environments/test.rb +37 -0
  152. data/spec/test_app/config/initializers/backtrace_silencers.rb +7 -0
  153. data/spec/test_app/config/initializers/inflections.rb +15 -0
  154. data/spec/test_app/config/initializers/mime_types.rb +5 -0
  155. data/spec/test_app/config/initializers/secret_token.rb +7 -0
  156. data/spec/test_app/config/initializers/session_store.rb +8 -0
  157. data/spec/test_app/config/initializers/wrap_parameters.rb +14 -0
  158. data/spec/test_app/config/locales/en.yml +5 -0
  159. data/spec/test_app/config/lockable.yml +3 -0
  160. data/spec/test_app/config/mail_manager.yml +21 -0
  161. data/spec/test_app/config/routes.rb +7 -0
  162. data/spec/test_app/db/migrate/20131217101010_create_users.rb +13 -0
  163. data/spec/test_app/db/migrate/20131221064151_mail_mgr_initial.rb +84 -0
  164. data/spec/test_app/db/migrate/20131221064152_mail_mgr_create_contact.rb +60 -0
  165. data/spec/test_app/db/migrate/20131221064153_mail_mgr_test_message.rb +23 -0
  166. data/spec/test_app/db/migrate/20131221064154_add_deleted_at_to_mailing_lists.rb +15 -0
  167. data/spec/test_app/db/migrate/20131221064155_contacts_deleted_at.rb +15 -0
  168. data/spec/test_app/db/migrate/20131221064156_mail_mgr_mailing_list_add_defaults_to_active.rb +15 -0
  169. data/spec/test_app/db/migrate/20131221064157_mail_mgr_message_add_from_email_address.rb +15 -0
  170. data/spec/test_app/db/migrate/20131221072600_create_delayed_jobs.rb +22 -0
  171. data/spec/test_app/db/schema.rb +131 -0
  172. data/spec/test_app/db/structure.sql +31 -0
  173. data/spec/test_app/public/404.html +26 -0
  174. data/spec/test_app/public/422.html +26 -0
  175. data/spec/test_app/public/500.html +25 -0
  176. data/spec/test_app/public/favicon.ico +0 -0
  177. data/spec/test_app/script/delayed_job +5 -0
  178. data/spec/test_app/script/lockable +36 -0
  179. data/spec/test_app/script/rails +6 -0
  180. data/spec/test_app/spec/controllers/users_controller_spec.rb +160 -0
  181. data/spec/test_app/spec/factories/mailing_lists.rb +7 -0
  182. data/spec/test_app/spec/factories/mailings.rb +6 -0
  183. data/spec/test_app/spec/factories/original_factories.rb.txt +107 -0
  184. data/spec/test_app/spec/factories/users.rb +10 -0
  185. data/spec/test_app/spec/models/mail_manager/bounce_spec.rb +17 -0
  186. data/spec/test_app/spec/models/mail_manager/mailing_list_spec.rb +15 -0
  187. data/spec/test_app/spec/models/user_spec.rb +37 -0
  188. data/spec/test_app/spec/requests/users_spec.rb +11 -0
  189. data/spec/test_app/spec/routing/users_routing_spec.rb +35 -0
  190. data/spec/test_app/spec/support/database_cleaner.rb +23 -0
  191. data/spec/test_app/spec/support/files/bad_utf8_chars.eml +32 -0
  192. data/spec/test_app/spec/views/users/edit.html.erb_spec.rb +24 -0
  193. data/spec/test_app/spec/views/users/index.html.erb_spec.rb +29 -0
  194. data/spec/test_app/spec/views/users/new.html.erb_spec.rb +24 -0
  195. data/spec/test_app/spec/views/users/show.html.erb_spec.rb +21 -0
  196. data/zeus.json +22 -0
  197. metadata +424 -0
@@ -0,0 +1,60 @@
1
+ =begin rdoc
2
+ Author:: Chris Hauboldt (mailto:biz@lnstar.com)
3
+ Copyright:: 2009 Lone Star Internet Inc.
4
+
5
+ Used to keep track of an objects status so that we can add more behaviour such as actual history of statuses if we so choose.
6
+
7
+ classes using this should define 'default_status', 'valid_statuses'
8
+
9
+ =end
10
+
11
+ module StatusHistory
12
+ # defines what happens when you change a status ... currently updates status and records a timestamp
13
+ def change_status(new_status,save_record=true)
14
+ raise "Invalid Status (#{new_status}) valid statuses: #{valid_statuses.join(',')}" unless self.class.valid_statuses.include?(new_status.to_s)
15
+ return if new_status.eql?(status)
16
+ self[:status] = new_status.to_s
17
+ self[:status_changed_at] = Time.now.utc
18
+ save if save_record
19
+ end
20
+
21
+ # default list of statuses ... in most cases should be overridden
22
+ def self.included(base)
23
+ Rails.logger.warn "Including statuses for #{base.class.name} #{base.name rescue "Blarg"}"
24
+ base.class_eval %Q|
25
+ # sets the initial status of an object if not set
26
+ class_attribute :valid_statuses, :default_status
27
+ def self.override_statuses(valid,default)
28
+ Rails.logger.debug "Overriding Statuses for " + self.class.name + " - " + (self.name rescue "Blarg") + ", " +
29
+ valid.inspect + ", " + default
30
+ self.valid_statuses = valid
31
+ self.default_status = default
32
+ end
33
+ override_statuses(['active', 'inactive', 'deleted'],'active')
34
+ |
35
+ end
36
+
37
+
38
+ def status
39
+ return self[:status].to_s unless self[:status].blank?
40
+ self[:status] = default_status
41
+ end
42
+
43
+ def status=(new_status)
44
+ return if status.eql?(new_status.to_s)
45
+ change_status(new_status)
46
+ end
47
+
48
+ def status_changed_at=(whatever)
49
+ raise "Invalid status change - use change_status(status) valid statuses: #{valid_statuses.join(',')}"
50
+ end
51
+
52
+ def set_default_status
53
+ return unless status.blank?
54
+ self[:status_changed_at] = Time.now.utc
55
+ self[:status] = default_status
56
+ Rails.logger.debug "Setting Default Status to #{default_status} #{self.name rescue "Not a class?"} #{self.class.name}"
57
+ self[:status]
58
+ end
59
+
60
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>MailManager</title>
5
+ <%= stylesheet_link_tag "mail_manager/application", :media => "all" %>
6
+ <%= javascript_include_tag "mail_manager/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,30 @@
1
+ <% if email.is_a?(Mail::Message)
2
+ this_part = email
3
+ elsif email.length > 0
4
+ begin
5
+ this_part = Mail.new(email)
6
+ rescue => e %>
7
+ <pre>
8
+ An error occured parsing this part of the email: <%= e.message %>
9
+ <%= e.backtrace.join("\n") %>
10
+ </pre>
11
+ <% end
12
+ end%>
13
+ <% unless this_part.nil? %>
14
+ <hr/>
15
+ <h3>Headers</h3>
16
+ <pre>
17
+ <%= this_part.header.inspect %>
18
+ </pre>
19
+ <% if this_part.header['content-type'].to_s =~ /text\/html/i %>
20
+ <h3>Body Part</h3>
21
+ <%= this_part.body %>
22
+ <% elsif this_part.header['content-type'].to_s =~ /text\/plain|message\/delivery-status|text\/rfc822-headers/i %>
23
+ <h3>Body Part</h3>
24
+ <pre><%= this_part.body %></pre>
25
+ <% end %>
26
+ <% this_part.parts.each do |part| %>
27
+ <%= render :partial => 'mail_manager/bounces/email_parts', :locals => {:email => part} %>
28
+ <% end
29
+ end %>
30
+
@@ -0,0 +1,32 @@
1
+ <% title "Listing Bounces for #{@mailing.try(:subject)}" %>
2
+
3
+
4
+ <%= form_tag mail_manager.bounces_path, :id => 'search_form', :method => 'GET' do %>
5
+ Mailing: <%= select_tag "mailing_id", options_for_select(@mailings.collect{|mailing| ["#{mailing.subject} (#{l mailing.status_changed_at}) (#{mailing.bounce_count})",mailing.id.to_s]},params[:mailing_id].to_i), :include_blank => true, :onChange => "$('#search_form').submit()" %></br>
6
+ Status:<%= select_tag "bounce[status]", options_for_select([['Needs Attention','needs_manual_intervention'],['Resolved','resolved']],params[:bounce][:status]), :include_blank => true, :onChange => "$('#search_form').submit()" %>
7
+ <% end %>
8
+ <% if @bounces.length == 0 %>
9
+ <h3>No bounces found for the Mailing with given status.</h3>
10
+ <% else %>
11
+
12
+ <p><%= will_paginate @bounces %></p>
13
+
14
+ <table class="list" cellpadding="1" cellspacing="0">
15
+ <tr class="title">
16
+ <td>Contact</td>
17
+ <td>Status changed at</td>
18
+ <td>Comments</td>
19
+ <td>&nbsp;</td>
20
+ </tr>
21
+ <% for bounce in @bounces %>
22
+ <tr class="<%= cycle('odd','even') %>">
23
+ <td><%=h bounce.contact_full_name %> <%=h bounce.contact_email_address %></td>
24
+ <td><%=l bounce.status_changed_at rescue nil %></td>
25
+ <td><%=h bounce.comments %></td>
26
+ <td><%= link_to "View", bounce, :class => 'button' %><div class="linkbuttonEnding"></div></td>
27
+ </tr>
28
+ <% end %>
29
+ </table>
30
+
31
+ <p><%= will_paginate @bounces %></p>
32
+ <% end %>
@@ -0,0 +1,38 @@
1
+
2
+ <h1>Viewing Bounce</h1>
3
+
4
+ <% if @bounce.status.eql?('needs_manual_intervention') %>
5
+ <div>
6
+ <%= link_to "Unsubscribe", mail_manager.fail_address_bounce_path(@bounce), :class => 'button' %><div class="linkbuttonEnding"></div>
7
+ &nbsp;
8
+ <%= link_to "Dismiss", mail_manager.dismiss_bounce_path(@bounce), :class => 'button' %><div class="linkbuttonEnding"></div>
9
+ </div>
10
+ <% end %>
11
+
12
+ <p>
13
+ <b>Status:</b>
14
+ <%=h @bounce.status %>
15
+ </p>
16
+
17
+ <p>
18
+ <b>Status changed at:</b>
19
+ <%=h @bounce.status_changed_at %>
20
+ </p>
21
+ <p>
22
+ <b>Comments:</b>
23
+ <%=h @bounce.comments %>
24
+ </p>
25
+
26
+ <p>
27
+ <b>Bounce Message:</b>
28
+ <hr/>
29
+ <%= render :partial => 'mail_manager/bounces/email_parts', :locals => {:email => @bounce.email} %>
30
+ <hr/>
31
+ </p>
32
+
33
+ <%= content_for :page_navigation do %>
34
+ <div>
35
+ <%= link_to "Back", mail_manager.bounces_path(:mailing_id => @mailing.try(:id),
36
+ :bounce => {:status => @bounce.status}), :class => 'button' %><div class="linkbuttonEnding"></div>
37
+ </div>
38
+ <% end %>
@@ -0,0 +1,27 @@
1
+ <%= form_for @contact do |f| %>
2
+ <%= f.error_messages %>
3
+ <table cellspacing='1' cellpadding='0' border='0' width="400">
4
+ <tr valign='top'>
5
+ <tr valign="top">
6
+ <td width='150'><%= f.label :first_name %></td>
7
+ <td><%= f.text_field :first_name %></td>
8
+ </tr>
9
+ <tr valign='top'>
10
+ <tr valign="top">
11
+ <td width='150'><%= f.label :last_name %></td>
12
+ <td><%= f.text_field :last_name %></td>
13
+ </tr>
14
+ <tr valign='top'>
15
+ <tr valign="top">
16
+ <td width='150'><%= f.label :email_address %></td>
17
+ <td><%= f.text_field :email_address %></td>
18
+ </tr>
19
+ </table>
20
+ <table cellspacing='1' cellpadding='0' border='0' width="400">
21
+ <%= contactable_subscriptions_selector(f) %>
22
+ <tr valign='top'>
23
+ <td align="right" colspan="2"><%= f.submit "Submit", :class => 'button' %><div class="buttonEnding"></div></td>
24
+ </tr>
25
+ </table>
26
+
27
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= @message %>
@@ -0,0 +1,12 @@
1
+ <% title "Edit Contact" %>
2
+
3
+ <%= render :partial => 'form' %>
4
+
5
+ <%= content_for :page_navigation do %>
6
+ <div>
7
+ <% if use_show_for_resources? %>
8
+ <%= link_to "Show", @contact, :class => 'button' %><div class="linkbuttonEnding"></div>
9
+ <% end %>
10
+ <%= link_to "View All", mail_manager.contacts_path, :class => 'button' %><div class="linkbuttonEnding"></div>
11
+ </div>
12
+ <% end %>
@@ -0,0 +1,86 @@
1
+ <% title "Contacts" %>
2
+
3
+
4
+ <%= form_tag mail_manager.contacts_path(), :id => 'search_form', :method => 'get' do %>
5
+ <label class="form">Contact Search:</label> <%= text_field_tag "term","", :class => "text"%>
6
+ <label class="form">Mailing List:</label><%= select_tag "mailing_list_id", options_for_select([['','']] + ::MailManager::MailingList.order(:name).map{|mailing_list|
7
+ [mailing_list.name, mailing_list.id]
8
+ }, params[:mailing_list_id].to_i), {onChange: "return toggleStatus()"} %>
9
+ <div id="subscription_status_selector" style="display: <%= params[:mailing_list_id].present? ? 'inline' : 'none' %>">
10
+ <label class="form">Status:</label><%= select_tag "status", options_for_select(['active','unsubscribed','failed_address','pending'].map{|status|
11
+ [status.humanize,status]}, params[:status]) %>
12
+ </div>
13
+ <%= submit_tag "Search", :class => 'button' %><div class="buttonEnding"></div>
14
+ <% end %>
15
+ <% content_for :head do %>
16
+ <script language="javascript">
17
+ function toggleStatus() {
18
+ if(jQuery('#mailing_list_id').val() != '') {
19
+ jQuery('#subscription_status_selector').show();
20
+ } else {
21
+ jQuery('#subscription_status_selector').hide();
22
+ }
23
+ }
24
+ </script>
25
+ <% end %>
26
+
27
+ <br/>
28
+ <b>Listing Contacts </b>
29
+
30
+ <%= will_paginate @contacts %>
31
+
32
+ <table class="list" cellpadding="1" cellspacing="0">
33
+ <tr class="title">
34
+ <td>First Name</td>
35
+ <td>Last Name</td>
36
+ <td>Email Address</td>
37
+ <% if params[:mailing_list_id].present? %> <td>Status</td> <% end %>
38
+ <% colspan = 2
39
+ colspan += 1 if use_show_for_resources? %>
40
+ <td colspan="<%= colspan %>"> </td>
41
+ </tr>
42
+ <% for contact in @contacts %>
43
+ <tr class="<%= cycle('odd','even') %>">
44
+ <td><%=h contact.first_name %></td>
45
+ <td><%=h contact.last_name %></td>
46
+ <td><%=h contact.email_address %></td>
47
+ <% if params[:mailing_list_id].present? %> <td><%= params[:status].humanize %></td> <% end %>
48
+ <% if use_show_for_resources? %>
49
+ <td><%= link_to "View", contact, :class => 'button' %><div class="linkbuttonEnding"></div></td>
50
+ <% end %>
51
+ <% if (contactable = contact.contactable).present? %>
52
+ <% if contactable.respond_to?(:is_deleted?) && contactable.is_deleted? %>
53
+ <td colspan="2"><%= contactable.class.name.humanize %> is Deleted</td>
54
+ <% else %>
55
+ <td colspan="2"><%= link_to( "Edit #{contact.contactable.class.name.humanize}", main_app.send(MailManager.edit_route_for(contactable),contactable)
56
+ ) rescue "No #{contact.contactable.class.name.humanize} Actions"
57
+ %>
58
+ </td>
59
+ <% end %>
60
+ <% else %>
61
+ <td><%= link_to "Edit", mail_manager.edit_contact_path(contact), :class => 'button' %><div class="linkbuttonEnding"></div></td>
62
+ <td><%= link_to "Delete", contact, :confirm => 'Are you sure?', :method => :delete, :class => 'button' %><div class="linkbuttonEnding"></div>
63
+ </td>
64
+ <% end %>
65
+ <!--
66
+ <-% if @mailings.length > 0 %>
67
+ <td>
68
+ <-% form_tag mail_manager.send_one_off_message_contact_path(contact), :style => 'display:inline' do |f| %>
69
+ <-%= select_tag 'mailing_id',
70
+ options_for_select(@mailings.collect{|mailing| [mailing.subject, mailing.id]}) %>
71
+ <-%= submit_tag "Send One Off Message", :class => 'button' %><div class="buttonEnding"></div>
72
+ <-% end %>
73
+ </td>
74
+ <-% end %>
75
+ -->
76
+ </tr>
77
+ <% end %>
78
+ </table>
79
+
80
+ <%= will_paginate @contacts %><br/>
81
+ <%= content_for :page_navigation do %>
82
+ <div>
83
+ <%= link_to "New Contact", mail_manager.new_contact_path, :class => 'button' %><div class="linkbuttonEnding"></div>
84
+ </div>
85
+ <% end %>
86
+
@@ -0,0 +1,9 @@
1
+ <% title "New Contact" %>
2
+
3
+ <%= render :partial => 'form' %>
4
+
5
+ <%= content_for :page_navigation do %>
6
+ <div>
7
+ <%= link_to "Back to List", mail_manager.contacts_path, :class => 'button' %><div class="linkbuttonEnding"></div>
8
+ </div>
9
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <% title "Contact" %>
2
+
3
+ <p>
4
+ <strong>First Name:</strong>
5
+ <%=h @contact.first_name %>
6
+ </p>
7
+ <p>
8
+ <strong>Last Name:</strong>
9
+ <%=h @contact.last_name %>
10
+ </p>
11
+ <p>
12
+ <strong>Email Address:</strong>
13
+ <%=h @contact.email_address %>
14
+ </p>
15
+
16
+ <%= content_for :page_navigation do %>
17
+ <div>
18
+ <%= link_to "Edit", mail_manager.edit_contact_path(@contact), :class => 'button' %><div class="linkbuttonEnding"></div>
19
+ <%= link_to "Delete", @contact, :confirm => 'Are you sure?', :method => :delete, :class => 'button' %><div class="linkbuttonEnding"></div>
20
+ <%= link_to "View All", mail_manager.contacts_path, :class => 'button' %><div class="linkbuttonEnding"></div>
21
+ </div>
22
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <% title "Thank You" %>
2
+ <p>Thank you for signing up for our newsletter. Please check your email and follow the instructions to confirm your subscription.</p>
@@ -0,0 +1,12 @@
1
+ <!-- InstanceBeginEditable name="content" -->
2
+
3
+ <img src="/images/logo.jpg" class="image" align="right" />
4
+
5
+ <h1>Thank You</h1>
6
+ <p>You have successfully subscribed to our email list.</p>
7
+ <p><a href="/index.html" class="link">Click here</a> to return to our home page.</p>
8
+
9
+
10
+ <!-- InstanceEndEditable -->
11
+ </div><!--content-->
12
+ </div><!--wrapper-->
@@ -0,0 +1,5 @@
1
+ <ul>
2
+ <% MailManager::ContactableRegistry.valid_contactable_substitutions.each do |substitution| %>
3
+ <li>#<%= substitution %>#<i>your default value</i></li>
4
+ % end %>
5
+ </ul>
@@ -0,0 +1,6 @@
1
+ Hello <%= @contact.full_name %>,
2
+
3
+ To complete your subscription to <%= @mailing_list_names %> at <%= site_url %> please follow the link below:
4
+
5
+ <%= @contact.double_opt_in_url %>
6
+
@@ -0,0 +1,5 @@
1
+ Hi <%= @contact.full_name %>,
2
+
3
+ You have successfully unsubscribed '<%= @contact.email_address %>' from '<%= @mailing_list.name %>'. This is merely a confirmation that the subscription has been ended.
4
+
5
+ Thank you.
@@ -0,0 +1,5 @@
1
+ <p>Hi <%= @contact.full_name %>,</p>
2
+
3
+ <p>You have successfully unsubscribed '<%= @contact.email_address %>' from '<%= @mailing_list.name %>'. This is merely a confirmation that the subscription has been ended.</p>
4
+
5
+ <p>Thank you.</p>
@@ -0,0 +1,20 @@
1
+ <%= form_for(@mailing_list) do |f| %>
2
+ <%= f.error_messages %>
3
+ <table cellspacing='1' cellpadding='0' border='0'>
4
+ <tr valign="top">
5
+ <td width='150'><%= f.label :name %></td>
6
+ <td><%= f.text_field :name %></td>
7
+ </tr>
8
+ <tr valign="top">
9
+ <td width='150'><%= f.label :description %></td>
10
+ <td><%= f.text_area :description %></td>
11
+ </tr>
12
+ <tr valign="top">
13
+ <td width='150'><%= f.label :defaults_to_active %></td>
14
+ <td><%= f.check_box :defaults_to_active %></td>
15
+ </tr>
16
+ <tr>
17
+ <td align="right" colspan="2"><%= f.submit "Submit", :class => 'button' %><div class="buttonEnding"></div></td>
18
+ </tr>
19
+ </table>
20
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <% title "Editing #{@mailing_list.name}" %>
2
+ <%= render :partial => 'form' %>
3
+
4
+ <% @page_title = "Editing #{@mailing_list.name}" %>
5
+
6
+ <%= content_for :page_navigation do %>
7
+ <div>
8
+ <% if use_show_for_resources? %>
9
+ <%= link_to "Show", @mailing, :class => 'button' %><div class="linkbuttonEnding"></div>
10
+ <% end %>
11
+ <%= link_to "Back", mail_manager.mailing_lists_path, :class => 'button' %><div class="linkbuttonEnding"></div>
12
+ </div>
13
+ <% end %>
@@ -0,0 +1,39 @@
1
+ <% title "Listing Mailing Lists" %>
2
+
3
+ <% if @mailing_lists.length > 0 %>
4
+
5
+ <table class="list" border="0" cellpadding="0" cellspacing="0">
6
+ <tr class="title">
7
+ <td>Name</td>
8
+ <td>Active</td>
9
+ <td>Unsubscribed</td>
10
+ <td>Failed</td>
11
+ <td>Pending</td>
12
+ <td> </td>
13
+ <td> </td>
14
+ <td> </td>
15
+ </tr>
16
+ <% @mailing_lists.each do |mailing_list| %>
17
+ <tr class="<%= cycle('odd','even') %>">
18
+ <td><%=h mailing_list.name %></td>
19
+ <td align="right"> <%= link_to(mailing_list.subscriptions.active.size, mail_manager.contacts_path(mailing_list_id: mailing_list.id, status: 'active')) %> </td>
20
+ <td align="right"> <%= link_to(mailing_list.subscriptions.unsubscribed.size, mail_manager.contacts_path(mailing_list_id: mailing_list.id, status: 'unsubscribed')) %> </td>
21
+ <td align="right"> <%= link_to(mailing_list.subscriptions.failed_address.size, mail_manager.contacts_path(mailing_list_id: mailing_list.id, status: 'failed_address')) %> </td>
22
+ <td align="right"> <%= link_to(mailing_list.subscriptions.pending.size, mail_manager.contacts_path(mailing_list_id: mailing_list.id, status: 'pending')) %> </td>
23
+ <td><%= link_to 'Edit', mail_manager.edit_mailing_list_path(mailing_list), :class => 'button' %><div class="linkbuttonEnding"></div></td>
24
+ <td><%= link_to 'Delete', mailing_list, :confirm => 'Are you sure?', :method => :delete, :class => 'button' %><div class="linkbuttonEnding"></div></td>
25
+ <td><%= link_to 'View Contacts', mail_manager.contacts_path(mailing_list_id: mailing_list.id), :class => 'button' %><div class="linkbuttonEnding"></div></td>
26
+ </tr>
27
+ <% end %>
28
+ </table>
29
+ <% else %>
30
+ No mailing lists exist.
31
+ <% end %>
32
+
33
+
34
+ <% @page_title = "Mailing Lists" %>
35
+ <%= content_for :page_navigation do %>
36
+ <div>
37
+ <%= link_to "New Mailing List", mail_manager.new_mailing_list_path, :class => 'button' %><div class="linkbuttonEnding"></div>
38
+ </div>
39
+ <% end %>