simple_email_preview 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +7 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +162 -0
  5. data/Rakefile +62 -0
  6. data/app/assets/images/simple_email_preview/favicon.png +0 -0
  7. data/app/assets/javascripts/simple_email_preview/application.js +1 -0
  8. data/app/assets/stylesheets/simple_email_preview/_bootstrap3.sass +68 -0
  9. data/app/assets/stylesheets/simple_email_preview/_default.sass +230 -0
  10. data/app/assets/stylesheets/simple_email_preview/application.scss +10 -0
  11. data/app/controllers/simple_email_preview/application_controller.rb +19 -0
  12. data/app/controllers/simple_email_preview/emails_controller.rb +194 -0
  13. data/app/helpers/simple_email_preview/emails_helper.rb +85 -0
  14. data/app/models/simple_email_preview/preview.rb +86 -0
  15. data/app/presenters/simple_email_preview/preview_list_presenter.rb +38 -0
  16. data/app/views/layouts/simple_email_preview/_flash_notices.html.erb +7 -0
  17. data/app/views/layouts/simple_email_preview/application.html.erb +16 -0
  18. data/app/views/layouts/simple_email_preview/email.html.erb +30 -0
  19. data/app/views/simple_email_preview/emails/_email_iframe.html.erb +88 -0
  20. data/app/views/simple_email_preview/emails/_format_nav.html.erb +4 -0
  21. data/app/views/simple_email_preview/emails/_headers.html.erb +10 -0
  22. data/app/views/simple_email_preview/emails/_headers_and_nav.html.erb +12 -0
  23. data/app/views/simple_email_preview/emails/_i18n_nav.html.erb +3 -0
  24. data/app/views/simple_email_preview/emails/_nav.html.erb +18 -0
  25. data/app/views/simple_email_preview/emails/_send_form.html.erb +11 -0
  26. data/app/views/simple_email_preview/emails/index.html.erb +36 -0
  27. data/app/views/simple_email_preview/emails/show.html.erb +23 -0
  28. data/config/i18n-tasks.yml +10 -0
  29. data/config/initializers/simple_email_preview.rb +14 -0
  30. data/config/locales/de.yml +47 -0
  31. data/config/locales/en.yml +47 -0
  32. data/config/locales/es.yml +47 -0
  33. data/config/locales/ja.yml +47 -0
  34. data/config/locales/ru.yml +51 -0
  35. data/config/routes.rb +23 -0
  36. data/lib/generators/simple_email_preview/install_generator.rb +17 -0
  37. data/lib/generators/simple_email_preview/update_previews_generator.rb +45 -0
  38. data/lib/simple_email_preview.rb +105 -0
  39. data/lib/simple_email_preview/delivery_handler.rb +15 -0
  40. data/lib/simple_email_preview/engine.rb +14 -0
  41. data/lib/simple_email_preview/main_app_route_delegator.rb +20 -0
  42. data/lib/simple_email_preview/version.rb +3 -0
  43. data/lib/simple_email_preview/view_hooks.rb +102 -0
  44. metadata +231 -0
@@ -0,0 +1,51 @@
1
+ ---
2
+ ru:
3
+ rep:
4
+ headers:
5
+ subject: "Тема"
6
+ from: "Отправитель"
7
+ to: "Получатель"
8
+ reply_to: "Ответ на"
9
+ cc: "Копия"
10
+ bcc: "Скрытая копия"
11
+ attachments: "Вложения"
12
+ base:
13
+ email:
14
+ one: "%{count} письмо"
15
+ few: "%{count} письма"
16
+ many: "%{count} писем"
17
+ other: "%{count} письма"
18
+ in: "в"
19
+ mailer:
20
+ one: "%{count}-й коллекции"
21
+ few: "%{count}-х коллекциях"
22
+ many: "%{count}-и коллекциях"
23
+ other: "%{count} коллекциях"
24
+ loading: "Письмо загружается..."
25
+ test_deliver:
26
+ no_delivery_method: "Настройте 'config.action_mailer.delivery_method', чтобы отправлять письма в среде '%{environment}'"
27
+ provide_email: "На какой адрес отправить?"
28
+ sent_notice: "Оправлено на %{address} через %{delivery_method}"
29
+ errors:
30
+ email_missing_format: "Формат отсутствует"
31
+ layouts:
32
+ simple_email_preview:
33
+ application:
34
+ head_title: "Письма - REP"
35
+ simple_email_preview:
36
+ emails:
37
+ index:
38
+ list_title: "Письма от приложения"
39
+ show:
40
+ breadcrumb_list: "Письма"
41
+ send_form:
42
+ send_are_you_sure: "Письмо будет по-настоящему отправлено. Продолжить?"
43
+ send_btn: "Отправить на"
44
+ send_recipient_placeholder: "Адрес эл. почты"
45
+ integrations:
46
+ cms:
47
+ errors:
48
+ site_missing: Сначала создайте сайт для %{locale} в CMS (отметьте опцию "Mirrored").
49
+ customize_cms_for_simple_email_preview:
50
+ edit_email: "Редактировать"
51
+ view_link: "Показать"
@@ -0,0 +1,23 @@
1
+ SimpleEmailPreview::Engine.routes.draw do
2
+ controller :emails do
3
+ scope path: '(:email_locale)',
4
+ # This constraint resolves ambiguity with :preview_id, allowing locale to be optional
5
+ constraints: { email_locale: /#{I18n.available_locales.map(&Regexp.method(:escape)) * '|'}/ },
6
+ defaults: { email_locale: I18n.default_locale.to_s } do
7
+ get '/' => :index, as: :rep_emails
8
+ scope path: ':preview_id', constraints: { preview_id: /\w+-\w+/ } do
9
+ scope '(:part_type)',
10
+ constraints: { part_type: /html|plain|raw/ },
11
+ defaults: { part_type: 'html' } do
12
+ get '' => :show, as: :rep_email
13
+ get 'body' => :show_body, as: :rep_raw_email
14
+ end
15
+ post 'deliver' => :test_deliver, as: :rep_test_deliver
16
+ get 'attachments/:filename' => :show_attachment, as: :rep_raw_email_attachment
17
+ get 'headers' => :show_headers, as: :rep_email_headers
18
+ end
19
+ # alias rep_emails_url to its stable api name
20
+ get '/' => :index, as: :rep_root
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ module SimpleEmailPreview
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ desc 'creates an initializer file at config/initializers/simple_email_preview.rb and adds REP route to config/routes.rb'
5
+ source_root File.expand_path('../../..', __dir__)
6
+
7
+ def generate_initialization
8
+ copy_file 'config/initializers/simple_email_preview.rb', 'config/initializers/simple_email_preview.rb'
9
+ end
10
+
11
+ def generate_routing
12
+ route "mount SimpleEmailPreview::Engine, at: 'emails'"
13
+ log "# You can access REP urls like this: simple_email_preview.rep_emails_url #=> '/emails'"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,45 @@
1
+ module SimpleEmailPreview
2
+ module Generators
3
+ class UpdatePreviewsGenerator < Rails::Generators::Base
4
+ desc 'creates app/mailer_previews/NEW_MAILER_preview.rb for each new mailer'
5
+ def generate_mailer_previews
6
+ previews_dir = 'app/mailer_previews/'
7
+ empty_directory previews_dir
8
+ Dir['app/mailers/*.rb'].each do |p|
9
+ basename = File.basename(p, '.rb')
10
+ if basename == 'application_mailer' || File.read(p) !~ /\bdef\s/
11
+ shell.say_status :skip, basename, :blue
12
+ next
13
+ end
14
+ preview_path = File.join(previews_dir, "#{basename}_preview.rb")
15
+ if File.exist?(preview_path)
16
+ shell.say_status :exist, preview_path, :blue
17
+ next
18
+ end
19
+ create_file preview_path, mailer_class_body(basename.camelize)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def mailer_class_body(mailer_class_name)
26
+ <<-RUBY
27
+ class #{mailer_class_name}Preview
28
+ #{(mailer_methods(mailer_class_name) * "\n\n").chomp}
29
+ end
30
+ RUBY
31
+ end
32
+
33
+ def mailer_methods(mailer_class_name)
34
+ mailer_class = mailer_class_name.constantize
35
+ ::SimpleEmailPreview::Preview.mail_methods(mailer_class).map do |m|
36
+ <<-RUBY
37
+ def #{m}
38
+ #{mailer_class_name}.#{m} #{mailer_class.instance_method(m).parameters.map(&:second) * ', '}
39
+ end
40
+ RUBY
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,105 @@
1
+
2
+ require 'simple_email_preview/engine'
3
+ require 'simple_email_preview/main_app_route_delegator'
4
+ require 'simple_email_preview/version'
5
+ require 'simple_email_preview/delivery_handler'
6
+ require 'simple_email_preview/view_hooks'
7
+
8
+ require 'sassc-rails'
9
+ require 'request_store'
10
+ require 'turbolinks'
11
+ require 'pathname'
12
+ require 'breadcrumbs_on_rails'
13
+ module SimpleEmailPreview
14
+ mattr_accessor :parent_controller
15
+ self.parent_controller = '::ApplicationController'
16
+
17
+ # preview class names
18
+ mattr_accessor :preview_classes
19
+
20
+ # UI locale
21
+ mattr_accessor :locale
22
+
23
+ # default email locale
24
+ mattr_accessor :default_email_locale
25
+
26
+ # send email button
27
+ mattr_accessor :enable_send_email
28
+ self.enable_send_email = true
29
+
30
+ # some easy visual settings
31
+ mattr_accessor :style
32
+ self.style = {
33
+ btn_active_class_modifier: 'rep--btn-active',
34
+ btn_danger_class: 'rep--btn rep--btn-danger',
35
+ btn_default_class: 'rep--btn rep--btn-default',
36
+ btn_group_class: 'rep--btn-group',
37
+ btn_primary_class: 'rep--btn rep--btn-primary',
38
+ form_control_class: 'rep--form-control',
39
+ list_group_class: 'rep--list-group',
40
+ list_group_item_class: 'rep--list-group__item',
41
+ row_class: 'rep--row'
42
+ }
43
+
44
+ @view_hooks = SimpleEmailPreview::ViewHooks.new
45
+ class << self
46
+ # @return [SimpleEmailPreview::ViewHooks]
47
+ attr_reader :view_hooks
48
+
49
+ def preview_classes=(classes)
50
+ @preview_classes = classes
51
+ SimpleEmailPreview::Preview.load_all(classes)
52
+ end
53
+
54
+ def find_preview_classes(dir)
55
+ return [] unless File.directory?(dir)
56
+ Dir.chdir(dir) { Dir['**/*_preview.rb'].map { |p| p.sub(/\.rb$/, '').camelize } }
57
+ end
58
+
59
+ def layout=(layout)
60
+ [::SimpleEmailPreview::ApplicationController, ::SimpleEmailPreview::EmailsController].each { |ctrl| ctrl.layout layout }
61
+ if layout && layout !~ %r{^simple_email_preview/}
62
+ # inline application routes if using an app layout
63
+ inline_main_app_routes!
64
+ end
65
+ end
66
+
67
+ def run_before_render(mail, preview)
68
+ (defined?(@hooks) && @hooks[:before_render] || []).each do |block|
69
+ block.call(mail, preview)
70
+ end
71
+ end
72
+
73
+ def before_render(&block)
74
+ inline_main_app_routes!
75
+ ((@hooks ||= {})[:before_render] ||= []) << block
76
+ end
77
+
78
+ def inline_main_app_routes!
79
+ unless ::SimpleEmailPreview::EmailsController.instance_variable_get(:@inlined_routes)
80
+ ::SimpleEmailPreview::EmailsController.helper ::SimpleEmailPreview::MainAppRouteDelegator
81
+ ::SimpleEmailPreview::EmailsController.instance_variable_set(:@inlined_routes, true)
82
+ end
83
+ end
84
+
85
+ def setup
86
+ yield self
87
+ end
88
+ end
89
+
90
+ # = Editing settings
91
+ # edit link is rendered inside an iframe, so these options are provided for simple styling
92
+ mattr_accessor :edit_link_text
93
+ self.edit_link_text = '✎ Edit Text'
94
+ mattr_accessor :edit_link_style
95
+ self.edit_link_style = <<-CSS.strip.gsub(/\n+/m, ' ')
96
+ display: block;
97
+ font-family: Monaco, Helvetica, sans-serif;
98
+ color: #7a4b8a;
99
+ border: 2px dashed #7a4b8a;
100
+ font-size: 20px;
101
+ padding: 8px 12px;
102
+ margin-top: 0.6em;
103
+ margin-bottom: 0.6em;
104
+ CSS
105
+ end
@@ -0,0 +1,15 @@
1
+ module SimpleEmailPreview
2
+ class DeliveryHandler
3
+ def initialize(mail, headers)
4
+ @mail = mail
5
+ @mail.headers(headers)
6
+ @mail.delivery_handler = self
7
+ end
8
+
9
+ attr_accessor :mail
10
+
11
+ def deliver_mail(_mail)
12
+ yield
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module ::SimpleEmailPreview
2
+ class Engine < Rails::Engine
3
+ isolate_namespace SimpleEmailPreview
4
+ load_generators
5
+
6
+ initializer 'simple_email_preview.setup_assets' do
7
+ SimpleEmailPreview::Engine.config.assets.precompile += %w[
8
+ simple_email_preview/application.js
9
+ simple_email_preview/application.css
10
+ simple_email_preview/favicon.png
11
+ ]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ module SimpleEmailPreview::MainAppRouteDelegator
2
+ # delegate url helpers to main_app
3
+ def method_missing(method, *args, &block)
4
+ if main_app_route_method?(method)
5
+ main_app.send(method, *args)
6
+ else
7
+ super
8
+ end
9
+ end
10
+
11
+ def respond_to?(method)
12
+ super || main_app_route_method?(method)
13
+ end
14
+
15
+ private
16
+
17
+ def main_app_route_method?(method)
18
+ method.to_s =~ /_(?:path|url)$/ && main_app.respond_to?(method)
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module SimpleEmailPreview
2
+ VERSION = '1.0.0'.freeze
3
+ end
@@ -0,0 +1,102 @@
1
+ module SimpleEmailPreview
2
+ # Add hooks before, after, or replacing a UI element
3
+ class ViewHooks
4
+ args = {
5
+ index: %i[list previews].freeze,
6
+ show: %i[mail preview].freeze
7
+ }
8
+ # All valid hooks and their argument names
9
+ SCHEMA = {
10
+ list: args[:index],
11
+ breadcrumb: args[:show],
12
+ breadcrumb_content: args[:show],
13
+ headers_and_nav: args[:show],
14
+ headers: args[:show],
15
+ headers_content: args[:show],
16
+ nav: args[:show],
17
+ nav_i18n: args[:show],
18
+ nav_format: args[:show],
19
+ nav_send: args[:show],
20
+ email_body: args[:show]
21
+ }.freeze
22
+ POSITIONS = %i[before replace after].freeze
23
+
24
+ def initialize
25
+ @hooks = Hooks.new
26
+ end
27
+
28
+ # @param [Symbol] id
29
+ # @param [:before, :replace, :after] pos
30
+ # @example
31
+ # view_hooks.add_render :list, :before, partial: 'shared/hello'
32
+ def add_render(id, pos, *render_args)
33
+ render_args = render_args.dup
34
+ render_opts = render_args.extract_options!.dup
35
+ add id, pos do |locals = {}|
36
+ render *render_args, render_opts.merge(
37
+ locals: (render_opts[:locals] || {}).merge(locals)
38
+ )
39
+ end
40
+ end
41
+
42
+ # @param [Symbol] id
43
+ # @param [:before, :replace, :after] pos
44
+ # @example
45
+ # view_hooks.add :headers_content, :after do |mail:, preview:|
46
+ # raw "<b>ID</b>: #{h mail.header['X-APP-EMAIL-ID']}"
47
+ # end
48
+ def add(id, pos, &block)
49
+ @hooks[id][pos] << block
50
+ end
51
+
52
+ def render(hook_id, locals, template)
53
+ at = @hooks[hook_id]
54
+ validate_locals! hook_id, locals
55
+ parts = [
56
+ render_providers(at[:before], locals, template),
57
+ if at[:replace].present?
58
+ render_providers(at[:replace], locals, template)
59
+ else
60
+ template.capture { yield(locals) }
61
+ end,
62
+ render_providers(at[:after], locals, template)
63
+ ]
64
+ template.safe_join(parts, '')
65
+ end
66
+
67
+ private
68
+
69
+ def render_providers(providers, locals, template)
70
+ template.safe_join providers.map { |provider| template.instance_exec(locals, &provider) }, ''
71
+ end
72
+
73
+ def validate_locals!(hook_id, locals)
74
+ if locals.keys.sort != SCHEMA[hook_id].sort
75
+ raise ArgumentError, "Invalid arguments #{locals.keys}. Valid: #{SCHEMA[hook_id]}"
76
+ end
77
+ end
78
+
79
+ class Hooks < DelegateClass(Hash)
80
+ def initialize
81
+ super Hash.new { |h, id|
82
+ validate_id! id
83
+ h[id] = Hash.new { |hh, pos|
84
+ validate_pos! pos
85
+ hh[pos] = []
86
+ }
87
+ }
88
+ end
89
+
90
+ private
91
+
92
+ def validate_id!(id)
93
+ raise ArgumentError, 'hook id must be a symbol' unless Symbol === id
94
+ raise ArgumentError, "Invalid hook #{id}. Valid: #{SCHEMA.keys * ', '}." unless SCHEMA.key?(id)
95
+ end
96
+
97
+ def validate_pos!(pos)
98
+ raise ArgumentError, "Invalid position #{pos}. Valid: #{POSITIONS * ', '}" unless POSITIONS.include?(pos)
99
+ end
100
+ end
101
+ end
102
+ end
metadata ADDED
@@ -0,0 +1,231 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple_email_preview
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - HUONGNHDH
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-07-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: breadcrumbs_on_rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 3.0.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 3.0.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: rails
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '4.2'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '4.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: request_store
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.0.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.0.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: sassc-rails
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 1.3.0
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.3.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: turbolinks
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 5.0.1
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 5.0.1
89
+ - !ruby/object:Gem::Dependency
90
+ name: capybara
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: 3.8.2
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 3.8.2
103
+ - !ruby/object:Gem::Dependency
104
+ name: i18n-tasks
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 0.9.25
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 0.9.25
117
+ - !ruby/object:Gem::Dependency
118
+ name: poltergeist
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 1.0.0
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 1.0.0
131
+ - !ruby/object:Gem::Dependency
132
+ name: puma
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 3.12.0
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 3.12.0
145
+ - !ruby/object:Gem::Dependency
146
+ name: rspec-rails
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: 3.8.0
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: 3.8.0
159
+ description: A Rails Engine to preview plain text and html email in your browser
160
+ email: huong.nhdh@gmail.com
161
+ executables: []
162
+ extensions: []
163
+ extra_rdoc_files: []
164
+ files:
165
+ - Gemfile
166
+ - MIT-LICENSE
167
+ - README.md
168
+ - Rakefile
169
+ - app/assets/images/simple_email_preview/favicon.png
170
+ - app/assets/javascripts/simple_email_preview/application.js
171
+ - app/assets/stylesheets/simple_email_preview/_bootstrap3.sass
172
+ - app/assets/stylesheets/simple_email_preview/_default.sass
173
+ - app/assets/stylesheets/simple_email_preview/application.scss
174
+ - app/controllers/simple_email_preview/application_controller.rb
175
+ - app/controllers/simple_email_preview/emails_controller.rb
176
+ - app/helpers/simple_email_preview/emails_helper.rb
177
+ - app/models/simple_email_preview/preview.rb
178
+ - app/presenters/simple_email_preview/preview_list_presenter.rb
179
+ - app/views/layouts/simple_email_preview/_flash_notices.html.erb
180
+ - app/views/layouts/simple_email_preview/application.html.erb
181
+ - app/views/layouts/simple_email_preview/email.html.erb
182
+ - app/views/simple_email_preview/emails/_email_iframe.html.erb
183
+ - app/views/simple_email_preview/emails/_format_nav.html.erb
184
+ - app/views/simple_email_preview/emails/_headers.html.erb
185
+ - app/views/simple_email_preview/emails/_headers_and_nav.html.erb
186
+ - app/views/simple_email_preview/emails/_i18n_nav.html.erb
187
+ - app/views/simple_email_preview/emails/_nav.html.erb
188
+ - app/views/simple_email_preview/emails/_send_form.html.erb
189
+ - app/views/simple_email_preview/emails/index.html.erb
190
+ - app/views/simple_email_preview/emails/show.html.erb
191
+ - config/i18n-tasks.yml
192
+ - config/initializers/simple_email_preview.rb
193
+ - config/locales/de.yml
194
+ - config/locales/en.yml
195
+ - config/locales/es.yml
196
+ - config/locales/ja.yml
197
+ - config/locales/ru.yml
198
+ - config/routes.rb
199
+ - lib/generators/simple_email_preview/install_generator.rb
200
+ - lib/generators/simple_email_preview/update_previews_generator.rb
201
+ - lib/simple_email_preview.rb
202
+ - lib/simple_email_preview/delivery_handler.rb
203
+ - lib/simple_email_preview/engine.rb
204
+ - lib/simple_email_preview/main_app_route_delegator.rb
205
+ - lib/simple_email_preview/version.rb
206
+ - lib/simple_email_preview/view_hooks.rb
207
+ homepage: https://github.com/huongnhdh/simple_email_preview
208
+ licenses:
209
+ - MIT
210
+ metadata:
211
+ issue_tracker: https://github.com/huongnhdh/simple_email_preview/issues
212
+ post_install_message:
213
+ rdoc_options: []
214
+ require_paths:
215
+ - lib
216
+ required_ruby_version: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - ">="
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
221
+ required_rubygems_version: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
226
+ requirements: []
227
+ rubygems_version: 3.1.4
228
+ signing_key:
229
+ specification_version: 4
230
+ summary: Simple preview emails in browser (rails engine)
231
+ test_files: []