draft_generators 0.0.3 → 0.0.4

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 (27) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/VERSION +1 -1
  4. data/draft_generators.gemspec +21 -20
  5. data/lib/draft_generators.rb +1 -0
  6. data/lib/generators/draft/account/account_generator.rb +189 -0
  7. data/lib/generators/draft/account/templates/controllers/authentication_controller.rb +96 -0
  8. data/lib/generators/draft/account/templates/views/authentication/edit_profile.html.erb +38 -0
  9. data/lib/generators/draft/account/templates/views/authentication/edit_profile_with_errors.html.erb +44 -0
  10. data/lib/generators/draft/account/templates/views/authentication/sign_in.html.erb +23 -0
  11. data/lib/generators/draft/account/templates/views/authentication/sign_up.html.erb +43 -0
  12. data/lib/generators/draft/layout/layout_generator.rb +3 -3
  13. data/lib/generators/draft/layout/templates/_cdn_assets.html.erb +13 -0
  14. data/lib/generators/draft/layout/templates/_navbar.html.erb +1 -1
  15. data/lib/generators/draft/layout/templates/layout.html.erb +13 -12
  16. data/lib/generators/draft/resource/resource_generator.rb +19 -17
  17. data/lib/generators/draft/resource/templates/controllers/controller.rb +45 -44
  18. data/lib/generators/draft/resource/templates/controllers/read_only_controller.rb +2 -2
  19. data/lib/generators/draft/resource/templates/views/association_new_form.html.erb +6 -6
  20. data/lib/generators/draft/resource/templates/views/edit_form.html.erb +7 -7
  21. data/lib/generators/draft/resource/templates/views/edit_form_with_errors.html.erb +8 -8
  22. data/lib/generators/draft/resource/templates/views/index.html.erb +69 -23
  23. data/lib/generators/draft/resource/templates/views/new_form.html.erb +7 -7
  24. data/lib/generators/draft/resource/templates/views/new_form_with_errors.html.erb +8 -8
  25. data/lib/generators/draft/resource/templates/views/show.html.erb +65 -25
  26. metadata +24 -5
  27. data/lib/generators/draft/layout/templates/_bootstrapcdn_assets.html.erb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 040dd9e758934c6e453b1d104312200d1b374f0f116c55ab43b39e6c14c99a67
4
- data.tar.gz: 2426153f36b7a16e4c2a577b33935783a79126b223b90993a8fa341834c98b7c
3
+ metadata.gz: d209a8d2e3679c9017931e313f683ea37cbfd82b3c15b7c342babc1ff200a297
4
+ data.tar.gz: 3d4309214d3292e7a4a763ae8796f5c415f472faa00564efec1d01c530ffcfb3
5
5
  SHA512:
6
- metadata.gz: a0e4495db8f10e6d997796dd43c13f6c3194a56d077b89c8efd2343b5493758d3c577f37cbfad1e1f9023bb2630e051971f1833c5fe4df087757ab05f747b14e
7
- data.tar.gz: eb88923fe4a031ece2ea0a9026d4710e334dcdb8f3684820f4c2724aadda9f45174f7c68266429ca0e6eea87f933b204e9487716a40f95e8da54562c60bd98d8
6
+ metadata.gz: 7e07f6a687883dc6d265d74b91fece5b402346a7c9f2f57a2749b02c221a9153ac7db2f407598fba7bc4b227a0eae0d0b8d8d98c0f0bf1b025465daf679ecac8
7
+ data.tar.gz: 17c6d5992dba3a40c16241b46119548722031bbfbbe406c506165f44c0e181a7515a043a609370070a8879019f509bde5c1392e1939bb82060749b8bee8c152f
data/Gemfile CHANGED
@@ -13,4 +13,5 @@ group :development do
13
13
  gem "simplecov", ">= 0"
14
14
  end
15
15
 
16
+ gem 'indefinite_article'
16
17
  gem 'devise'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: draft_generators 0.0.3 ruby lib
5
+ # stub: draft_generators 0.0.4 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "draft_generators".freeze
9
- s.version = "0.0.3"
9
+ s.version = "0.0.4"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Raghu Betina".freeze]
14
- s.date = "2019-05-01"
14
+ s.date = "2023-05-30"
15
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
16
  s.email = "raghu@firstdraft.com".freeze
17
17
  s.extra_rdoc_files = [
@@ -31,6 +31,12 @@ Gem::Specification.new do |s|
31
31
  "draft_generators.gemspec",
32
32
  "lib/devise_customization_service.rb",
33
33
  "lib/draft_generators.rb",
34
+ "lib/generators/draft/account/account_generator.rb",
35
+ "lib/generators/draft/account/templates/controllers/authentication_controller.rb",
36
+ "lib/generators/draft/account/templates/views/authentication/edit_profile.html.erb",
37
+ "lib/generators/draft/account/templates/views/authentication/edit_profile_with_errors.html.erb",
38
+ "lib/generators/draft/account/templates/views/authentication/sign_in.html.erb",
39
+ "lib/generators/draft/account/templates/views/authentication/sign_up.html.erb",
34
40
  "lib/generators/draft/devise/devise_generator.rb",
35
41
  "lib/generators/draft/devise/views/templates/confirmations/new.html.erb",
36
42
  "lib/generators/draft/devise/views/templates/mailer/confirmation_instructions.html.erb",
@@ -50,7 +56,7 @@ Gem::Specification.new do |s|
50
56
  "lib/generators/draft/devise/views/views_generator.rb",
51
57
  "lib/generators/draft/layout/USAGE",
52
58
  "lib/generators/draft/layout/layout_generator.rb",
53
- "lib/generators/draft/layout/templates/_bootstrapcdn_assets.html.erb",
59
+ "lib/generators/draft/layout/templates/_cdn_assets.html.erb",
54
60
  "lib/generators/draft/layout/templates/_flashes.html.erb",
55
61
  "lib/generators/draft/layout/templates/_navbar.html.erb",
56
62
  "lib/generators/draft/layout/templates/layout.html.erb",
@@ -87,28 +93,23 @@ Gem::Specification.new do |s|
87
93
  ]
88
94
  s.homepage = "http://github.com/raghubetina/draft_generators".freeze
89
95
  s.licenses = ["MIT".freeze]
90
- s.rubygems_version = "2.7.8".freeze
96
+ s.rubygems_version = "3.1.6".freeze
91
97
  s.summary = "Generators that help beginners learn to program.".freeze
92
98
 
93
99
  if s.respond_to? :specification_version then
94
100
  s.specification_version = 4
101
+ end
95
102
 
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
103
+ if s.respond_to? :add_runtime_dependency then
104
+ s.add_runtime_dependency(%q<indefinite_article>.freeze, [">= 0"])
105
+ s.add_runtime_dependency(%q<devise>.freeze, [">= 0"])
106
+ s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
107
+ s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
108
+ s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
109
+ s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
110
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
111
111
  else
112
+ s.add_dependency(%q<indefinite_article>.freeze, [">= 0"])
112
113
  s.add_dependency(%q<devise>.freeze, [">= 0"])
113
114
  s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
114
115
  s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
@@ -3,6 +3,7 @@
3
3
  require "devise_customization_service"
4
4
  require "rails_tag_service"
5
5
  require "devise"
6
+ require "indefinite_article"
6
7
 
7
8
  module DraftGenerators
8
9
  end
@@ -0,0 +1,189 @@
1
+ require "rails/generators/named_base"
2
+
3
+ module Draft
4
+ class AccountGenerator < Rails::Generators::NamedBase
5
+ source_root File.expand_path("../templates", __FILE__)
6
+
7
+ argument :attributes, type: :array, default: [],
8
+ banner: "field:type field:type"
9
+
10
+ include Rails::Generators::ResourceHelpers
11
+
12
+ def generate_required_attributes
13
+ unless attributes_has_password_digest?
14
+ password_digest = Rails::Generators::GeneratedAttribute.parse(["password_digest", :string, nil].compact.join(":"))
15
+ attributes.unshift(password_digest)
16
+ end
17
+ unless attributes_has_email?
18
+ email = Rails::Generators::GeneratedAttribute.parse(["email", :string, nil].compact.join(":"))
19
+ attributes.unshift(email)
20
+ end
21
+ end
22
+
23
+ def generate_model
24
+ invoke "draft:model", paramaterize_attributes
25
+ edit_model
26
+ end
27
+
28
+ def generate_routes
29
+ authentication_routes
30
+ end
31
+
32
+ def generate_before_actions
33
+ authentication_helpers
34
+ end
35
+
36
+ def generate_controller
37
+ template "controllers/authentication_controller.rb", "app/controllers/#{singular_table_name.underscore}_authentication_controller.rb"
38
+ end
39
+
40
+ def create_root_folder
41
+ empty_directory File.join("app/views", "#{singular_table_name.underscore}_authentication")
42
+ end
43
+
44
+ def generate_view_files
45
+ available_views.each do |view|
46
+ filename = view_authentication_filename_with_extensions(view)
47
+ template filename, File.join("app/views/#{singular_table_name.underscore}_authentication", File.basename(filename))
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def authentication_routes
54
+ log :route, "Authentication routes"
55
+
56
+ route <<-RUBY.gsub(/^ /, "")
57
+
58
+ # Routes for the #{singular_table_name.humanize} account:
59
+
60
+ # SIGN UP FORM
61
+ get("/#{singular_table_name.underscore}_sign_up", { :controller => "#{singular_table_name.underscore}_authentication", :action => "sign_up_form" })
62
+ # CREATE RECORD
63
+ post("/insert_#{singular_table_name.underscore}", { :controller => "#{singular_table_name.underscore}_authentication", :action => "create" })
64
+
65
+ # EDIT PROFILE FORM
66
+ get("/edit_#{singular_table_name.underscore}_profile", { :controller => "#{singular_table_name.underscore}_authentication", :action => "edit_profile_form" })
67
+ # UPDATE RECORD
68
+ post("/modify_#{singular_table_name.underscore}", { :controller => "#{singular_table_name.underscore}_authentication", :action => "update" })
69
+
70
+ # DELETE RECORD
71
+ get("/cancel_#{singular_table_name.underscore}_account", { :controller => "#{singular_table_name.underscore}_authentication", :action => "destroy" })
72
+
73
+ # ------------------------------
74
+
75
+ # SIGN IN FORM
76
+ get("/#{singular_table_name.underscore}_sign_in", { :controller => "#{singular_table_name.underscore}_authentication", :action => "sign_in_form" })
77
+ # AUTHENTICATE AND STORE COOKIE
78
+ post("/#{singular_table_name.underscore}_verify_credentials", { :controller => "#{singular_table_name.underscore}_authentication", :action => "create_cookie" })
79
+
80
+ # SIGN OUT
81
+ get("/#{singular_table_name.underscore}_sign_out", { :controller => "#{singular_table_name.underscore}_authentication", :action => "destroy_cookies" })
82
+
83
+ #------------------------------
84
+ RUBY
85
+ end
86
+
87
+ def authentication_helpers
88
+ log :controller, "Authentication before_actions"
89
+
90
+ application_controller <<-RUBY.gsub(/^ /, "")
91
+
92
+ before_action(:load_current_#{singular_table_name.underscore})
93
+
94
+ # Uncomment line 5 in this file and line 3 in #{class_name.singularize}AuthenticationController if you want to force #{plural_table_name} to sign in before any other actions.
95
+ # before_action(:force_#{singular_table_name.underscore}_sign_in)
96
+
97
+ def load_current_#{singular_table_name.underscore}
98
+ the_id = session.fetch(:#{singular_table_name.underscore}_id, nil)
99
+
100
+ @current_#{singular_table_name.underscore} = #{class_name.singularize}.where({ :id => the_id }).first
101
+ end
102
+
103
+ def force_#{singular_table_name.underscore}_sign_in
104
+ if @current_#{singular_table_name.underscore} == nil
105
+ redirect_to("/#{singular_table_name.underscore}_sign_in", { :notice => "You have to sign in first." })
106
+ end
107
+ end
108
+ RUBY
109
+ end
110
+
111
+ def edit_model
112
+ sentinel = /.*ApplicationRecord\n/
113
+ content = " validates :email, :uniqueness => { :case_sensitive => false }\n"\
114
+ " validates :email, :presence => true\n"\
115
+ " has_secure_password\n"
116
+ if model_exists?
117
+ inside "app/models" do
118
+ insert_into_file "#{singular_table_name.underscore}.rb", content, after: sentinel
119
+ end
120
+ end
121
+ end
122
+
123
+ def route(routing_code)
124
+ sentinel = /\.routes\.draw do(?:\s*\|map\|)?\s*$/
125
+
126
+ inside "config" do
127
+ insert_into_file "routes.rb", routing_code, after: sentinel
128
+ end
129
+ end
130
+
131
+ def application_controller(app_code)
132
+ sentinel = /::Base$/
133
+
134
+ inside "app/controllers" do
135
+ insert_into_file "application_controller.rb", app_code, after: sentinel
136
+ end
137
+ end
138
+
139
+ def available_views
140
+ %w(sign_up sign_in edit_profile edit_profile_with_errors)
141
+ end
142
+
143
+ def view_filename_with_extensions(name)
144
+ filename = [name, :html, :erb].compact.join(".")
145
+ folders = ["views"]
146
+ filename = File.join(folders, filename) if folders.any?
147
+ filename
148
+ end
149
+
150
+ def view_authentication_filename_with_extensions(name)
151
+ filename = [name, :html, :erb].compact.join(".")
152
+ folders = ["views", "authentication"]
153
+ filename = File.join(folders, filename) if folders.any?
154
+ filename
155
+ end
156
+
157
+ def controller_filename_with_extensions(name)
158
+ filename = [name,:rb].compact.join(".")
159
+ folders = ["controllers"]
160
+ filename = File.join(folders, filename) if folders.any?
161
+ filename
162
+ end
163
+
164
+ def model_exists?
165
+ File.exist?(File.join(destination_root, model_path))
166
+ end
167
+
168
+ def model_path
169
+ @model_path ||= File.join("app", "models", "#{file_path}.rb")
170
+ end
171
+
172
+ def attributes_has_email?
173
+ attributes.any? { |attribute| attribute.column_name.include?("email") }
174
+ end
175
+
176
+ def attributes_has_password_digest?
177
+ attributes.any?{ |attribute| attribute.column_name.include?("password_digest") }
178
+ end
179
+
180
+ def paramaterize_attributes
181
+ array = [singular_table_name.underscore]
182
+ attributes.each do |attribute|
183
+ array.push(attribute.column_name + ":" + attribute.type.to_s)
184
+ end
185
+ array
186
+ end
187
+
188
+ end
189
+ end
@@ -0,0 +1,96 @@
1
+ class <%= class_name.singularize %>AuthenticationController < ApplicationController
2
+ # Uncomment line 3 in this file and line 5 in ApplicationController if you want to force <%= plural_table_name %> to sign in before any other actions.
3
+ # skip_before_action(:force_<%= singular_table_name.underscore %>_sign_in, { :only => [:sign_up_form, :create, :sign_in_form, :create_cookie] })
4
+
5
+ def sign_in_form
6
+ render({ :template => "<%= singular_table_name.underscore %>_authentication/sign_in" })
7
+ end
8
+
9
+ def create_cookie
10
+ <%= singular_table_name.underscore %> = <%= class_name.singularize %>.where({ :email => params.fetch("query_email") }).first
11
+
12
+ the_supplied_password = params.fetch("query_password")
13
+
14
+ if <%= singular_table_name.underscore %> != nil
15
+ are_they_legit = <%= singular_table_name.underscore %>.authenticate(the_supplied_password)
16
+
17
+ if are_they_legit == false
18
+ redirect_to("/<%= singular_table_name.underscore %>_sign_in", { :alert => "Incorrect password." })
19
+ else
20
+ session.store(:<%= singular_table_name.underscore %>_id, <%= singular_table_name.underscore %>.id)
21
+
22
+ redirect_to("/", { :notice => "Signed in successfully." })
23
+ end
24
+ else
25
+ redirect_to("/<%= singular_table_name.underscore %>_sign_in", { :alert => "No <%= singular_table_name.underscore %> with that email address." })
26
+ end
27
+ end
28
+
29
+ def destroy_cookies
30
+ reset_session
31
+
32
+ redirect_to("/", { :notice => "Signed out successfully." })
33
+ end
34
+
35
+ def sign_up_form
36
+ render({ :template => "<%= singular_table_name.underscore %>_authentication/sign_up" })
37
+ end
38
+
39
+ def create
40
+ @<%= singular_table_name.underscore %> = <%= class_name.singularize %>.new
41
+ <% attributes.each do |attribute| -%>
42
+ <% if attribute.field_type == :check_box -%>
43
+ @<%= singular_table_name.underscore %>.<%= attribute.column_name %> = params.fetch("query_<%= attribute.column_name %>", false)
44
+ <% elsif attribute.column_name != "password_digest" -%>
45
+ @<%= singular_table_name.underscore %>.<%= attribute.column_name %> = params.fetch("query_<%= attribute.column_name %>")
46
+ <% else -%>
47
+ @<%= singular_table_name.underscore %>.password = params.fetch("query_password")
48
+ @<%= singular_table_name.underscore %>.password_confirmation = params.fetch("query_password_confirmation")
49
+ <% end -%>
50
+ <% end -%>
51
+
52
+ save_status = @<%= singular_table_name.underscore %>.save
53
+
54
+ if save_status == true
55
+ session.store(:<%= singular_table_name.underscore %>_id, @<%= singular_table_name.underscore %>.id)
56
+
57
+ redirect_to("/", { :notice => "<%= singular_table_name.humanize %> account created successfully."})
58
+ else
59
+ redirect_to("/<%= singular_table_name.underscore %>_sign_up", { :alert => @<%= singular_table_name%>.errors.full_messages.to_sentence })
60
+ end
61
+ end
62
+
63
+ def edit_profile_form
64
+ render({ :template => "<%= singular_table_name.underscore %>_authentication/edit_profile" })
65
+ end
66
+
67
+ def update
68
+ @<%= singular_table_name.underscore %> = @current_<%= singular_table_name.underscore %>
69
+ <% attributes.each do |attribute| -%>
70
+ <% if attribute.field_type == :check_box -%>
71
+ @<%= singular_table_name.underscore %>.<%= attribute.column_name %> = params.fetch("query_<%= attribute.column_name %>", false)
72
+ <% elsif attribute.column_name != "password_digest" -%>
73
+ @<%= singular_table_name.underscore %>.<%= attribute.column_name %> = params.fetch("query_<%= attribute.column_name %>")
74
+ <% else -%>
75
+ @<%= singular_table_name.underscore %>.password = params.fetch("query_password")
76
+ @<%= singular_table_name.underscore %>.password_confirmation = params.fetch("query_password_confirmation")
77
+ <% end -%>
78
+ <% end -%>
79
+
80
+ if @<%= singular_table_name.underscore %>.valid?
81
+ @<%= singular_table_name.underscore %>.save
82
+
83
+ redirect_to("/", { :notice => "<%= singular_table_name.humanize %> account updated successfully."})
84
+ else
85
+ render({ :template => "<%= singular_table_name.underscore %>_authentication/edit_profile_with_errors" , :alert => @<%= singular_table_name%>.errors.full_messages.to_sentence })
86
+ end
87
+ end
88
+
89
+ def destroy
90
+ @current_<%= singular_table_name.underscore %>.destroy
91
+ reset_session
92
+
93
+ redirect_to("/", { :notice => "<%= class_name.singularize %> account cancelled" })
94
+ end
95
+
96
+ end
@@ -0,0 +1,38 @@
1
+ <div >
2
+ <h5>
3
+ Edit <%= class_name.titleize %> Account
4
+ </h5>
5
+
6
+ <div>
7
+ <form action="/modify_<%= singular_table_name.underscore %>" method="post">
8
+ <% attributes.each do |attribute| -%>
9
+ <% if attribute.column_name != "password_digest" -%>
10
+ <div>
11
+ <label for="<%= attribute.column_name %>_box"><%= attribute.column_name.humanize %></label>
12
+ <% if attribute.field_type == :text_area -%>
13
+ <textarea id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" rows="3"><%%= @current_<%= singular_table_name %>.<%= attribute.column_name %> %></textarea>
14
+ <% elsif attribute.field_type == :check_box -%>
15
+ <input id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" type="checkbox" value="1" <%%= "checked" if @current_<%= singular_table_name %>.<%= attribute.column_name %> %>>
16
+ <% else -%>
17
+ <input id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" value="<%%= @current_<%= singular_table_name.underscore %>.<%= attribute.column_name %> %>">
18
+ <% end -%>
19
+ </div>
20
+ <% end -%>
21
+ <% end -%>
22
+
23
+ <div>
24
+ <label for="password_box">Password</label>
25
+ <input id="password_box" name="query_password" placeholder="Choose a password..." type="password">
26
+ </div>
27
+
28
+ <div>
29
+ <label for="password_confirmation_box">Password Confirmation</label>
30
+ <input id="password_confirmation_box" name="query_password_confirmation" placeholder="Confirm your password..." type="password">
31
+ </div>
32
+
33
+ <button>
34
+ Update account
35
+ </button>
36
+ </form>
37
+ </div>
38
+ </div>
@@ -0,0 +1,44 @@
1
+ <div >
2
+ <h5>
3
+ Edit <%= class_name.titleize %> Account
4
+ </h5>
5
+
6
+ <%% if @<%= singular_table_name %>.errors.any? %>
7
+ <%% @<%= singular_table_name %>.errors.full_messages.each do |message| %>
8
+ <div class="alert">
9
+ <%%= message %>
10
+ </div>
11
+ <%% end %>
12
+ <%% end %>
13
+ <div>
14
+ <form action="/modify_<%= singular_table_name.underscore %>" method="post">
15
+ <% attributes.each do |attribute| -%>
16
+ <% if attribute.column_name != "password_digest" %>
17
+ <div>
18
+ <label for="<%= attribute.column_name %>_box"><%= attribute.column_name.humanize %></label>
19
+ <% if attribute.field_type == :text_area %>
20
+ <textarea id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" rows="3"><%%= @current_<%= singular_table_name %>.<%= attribute.column_name %> %></textarea>
21
+ <% elsif attribute.field_type == :check_box %>
22
+ <input id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" type="checkbox" value="1" <%%= "checked" if @current_<%= singular_table_name %>.<%= attribute.column_name %> %>>
23
+ <% else %>
24
+ <input id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" value="<%%= @current_<%= singular_table_name.underscore %>.<%= attribute.column_name %> %>">
25
+ <% end %>
26
+ </div>
27
+ <% end -%>
28
+ <% end %>
29
+ <div>
30
+ <label for="password_box">Password</label>
31
+ <input id="password_box" name="query_password" placeholder="Choose a new password..." type="password">
32
+ </div>
33
+
34
+ <div>
35
+ <label for="password_confirmation_box">Password Confirmation</label>
36
+ <input id="password_confirmation_box" name="query_password_confirmation" placeholder="Confirm your new password..." type="password">
37
+ </div>
38
+
39
+ <button>
40
+ Update account
41
+ </button>
42
+ </form>
43
+ </div>
44
+ </div>
@@ -0,0 +1,23 @@
1
+ <h1>Sign in</h1>
2
+
3
+ <form action="/<%= singular_table_name.underscore %>_verify_credentials" method="post">
4
+ <div>
5
+ <label for="email_box">Email</label>
6
+ <input id="email_box" name="query_email" placeholder="Enter your email..." type="text">
7
+ </div>
8
+
9
+ <div>
10
+ <label for="password_box">Password</label>
11
+ <input id="password_box" name="query_password" placeholder="Enter your password..." type="password">
12
+ </div>
13
+
14
+ <button>
15
+ Sign in
16
+ </button>
17
+ </form>
18
+
19
+ <hr>
20
+
21
+ <p>
22
+ Or, <a href="/<%= singular_table_name.underscore %>_sign_up">Sign up</a> instead.
23
+ </p>
@@ -0,0 +1,43 @@
1
+ <h1>Sign up</h1>
2
+
3
+ <form action="/insert_<%= singular_table_name.underscore %>" method="post">
4
+
5
+ <div>
6
+ <label for="email_box">Email</label>
7
+ <input id="email_box" name="query_email" placeholder="Choose a email..." type="text">
8
+ </div>
9
+ <% attributes.each do |attribute| -%>
10
+ <% if attribute.column_name != "password_digest" && attribute.column_name != "email" -%>
11
+ <div>
12
+ <label for="<%= attribute.column_name %>_box"><%= attribute.column_name.humanize %></label>
13
+ <%- if attribute.field_type == :check_box -%>
14
+ <input id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" type="checkbox">
15
+ <%- elsif attribute.field_type == :text_area -%>
16
+ <textarea id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" rows="3"></textarea>
17
+ <%- else -%>
18
+ <input type="text" id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>">
19
+ <%- end -%>
20
+ </div>
21
+ <%- end -%>
22
+ <% end -%>
23
+
24
+ <div>
25
+ <label for="password_box">Password</label>
26
+ <input id="password_box" name="query_password" placeholder="Choose a password..." type="password">
27
+ </div>
28
+
29
+ <div>
30
+ <label for="password_confirmation_box">Password Confirmation</label>
31
+ <input id="password_confirmation_box" name="query_password_confirmation" placeholder="Confirm your password..." type="password">
32
+ </div>
33
+
34
+ <button>
35
+ Sign up
36
+ </button>
37
+ </form>
38
+
39
+ <hr>
40
+
41
+ <p>
42
+ Or, <a href="/<%= singular_table_name.underscore %>_sign_in">Sign in</a> instead.
43
+ </p>
@@ -29,7 +29,7 @@ module Draft
29
29
  template "_flashes.html.erb", "app/views/shared/_flashes.html.erb"
30
30
 
31
31
  unless skip_cdn?
32
- template "_bootstrapcdn_assets.html.erb", "app/views/shared/_bootstrapcdn_assets.html.erb"
32
+ template "_cdn_assets.html.erb", "app/views/shared/_cdn_assets.html.erb"
33
33
  end
34
34
  end
35
35
 
@@ -50,7 +50,7 @@ module Draft
50
50
  end
51
51
 
52
52
  def app_resources
53
- route_names.reject { |name| /^rails_info.*/.match(name) || /^rails_mailers.*/.match(name) || name.pluralize != name }
53
+ route_names.reject { |name| /^rails_*/.match(name) || /batch_action*/.match(name) || /admin_*/.match(name) || name.pluralize != name }
54
54
  end
55
55
 
56
56
  def devise_routes
@@ -60,7 +60,7 @@ module Draft
60
60
  end
61
61
 
62
62
  def route_names
63
- @route_names ||= Rails.application.routes.routes.map(&:name).uniq.compact
63
+ @route_names ||= Rails.application.routes.routes.reject { |route| route.verb != "GET" }.map(&:name).uniq.compact
64
64
  end
65
65
  end
66
66
  end
@@ -0,0 +1,13 @@
1
+ <!-- Connect Bootstrap CSS -->
2
+ <% if bootswatch? -%>
3
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootswatch/4.3.1/<%= theme_name %>/bootstrap.min.css">
4
+ <% else -%>
5
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
6
+ <% end -%>
7
+
8
+ <!-- Connect Font Awesome CSS -->
9
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css">
10
+
11
+ <!-- Connect Bootstrap JavaScript and its dependencies -->
12
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
13
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"></script>
@@ -1,7 +1,7 @@
1
1
  <nav class="navbar navbar-expand-lg navbar-light bg-light mb-4">
2
2
  <div class="container">
3
3
  <a class="navbar-brand" href="/">
4
- <%= Rails.application.class.parent_name %>
4
+ <%= Rails.application.class.module_parent_name.underscore %>
5
5
  </a>
6
6
 
7
7
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsible-nav-links" aria-controls="collapsible-nav-links" aria-expanded="false" aria-label="Toggle navigation">
@@ -2,26 +2,27 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>
5
- <%= Rails.application.class.parent_name %>
5
+ <%= Rails.application.class.module_parent_name.underscore %>
6
6
  </title>
7
7
 
8
- <% unless skip_cdn? -%>
9
- <%%= render "shared/bootstrapcdn_assets" %>
8
+ <!-- Expand the number of characters we can use in the document beyond basic ASCII 🎉 -->
9
+ <meta charset="utf-8">
10
+
11
+ <!-- Make it responsive to small screens. Include only if you're using responsive CSS. -->
12
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
10
13
 
11
- <% end -%>
12
14
  <%%= csrf_meta_tags %>
13
-
14
- <%%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
15
- <%%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
16
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tempusdominus-bootstrap-4/5.0.0-alpha14/css/tempusdominus-bootstrap-4.min.css" />
17
- <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/tempusdominus-bootstrap-4/5.0.0-alpha14/js/tempusdominus-bootstrap-4.min.js"></script>
18
- <script src="//maps.google.com/maps/api/js?v=3.24&key=AIzaSyCOTPWiuvyyo6sKoIBzKA4-1ol-vTOIOlM"></script>
19
- <script src="//cdn.rawgit.com/mahnunchik/markerclustererplus/master/dist/markerclusterer.min.js"></script>
15
+ <%%= csp_meta_tag %>
20
16
 
17
+ <!-- Helper methods that create <link>s and <script>s for all of the stylesheets and javascript files in the non-`/public/` assets folders. -->
18
+ <%%= stylesheet_link_tag 'application', media: 'all' %>
19
+ <%%# javascript_pack_tag 'application' %>
20
+
21
+ <!-- Rendering a partial that has all the <link>s and <script>s for assets we are pulling from content-delivery networks. -->
22
+ <%%= render "shared/cdn_assets" %>
21
23
 
22
24
  <meta name="viewport" content="width=device-width, initial-scale=1">
23
25
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
24
- <meta charset="utf-8">
25
26
  <style>
26
27
  body { padding-bottom: 70px }
27
28
  </style>