draft_generators 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +6 -0
  3. data/.document +5 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +637 -0
  6. data/Gemfile +16 -0
  7. data/LICENSE.txt +20 -0
  8. data/README.markdown +24 -0
  9. data/Rakefile +51 -0
  10. data/VERSION +1 -0
  11. data/draft_generators.gemspec +120 -0
  12. data/lib/devise_customization_service.rb +95 -0
  13. data/lib/draft_generators.rb +8 -0
  14. data/lib/generators/draft/devise/devise_generator.rb +92 -0
  15. data/lib/generators/draft/devise/views/templates/confirmations/new.html.erb +49 -0
  16. data/lib/generators/draft/devise/views/templates/mailer/confirmation_instructions.html.erb +5 -0
  17. data/lib/generators/draft/devise/views/templates/mailer/email_changed.html.erb +7 -0
  18. data/lib/generators/draft/devise/views/templates/mailer/password_change.html.erb +3 -0
  19. data/lib/generators/draft/devise/views/templates/mailer/reset_password_instructions.html.erb +8 -0
  20. data/lib/generators/draft/devise/views/templates/mailer/unlock_instructions.html.erb +7 -0
  21. data/lib/generators/draft/devise/views/templates/passwords/edit.html.erb +83 -0
  22. data/lib/generators/draft/devise/views/templates/passwords/new.html.erb +49 -0
  23. data/lib/generators/draft/devise/views/templates/registrations/edit.html.erb +159 -0
  24. data/lib/generators/draft/devise/views/templates/registrations/new.html.erb +113 -0
  25. data/lib/generators/draft/devise/views/templates/registrations_with_sentinels/edit.html.erb +160 -0
  26. data/lib/generators/draft/devise/views/templates/registrations_with_sentinels/new.html.erb +102 -0
  27. data/lib/generators/draft/devise/views/templates/sessions/new.html.erb +51 -0
  28. data/lib/generators/draft/devise/views/templates/shared/_links.html.erb +25 -0
  29. data/lib/generators/draft/devise/views/templates/unlocks/new.html.erb +49 -0
  30. data/lib/generators/draft/devise/views/views_generator.rb +41 -0
  31. data/lib/generators/draft/layout/USAGE +49 -0
  32. data/lib/generators/draft/layout/layout_generator.rb +66 -0
  33. data/lib/generators/draft/layout/templates/_bootstrapcdn_assets.html.erb +10 -0
  34. data/lib/generators/draft/layout/templates/_flashes.html.erb +23 -0
  35. data/lib/generators/draft/layout/templates/_navbar.html.erb +75 -0
  36. data/lib/generators/draft/layout/templates/layout.html.erb +40 -0
  37. data/lib/generators/draft/model/USAGE +14 -0
  38. data/lib/generators/draft/model/model_generator.rb +42 -0
  39. data/lib/generators/draft/resource/USAGE +11 -0
  40. data/lib/generators/draft/resource/resource_generator.rb +172 -0
  41. data/lib/generators/draft/resource/templates/controllers/controller.rb +97 -0
  42. data/lib/generators/draft/resource/templates/controllers/read_only_controller.rb +13 -0
  43. data/lib/generators/draft/resource/templates/specs/crud_spec.rb +300 -0
  44. data/lib/generators/draft/resource/templates/specs/factories.rb +32 -0
  45. data/lib/generators/draft/resource/templates/views/association_new_form.html.erb +67 -0
  46. data/lib/generators/draft/resource/templates/views/create_row.html.erb +13 -0
  47. data/lib/generators/draft/resource/templates/views/destroy_row.html.erb +13 -0
  48. data/lib/generators/draft/resource/templates/views/edit_form.html.erb +72 -0
  49. data/lib/generators/draft/resource/templates/views/edit_form_with_errors.html.erb +85 -0
  50. data/lib/generators/draft/resource/templates/views/index.html.erb +102 -0
  51. data/lib/generators/draft/resource/templates/views/new_form.html.erb +73 -0
  52. data/lib/generators/draft/resource/templates/views/new_form_with_errors.html.erb +86 -0
  53. data/lib/generators/draft/resource/templates/views/show.html.erb +90 -0
  54. data/lib/generators/draft/resource/templates/views/update_row.html.erb +9 -0
  55. data/lib/generators/draft/scaffold/scaffold_controller_generator.rb +16 -0
  56. data/lib/generators/draft/scaffold/scaffold_erb_generator.rb +25 -0
  57. data/lib/generators/draft/scaffold/scaffold_generator.rb +15 -0
  58. data/lib/generators/draft/scaffold/templates/_card.html.erb +37 -0
  59. data/lib/generators/draft/scaffold/templates/_form.html.erb +44 -0
  60. data/lib/generators/draft/scaffold/templates/_list_item.html.erb +13 -0
  61. data/lib/generators/draft/scaffold/templates/_table_row.html.erb +23 -0
  62. data/lib/generators/draft/scaffold/templates/edit.html.erb +17 -0
  63. data/lib/generators/draft/scaffold/templates/index.html.erb +71 -0
  64. data/lib/generators/draft/scaffold/templates/new.html.erb +17 -0
  65. data/lib/generators/draft/scaffold/templates/show.html.erb +5 -0
  66. data/lib/rails_tag_service.rb +47 -0
  67. metadata +197 -0
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "https://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem "rspec", "~> 3.5.0"
10
+ gem "rdoc", "~> 3.12"
11
+ gem "bundler", "~> 1.0"
12
+ gem "juwelier", "~> 2.1.0"
13
+ gem "simplecov", ">= 0"
14
+ end
15
+
16
+ gem 'devise'
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2017 Raghu Betina
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,24 @@
1
+ # draft_generators
2
+
3
+ This is a set of generators that help beginners learn to program. Primarily, they generate code that is more explicit and verbose and less idiomatic and “magical” than the built-in scaffold generator. It is meant to be helpful for beginners while they are still learning how things are wired together.
4
+
5
+ ## Contributing to draft_generators
6
+
7
+ - Check out the latest master to make sure the feature hasn't been
8
+ implemented or the bug hasn't been fixed yet.
9
+ - Check out the issue tracker to make sure someone already hasn't
10
+ requested it and/or contributed it.
11
+ - Fork the project.
12
+ Start a feature/bugfix branch.
13
+ Commit and push until you are happy with your contribution.
14
+ Make sure to add tests for it. This is important so I don't break it
15
+ in a future version unintentionally.
16
+ - Please try not to mess with the Rakefile, version, or history. If
17
+ you want to have your own version, or is otherwise necessary, that
18
+ is fine, but please isolate to its own commit so I can cherry-pick
19
+ around it.
20
+
21
+ ## Copyright
22
+
23
+ Copyright (c) 2017 Raghu Betina. See
24
+ LICENSE.txt for further details.
data/Rakefile ADDED
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'juwelier'
15
+ Juwelier::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
17
+ gem.name = "draft_generators"
18
+ gem.homepage = "http://github.com/raghubetina/draft_generators"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Generators that help beginners learn to program.}
21
+ gem.description = %Q{This is a set of generators that help beginners learn to program. Primarily, they generate code that is more explicit and verbose and less idiomatic and “magical” than the built-in scaffold generator, which is helpful for beginners while they are learning how exactly things are wired together.}
22
+ gem.email = "raghu@firstdraft.com"
23
+ gem.authors = ["Raghu Betina"]
24
+
25
+ # dependencies defined in Gemfile
26
+ end
27
+ Juwelier::RubygemsDotOrgTasks.new
28
+
29
+ require 'rspec/core'
30
+ require 'rspec/core/rake_task'
31
+ RSpec::Core::RakeTask.new(:spec) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
33
+ end
34
+
35
+ desc "Code coverage detail"
36
+ task :simplecov do
37
+ ENV['COVERAGE'] = "true"
38
+ Rake::Task['spec'].execute
39
+ end
40
+
41
+ task :default => :spec
42
+
43
+ require 'rdoc/task'
44
+ Rake::RDocTask.new do |rdoc|
45
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
46
+
47
+ rdoc.rdoc_dir = 'rdoc'
48
+ rdoc.title = "draft_generators #{version}"
49
+ rdoc.rdoc_files.include('README*')
50
+ rdoc.rdoc_files.include('lib/**/*.rb')
51
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.3
@@ -0,0 +1,120 @@
1
+ # Generated by juwelier
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: draft_generators 0.0.3 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "draft_generators".freeze
9
+ s.version = "0.0.3"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib".freeze]
13
+ s.authors = ["Raghu Betina".freeze]
14
+ s.date = "2019-05-01"
15
+ s.description = "This is a set of generators that help beginners learn to program. Primarily, they generate code that is more explicit and verbose and less idiomatic and \u201Cmagical\u201D than the built-in scaffold generator, which is helpful for beginners while they are learning how exactly things are wired together.".freeze
16
+ s.email = "raghu@firstdraft.com".freeze
17
+ s.extra_rdoc_files = [
18
+ "LICENSE.txt",
19
+ "README.markdown"
20
+ ]
21
+ s.files = [
22
+ ".codeclimate.yml",
23
+ ".document",
24
+ ".rspec",
25
+ ".rubocop.yml",
26
+ "Gemfile",
27
+ "LICENSE.txt",
28
+ "README.markdown",
29
+ "Rakefile",
30
+ "VERSION",
31
+ "draft_generators.gemspec",
32
+ "lib/devise_customization_service.rb",
33
+ "lib/draft_generators.rb",
34
+ "lib/generators/draft/devise/devise_generator.rb",
35
+ "lib/generators/draft/devise/views/templates/confirmations/new.html.erb",
36
+ "lib/generators/draft/devise/views/templates/mailer/confirmation_instructions.html.erb",
37
+ "lib/generators/draft/devise/views/templates/mailer/email_changed.html.erb",
38
+ "lib/generators/draft/devise/views/templates/mailer/password_change.html.erb",
39
+ "lib/generators/draft/devise/views/templates/mailer/reset_password_instructions.html.erb",
40
+ "lib/generators/draft/devise/views/templates/mailer/unlock_instructions.html.erb",
41
+ "lib/generators/draft/devise/views/templates/passwords/edit.html.erb",
42
+ "lib/generators/draft/devise/views/templates/passwords/new.html.erb",
43
+ "lib/generators/draft/devise/views/templates/registrations/edit.html.erb",
44
+ "lib/generators/draft/devise/views/templates/registrations/new.html.erb",
45
+ "lib/generators/draft/devise/views/templates/registrations_with_sentinels/edit.html.erb",
46
+ "lib/generators/draft/devise/views/templates/registrations_with_sentinels/new.html.erb",
47
+ "lib/generators/draft/devise/views/templates/sessions/new.html.erb",
48
+ "lib/generators/draft/devise/views/templates/shared/_links.html.erb",
49
+ "lib/generators/draft/devise/views/templates/unlocks/new.html.erb",
50
+ "lib/generators/draft/devise/views/views_generator.rb",
51
+ "lib/generators/draft/layout/USAGE",
52
+ "lib/generators/draft/layout/layout_generator.rb",
53
+ "lib/generators/draft/layout/templates/_bootstrapcdn_assets.html.erb",
54
+ "lib/generators/draft/layout/templates/_flashes.html.erb",
55
+ "lib/generators/draft/layout/templates/_navbar.html.erb",
56
+ "lib/generators/draft/layout/templates/layout.html.erb",
57
+ "lib/generators/draft/model/USAGE",
58
+ "lib/generators/draft/model/model_generator.rb",
59
+ "lib/generators/draft/resource/USAGE",
60
+ "lib/generators/draft/resource/resource_generator.rb",
61
+ "lib/generators/draft/resource/templates/controllers/controller.rb",
62
+ "lib/generators/draft/resource/templates/controllers/read_only_controller.rb",
63
+ "lib/generators/draft/resource/templates/specs/crud_spec.rb",
64
+ "lib/generators/draft/resource/templates/specs/factories.rb",
65
+ "lib/generators/draft/resource/templates/views/association_new_form.html.erb",
66
+ "lib/generators/draft/resource/templates/views/create_row.html.erb",
67
+ "lib/generators/draft/resource/templates/views/destroy_row.html.erb",
68
+ "lib/generators/draft/resource/templates/views/edit_form.html.erb",
69
+ "lib/generators/draft/resource/templates/views/edit_form_with_errors.html.erb",
70
+ "lib/generators/draft/resource/templates/views/index.html.erb",
71
+ "lib/generators/draft/resource/templates/views/new_form.html.erb",
72
+ "lib/generators/draft/resource/templates/views/new_form_with_errors.html.erb",
73
+ "lib/generators/draft/resource/templates/views/show.html.erb",
74
+ "lib/generators/draft/resource/templates/views/update_row.html.erb",
75
+ "lib/generators/draft/scaffold/scaffold_controller_generator.rb",
76
+ "lib/generators/draft/scaffold/scaffold_erb_generator.rb",
77
+ "lib/generators/draft/scaffold/scaffold_generator.rb",
78
+ "lib/generators/draft/scaffold/templates/_card.html.erb",
79
+ "lib/generators/draft/scaffold/templates/_form.html.erb",
80
+ "lib/generators/draft/scaffold/templates/_list_item.html.erb",
81
+ "lib/generators/draft/scaffold/templates/_table_row.html.erb",
82
+ "lib/generators/draft/scaffold/templates/edit.html.erb",
83
+ "lib/generators/draft/scaffold/templates/index.html.erb",
84
+ "lib/generators/draft/scaffold/templates/new.html.erb",
85
+ "lib/generators/draft/scaffold/templates/show.html.erb",
86
+ "lib/rails_tag_service.rb"
87
+ ]
88
+ s.homepage = "http://github.com/raghubetina/draft_generators".freeze
89
+ s.licenses = ["MIT".freeze]
90
+ s.rubygems_version = "2.7.8".freeze
91
+ s.summary = "Generators that help beginners learn to program.".freeze
92
+
93
+ if s.respond_to? :specification_version then
94
+ s.specification_version = 4
95
+
96
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
97
+ s.add_runtime_dependency(%q<devise>.freeze, [">= 0"])
98
+ s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
99
+ s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
100
+ s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
101
+ s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
102
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
103
+ else
104
+ s.add_dependency(%q<devise>.freeze, [">= 0"])
105
+ s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
106
+ s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
107
+ s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
108
+ s.add_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
109
+ s.add_dependency(%q<simplecov>.freeze, [">= 0"])
110
+ end
111
+ else
112
+ s.add_dependency(%q<devise>.freeze, [">= 0"])
113
+ s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
114
+ s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
115
+ s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
116
+ s.add_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
117
+ s.add_dependency(%q<simplecov>.freeze, [">= 0"])
118
+ end
119
+ end
120
+
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DraftGenerators
4
+ class DeviseCustomizationService
5
+ def initialize(attributes)
6
+ @attributes = attributes
7
+ end
8
+
9
+ def form_fields_to_add
10
+ form_fields = ""
11
+ columns.each do |column|
12
+ form_fields += input_field_block(column)
13
+ end
14
+ form_fields
15
+ end
16
+
17
+ def input_field_block(column)
18
+ column_name = column.name
19
+ %{
20
+ <!-- Devise Input for #{column_name} start -->
21
+ <div class="form-group">
22
+ <% #{column_name}_was_invalid = resource.errors.include?(:#{column_name}) %>
23
+
24
+ <% #{column_name}_class = "form-control" %>
25
+
26
+ <% if was_validated %>
27
+ <% if #{column_name}_was_invalid %>
28
+ <% #{column_name}_class << " is-invalid" %>
29
+ <% else %>
30
+ <% #{column_name}_class << " is-valid" %>
31
+ <% end %>
32
+ <% end %>
33
+
34
+ <%= f.label :#{column_name} %>
35
+
36
+ #{DraftGenerators::RailsTagService.input_tag(column)}
37
+
38
+ <% if #{column_name}_was_invalid %>
39
+ <% resource.errors.full_messages_for(:#{column_name}).each do |message| %>
40
+ <div class="invalid-feedback d-flex">
41
+ <%= message %>
42
+ </div>
43
+ <% end %>
44
+ <% end %>
45
+ </div>
46
+ <!-- Devise Input for #{column_name} end -->
47
+ }
48
+ end
49
+
50
+ def security_field_block
51
+ return "" if eligible_attributes.empty?
52
+ "
53
+
54
+ before_action :configure_permitted_parameters, if: :devise_controller?
55
+
56
+ protected
57
+
58
+ def configure_permitted_parameters
59
+ devise_parameter_sanitizer.permit(:sign_up, :keys => [#{column_names_string}])
60
+
61
+ devise_parameter_sanitizer.permit(:account_update, :keys => [#{column_names_string}])
62
+ end"
63
+ end
64
+
65
+ def update_resource_button_block
66
+ %{ <%= f.submit "Update", class: "btn btn-block btn-outline-primary" %>}
67
+ end
68
+
69
+ def sign_in_resource_button_block
70
+ %{ <%= f.button class: "btn btn-outline-primary btn-block" %>}
71
+ end
72
+
73
+ def column_names
74
+ columns.map(&:name)
75
+ end
76
+
77
+ def column_names_string
78
+ ":" + column_names.join(", :").to_s
79
+ end
80
+
81
+ def protect_from_forgery_code
82
+ "protect_from_forgery with: :exception"
83
+ end
84
+
85
+ def columns
86
+ @_columns ||= eligible_attributes
87
+ end
88
+
89
+ def eligible_attributes
90
+ @attributes.reject do |attribute|
91
+ %w(id created_at updated_at email password).include?(attribute.name)
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "devise_customization_service"
4
+ require "rails_tag_service"
5
+ require "devise"
6
+
7
+ module DraftGenerators
8
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators/named_base"
4
+
5
+ module Draft
6
+ class DeviseGenerator < Rails::Generators::NamedBase
7
+ argument :attributes, type: :array, default: [],
8
+ banner: "field:type field:type"
9
+ class_option :with_sentinels, type: :boolean, default: false, desc: "Skip adding comments to generated files"
10
+ class_option :views, aliases: "-v", type: :array, desc: "Select specific view directories to generate (confirmations, passwords, registrations, sessions, unlocks, mailer)"
11
+
12
+ include Rails::Generators::ResourceHelpers
13
+
14
+ def check_for_existing_devise_model
15
+ return if behavior != :invoke
16
+ if model_exists?
17
+ say "\nYou already have a model called #{class_name}! Halting generator.\n"
18
+ abort
19
+ end
20
+ end
21
+
22
+ def devise_install
23
+ unless initializer_exists?
24
+ invoke "devise:install"
25
+ end
26
+ end
27
+
28
+ def enable_scoped_views
29
+ path = "config/initializers/devise.rb"
30
+ uncomment_lines(path, /.*config.scoped_views = false/)
31
+ code_to_replace = "config.scoped_views = false"
32
+ replace_with = "config.scoped_views = true"
33
+ gsub_file(path, code_to_replace, replace_with)
34
+ end
35
+
36
+ def generate_devise_model
37
+ invoke "devise"
38
+ end
39
+
40
+ def generate_devise_views
41
+ invoke "draft:devise:views"
42
+ devise_service = ::DraftGenerators::DeviseCustomizationService.new(attributes)
43
+ add_additional_views_through_security(devise_service)
44
+ add_additional_fields_for_registration(devise_service)
45
+ end
46
+
47
+ private
48
+
49
+ def add_additional_views_through_security(devise_service)
50
+ inject_into_file("app/controllers/application_controller.rb",
51
+ devise_service.security_field_block,
52
+ after: devise_service.protect_from_forgery_code)
53
+ end
54
+
55
+ def add_additional_fields_for_registration(devise_service)
56
+ scope = name.underscore.pluralize
57
+ form_fields_to_add = devise_service.form_fields_to_add
58
+
59
+ if File.exist?("app/views/#{scope}/registrations/new.html.erb")
60
+ inject_into_file("app/views/#{scope}/registrations/new.html.erb",
61
+ form_fields_to_add,
62
+ before: devise_service.sign_in_resource_button_block)
63
+ end
64
+
65
+ if File.exist?("app/views/#{scope}/registrations/edit.html.erb")
66
+ inject_into_file("app/views/#{scope}/registrations/edit.html.erb",
67
+ form_fields_to_add,
68
+ before: devise_service.update_resource_button_block)
69
+ end
70
+ end
71
+
72
+ def with_sentinels?
73
+ options[:with_sentinels]
74
+ end
75
+
76
+ def model_exists?
77
+ File.exist?(File.join(destination_root, model_path))
78
+ end
79
+
80
+ def model_path
81
+ @model_path ||= File.join("app", "models", "#{file_path}.rb")
82
+ end
83
+
84
+ def initializer_exists?
85
+ File.exist?(File.join(destination_root, initializer_path))
86
+ end
87
+
88
+ def initializer_path
89
+ @initializer_path ||= File.join("config", "initializers", "devise.rb")
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,49 @@
1
+ <div class="row">
2
+ <div class="offset-md-3 col-md-6">
3
+ <div class="card mb-3">
4
+ <h5 class="card-header">
5
+ Resend confirmation instructions
6
+ </h5>
7
+
8
+ <div class="card-body">
9
+ <% was_validated = resource.errors.any? %>
10
+
11
+ <% form_html_options = { method: :post, novalidate: true, class: "mb-3" } %>
12
+
13
+ <%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: form_html_options) do |f| %>
14
+ <div class="form-group">
15
+ <% email_was_invalid = resource.errors.include?(:email) %>
16
+
17
+ <% email_class = "form-control" %>
18
+
19
+ <% if was_validated %>
20
+ <% if email_was_invalid %>
21
+ <% email_class << " is-invalid" %>
22
+ <% else %>
23
+ <% email_class << " is-valid" %>
24
+ <% end %>
25
+ <% end %>
26
+
27
+ <%= f.label :email %>
28
+
29
+ <%= f.email_field :email, class: email_class, autofocus: true, value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %>
30
+
31
+ <% if email_was_invalid %>
32
+ <% resource.errors.full_messages_for(:email).each do |message| %>
33
+ <div class="invalid-feedback d-flex">
34
+ <%= message %>
35
+ </div>
36
+ <% end %>
37
+ <% end %>
38
+ </div>
39
+
40
+ <%= f.submit "Resend confirmation instructions", class: "btn btn-outline-primary btn-block" %>
41
+ <% end %>
42
+
43
+ <hr>
44
+
45
+ <%= render "devise/shared/links" %>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </div>