godmin 1.0.0 → 1.1.0

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/.travis.yml +1 -0
  4. data/CHANGELOG.md +12 -0
  5. data/README.md +58 -8
  6. data/Rakefile +45 -16
  7. data/app/views/godmin/resource/show.html.erb +1 -1
  8. data/app/views/layouts/godmin/_layout.html.erb +1 -0
  9. data/app/views/layouts/godmin/application.html.erb +7 -1
  10. data/config/locales/en.yml +1 -1
  11. data/config/locales/pt-BR.yml +44 -0
  12. data/config/locales/sv.yml +1 -1
  13. data/godmin.gemspec +2 -1
  14. data/lib/generators/godmin/authentication/authentication_generator.rb +1 -1
  15. data/lib/godmin/application_controller.rb +1 -1
  16. data/lib/godmin/generators/named_base.rb +8 -0
  17. data/lib/godmin/resolver.rb +44 -18
  18. data/lib/godmin/resources/resource_controller.rb +17 -30
  19. data/lib/godmin/resources/resource_controller/batch_actions.rb +49 -0
  20. data/lib/godmin/version.rb +1 -1
  21. data/template.rb +180 -18
  22. data/test/dummy/admin/app/assets/javascripts/admin/application.js +1 -0
  23. data/test/dummy/app/assets/javascripts/application.js +1 -0
  24. data/test/dummy/app/controllers/application_controller.rb +2 -2
  25. data/test/dummy/app/controllers/articles_controller.rb +10 -0
  26. data/test/dummy/app/services/article_service.rb +31 -0
  27. data/test/dummy/app/services/secret_article_service.rb +0 -7
  28. data/test/dummy/db/migrate/20150717121532_create_articles.rb +1 -1
  29. data/test/dummy/db/schema.rb +3 -3
  30. data/test/integration/batch_actions_test.rb +51 -0
  31. data/test/integration/filters_test.rb +21 -0
  32. data/test/integration/scopes_test.rb +23 -0
  33. data/test/lib/godmin/resolver_test.rb +22 -8
  34. data/test/test_helper.rb +19 -3
  35. metadata +25 -3
@@ -1,12 +1,15 @@
1
1
  require "godmin/helpers/batch_actions"
2
2
  require "godmin/helpers/filters"
3
3
  require "godmin/helpers/tables"
4
+ require "godmin/resources/resource_controller/batch_actions"
4
5
 
5
6
  module Godmin
6
7
  module Resources
7
8
  module ResourceController
8
9
  extend ActiveSupport::Concern
9
10
 
11
+ include BatchActions
12
+
10
13
  included do
11
14
  helper Godmin::Helpers::BatchActions
12
15
  helper Godmin::Helpers::Filters
@@ -15,7 +18,7 @@ module Godmin
15
18
  before_action :set_resource_service
16
19
  before_action :set_resource_class
17
20
  before_action :set_resources, only: :index
18
- before_action :set_resource, only: [:show, :new, :edit, :create, :destroy]
21
+ before_action :set_resource, only: [:show, :new, :edit, :create, :update, :destroy]
19
22
  end
20
23
 
21
24
  def index
@@ -50,10 +53,6 @@ module Godmin
50
53
  end
51
54
 
52
55
  def update
53
- return if perform_batch_action
54
-
55
- set_resource
56
-
57
56
  respond_to do |format|
58
57
  if @resource_service.update_resource(@resource, resource_params)
59
58
  format.html { redirect_to redirect_after_update, notice: redirect_flash_message }
@@ -128,7 +127,19 @@ module Godmin
128
127
  end
129
128
 
130
129
  def resource_params
131
- params.require(resource_class.model_name.param_key.to_sym).permit(@resource_service.attrs_for_form)
130
+ params.require(@resource_class.model_name.param_key.to_sym).permit(resource_params_defaults)
131
+ end
132
+
133
+ def resource_params_defaults
134
+ @resource_service.attrs_for_form.map do |attribute|
135
+ association = @resource_class.reflect_on_association(attribute)
136
+
137
+ if association && association.macro == :belongs_to
138
+ association.foreign_key.to_sym
139
+ else
140
+ attribute
141
+ end
142
+ end
132
143
  end
133
144
 
134
145
  def redirect_after_create
@@ -150,30 +161,6 @@ module Godmin
150
161
  def redirect_flash_message
151
162
  translate_scoped("flash.#{action_name}", resource: @resource.class.model_name.human)
152
163
  end
153
-
154
- def perform_batch_action
155
- return false unless params[:batch_action].present?
156
-
157
- item_ids = params[:id].split(",").map(&:to_i)
158
- records = @resource_class.find(item_ids)
159
- if authorization_enabled?
160
- records = records.select { |r| policy(r).send("batch_action_#{params[:batch_action]}?") }
161
- end
162
-
163
- if @resource_service.batch_action(params[:batch_action], records)
164
- flash[:updated_ids] = item_ids
165
- flash[:notice] = translate_scoped("flash.batch_action",
166
- number_of_affected_records: records.length,
167
- total_number_of_records: item_ids.length,
168
- resource: @resource_class.model_name.human(count: item_ids.length))
169
-
170
- if respond_to?("redirect_after_batch_action_#{params[:batch_action]}", true)
171
- redirect_to send("redirect_after_batch_action_#{params[:batch_action]}") and return true
172
- end
173
- end
174
-
175
- redirect_to :back and return true
176
- end
177
164
  end
178
165
  end
179
166
  end
@@ -0,0 +1,49 @@
1
+ module Godmin
2
+ module Resources
3
+ module ResourceController
4
+ module BatchActions
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ prepend_before_action :perform_batch_action, only: :update
9
+ end
10
+
11
+ protected
12
+
13
+ def perform_batch_action
14
+ return unless params[:batch_action].present?
15
+
16
+ set_resource_service
17
+ set_resource_class
18
+
19
+ if authorization_enabled?
20
+ authorize(batch_action_records, "batch_action_#{params[:batch_action]}?")
21
+ end
22
+
23
+ if @resource_service.batch_action(params[:batch_action], batch_action_records)
24
+ flash[:notice] = translate_scoped(
25
+ "flash.batch_action", number_of_records: batch_action_ids.length,
26
+ resource: @resource_class.model_name.human(count: batch_action_ids.length)
27
+ )
28
+ flash[:updated_ids] = batch_action_ids
29
+
30
+ if respond_to?("redirect_after_batch_action_#{params[:batch_action]}", true)
31
+ redirect_to send("redirect_after_batch_action_#{params[:batch_action]}")
32
+ return
33
+ end
34
+ end
35
+
36
+ redirect_to :back
37
+ end
38
+
39
+ def batch_action_ids
40
+ @_batch_action_ids ||= params[:id].split(",").map(&:to_i)
41
+ end
42
+
43
+ def batch_action_records
44
+ @_batch_action_records ||= @resource_class.where(id: batch_action_ids)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,3 +1,3 @@
1
1
  module Godmin
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
data/template.rb CHANGED
@@ -7,9 +7,16 @@ def install_standalone
7
7
  generate_model
8
8
  generate("godmin:install")
9
9
  generate("godmin:resource", "article")
10
+ generate("godmin:resource", "author")
10
11
 
11
- modify_controller
12
- modify_service
12
+ modify_menu
13
+ modify_rakefile
14
+ modify_routes
15
+ modify_locales
16
+ modify_models
17
+ modify_author_service
18
+ modify_article_controller
19
+ modify_article_service
13
20
 
14
21
  migrate_and_seed
15
22
  end
@@ -23,7 +30,7 @@ def install_engine
23
30
 
24
31
  inject_into_file "admin/admin.gemspec", before: /^end/ do
25
32
  <<-END.strip_heredoc.indent(2)
26
- s.add_dependency "godmin", "> 0.12"
33
+ s.add_dependency "godmin", "~> 1.0.0"
27
34
  END
28
35
  end
29
36
 
@@ -33,6 +40,7 @@ def install_engine
33
40
  generate_model
34
41
  run_ruby_script("admin/bin/rails g godmin:install")
35
42
  run_ruby_script("admin/bin/rails g godmin:resource article")
43
+ run_ruby_script("admin/bin/rails g godmin:resource author")
36
44
 
37
45
  inject_into_file "config/routes.rb", before: /^end/ do
38
46
  <<-END.strip_heredoc.indent(2)
@@ -40,15 +48,22 @@ def install_engine
40
48
  END
41
49
  end
42
50
 
43
- modify_controller("admin")
44
- modify_service("admin")
51
+ modify_menu("admin")
52
+ modify_rakefile
53
+ modify_routes("admin")
54
+ modify_locales
55
+ modify_models
56
+ modify_author_service("admin")
57
+ modify_article_controller("admin")
58
+ modify_article_service("admin")
45
59
 
46
60
  migrate_and_seed
47
61
  end
48
62
  end
49
63
 
50
64
  def generate_model
51
- generate(:model, "article title:string body:text author:string published:boolean published_at:datetime")
65
+ generate(:model, "author name:string")
66
+ generate(:model, "article title:string body:text author:references published:boolean published_at:datetime")
52
67
 
53
68
  append_to_file "db/seeds.rb" do
54
69
  <<-END.strip_heredoc
@@ -61,21 +76,121 @@ def generate_model
61
76
  end
62
77
 
63
78
  def author
64
- ["Lorem Ipsum", "Magna Aliqua", "Commodo Consequat"].sample
79
+ Author.all.sample
65
80
  end
66
81
 
67
82
  def published
68
83
  [true, true, false].sample
69
84
  end
70
85
 
86
+ def published_at
87
+ Time.now - [0, 1, 2, 3, 4, 5].sample.days
88
+ end
89
+
90
+ ["Lorem Ipsum", "Magna Aliqua", "Commodo Consequat"].each do |name|
91
+ Author.create name: name
92
+ end
93
+
71
94
  35.times do |i|
72
- Article.create! title: title, author: author, published: published
95
+ Article.create! title: title, author: author, published: published, published_at: published_at
73
96
  end
74
97
  END
75
98
  end
76
99
  end
77
100
 
78
- def modify_controller(namespace = nil)
101
+ def modify_menu(namespace = nil)
102
+ navigation_file =
103
+ if namespace
104
+ "admin/app/views/admin/shared/_navigation_aside.html.erb"
105
+ else
106
+ "app/views/shared/_navigation_aside.html.erb"
107
+ end
108
+
109
+ create_file navigation_file do
110
+ <<-END.strip_heredoc
111
+ <%= navbar_dropdown "Take me places" do %>
112
+ <%= navbar_item "Godmin on Github", "https://github.com/varvet/godmin" %>
113
+ <%= navbar_item "The source of this page!", "https://github.com/varvet/godmin-sandbox" %>
114
+ <%= navbar_item "The blog post", "https://www.varvet.se/blog/update/2015/11/13/introducing-godmin-1-0.html" %>
115
+ <%= navbar_divider %>
116
+ <%= navbar_item "Please retweet ;)", "https://twitter.com/varvet/status/665092299995676672" %>
117
+ <% end %>
118
+ END
119
+ end
120
+ end
121
+
122
+ def modify_rakefile
123
+ append_to_file "RakeFile" do
124
+ <<-END.strip_heredoc
125
+
126
+ namespace :sandbox do
127
+ desc "Reseed the database"
128
+ task reseed: :environment do
129
+ Rake::Task["sandbox:reset"].invoke
130
+ Rake::Task["db:schema:load"].invoke
131
+ Rake::Task["db:seed"].invoke
132
+ end
133
+ desc "Reset the database"
134
+ task reset: :environment do
135
+ ActiveRecord::Base.connection.tables.each do |table|
136
+ if table != "schema_migrations"
137
+ query = "DROP TABLE IF EXISTS \#{table} CASCADE;"
138
+ ActiveRecord::Base.connection.execute(query)
139
+ end
140
+ end
141
+ end
142
+ end
143
+ END
144
+ end
145
+ end
146
+
147
+ def modify_locales
148
+ append_to_file "config/locales/en.yml" do
149
+ <<-END.strip_heredoc.indent(2)
150
+
151
+ activerecord:
152
+ models:
153
+ article:
154
+ one: Article
155
+ other: Articles
156
+ author:
157
+ one: Author
158
+ other: Authors
159
+ END
160
+ end
161
+ end
162
+
163
+ def modify_routes(namespace = nil)
164
+ routes_file =
165
+ if namespace
166
+ "admin/config/routes.rb"
167
+ else
168
+ "config/routes.rb"
169
+ end
170
+
171
+ gsub_file routes_file, "application#welcome", "articles#index"
172
+ end
173
+
174
+ def modify_models
175
+ inject_into_file "app/models/article.rb", before: "end" do
176
+ <<-END.strip_heredoc.indent(2)
177
+
178
+ def to_s
179
+ title
180
+ end
181
+ END
182
+ end
183
+
184
+ inject_into_file "app/models/author.rb", before: "end" do
185
+ <<-END.strip_heredoc.indent(2)
186
+ def to_s
187
+ name
188
+ end
189
+ END
190
+ end
191
+ end
192
+
193
+ def modify_article_controller(namespace = nil)
79
194
  articles_controller =
80
195
  if namespace
81
196
  "admin/app/controllers/admin/articles_controller.rb"
@@ -99,7 +214,7 @@ def modify_controller(namespace = nil)
99
214
  end
100
215
  end
101
216
 
102
- def modify_service(namespace = nil)
217
+ def modify_article_service(namespace = nil)
103
218
  article_service =
104
219
  if namespace
105
220
  "admin/app/services/admin/article_service.rb"
@@ -127,10 +242,10 @@ def modify_service(namespace = nil)
127
242
  end
128
243
 
129
244
  filter :title
130
- filter :author
245
+ filter :author, as: :select, collection: -> { Author.all }, option_text: "name"
131
246
 
132
247
  def filter_title(articles, value)
133
- articles.where(title: value)
248
+ articles.where("title LIKE ?", "%\#{value}%")
134
249
  end
135
250
 
136
251
  def filter_author(articles, value)
@@ -142,27 +257,74 @@ def modify_service(namespace = nil)
142
257
  batch_action :destroy, confirm: true
143
258
 
144
259
  def batch_action_unpublish(articles)
145
- articles.each { |a| a.update(published: false) }
260
+ articles.update_all(published: false)
146
261
  end
147
262
 
148
263
  def batch_action_publish(articles)
149
- articles.each { |a| a.update(published: true) }
264
+ articles.update_all(published: true)
150
265
  end
151
266
 
152
267
  def batch_action_destroy(articles)
153
- articles.each { |a| a.destroy }
268
+ articles.destroy_all
269
+ end
270
+
271
+ def per_page
272
+ 15
154
273
  end
155
274
  END
156
275
  end
157
276
  end
158
277
 
278
+ def modify_author_service(namespace = nil)
279
+ author_service =
280
+ if namespace
281
+ "admin/app/services/admin/author_service.rb"
282
+ else
283
+ "app/services/author_service.rb"
284
+ end
285
+
286
+ gsub_file author_service, "attrs_for_index", "attrs_for_index :name"
287
+ gsub_file author_service, "attrs_for_show", "attrs_for_show :name"
288
+ gsub_file author_service, "attrs_for_form", "attrs_for_form :name"
289
+
290
+ inject_into_file author_service, after: "attrs_for_form :name \n" do
291
+ <<-END.strip_heredoc.indent(namespace ? 4 : 2)
292
+ attrs_for_export :id, :name
293
+
294
+ filter :name
295
+
296
+ def filter_name(authors, value)
297
+ authors.where("name LIKE ?", "%\#{value}%")
298
+ end
299
+
300
+ batch_action :destroy, confirm: true
301
+
302
+ def batch_action_destroy(authors)
303
+ authors.each { |a| a.destroy }
304
+ end
305
+ END
306
+ end
307
+ end
159
308
  def migrate_and_seed
309
+ rake("db:drop")
310
+ rake("db:create")
160
311
  rake("db:migrate")
161
312
  rake("db:seed")
162
313
  end
163
314
 
164
- if yes?("Place godmin in admin engine?")
165
- install_engine
315
+ with_engine = "--with-engine"
316
+ without_engine = "--without-engine"
317
+
318
+ if ARGV.count > (ARGV - [with_engine, without_engine]).count
319
+ if ARGV.include? with_engine
320
+ install_engine
321
+ elsif ARGV.include? without_engine
322
+ install_standalone
323
+ end
166
324
  else
167
- install_standalone
325
+ if yes?("Place godmin in admin engine?")
326
+ install_engine
327
+ else
328
+ install_standalone
329
+ end
168
330
  end
@@ -10,5 +10,6 @@
10
10
  // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
11
  // about supported directives.
12
12
  //
13
+ //= require moment
13
14
  //= require godmin
14
15
  //= require_tree .
@@ -10,5 +10,6 @@
10
10
  // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
11
  // about supported directives.
12
12
  //
13
+ //= require moment
13
14
  //= require godmin
14
15
  //= require_tree .
@@ -1,7 +1,7 @@
1
1
  class ApplicationController < ActionController::Base
2
+ include Godmin::ApplicationController
3
+
2
4
  # Prevent CSRF attacks by raising an exception.
3
5
  # For APIs, you may want to use :null_session instead.
4
6
  protect_from_forgery with: :exception
5
-
6
- include Godmin::ApplicationController
7
7
  end