administrate 0.8.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of administrate might be problematic. Click here for more details.

Files changed (62) hide show
  1. checksums.yaml +5 -5
  2. data/app/assets/stylesheets/administrate/components/_cells.scss +2 -6
  3. data/app/assets/stylesheets/docs.scss +1 -0
  4. data/app/controllers/administrate/application_controller.rb +35 -3
  5. data/app/controllers/concerns/administrate/punditize.rb +36 -0
  6. data/app/helpers/administrate/application_helper.rb +9 -4
  7. data/app/views/administrate/application/_collection.html.erb +9 -7
  8. data/app/views/administrate/application/_form.html.erb +5 -2
  9. data/app/views/administrate/application/_navigation.html.erb +1 -1
  10. data/app/views/administrate/application/edit.html.erb +3 -3
  11. data/app/views/administrate/application/index.html.erb +5 -2
  12. data/app/views/administrate/application/new.html.erb +6 -1
  13. data/app/views/administrate/application/show.html.erb +3 -3
  14. data/app/views/fields/has_many/_index.html.erb +1 -1
  15. data/app/views/fields/polymorphic/_form.html.erb +11 -6
  16. data/app/views/fields/polymorphic/_show.html.erb +8 -4
  17. data/config/locales/administrate.ar.yml +6 -6
  18. data/config/locales/administrate.bs.yml +27 -0
  19. data/config/locales/administrate.ca.yml +28 -0
  20. data/config/locales/administrate.da.yml +6 -6
  21. data/config/locales/administrate.de.yml +8 -8
  22. data/config/locales/administrate.en.yml +6 -6
  23. data/config/locales/administrate.es.yml +6 -6
  24. data/config/locales/administrate.fr.yml +6 -6
  25. data/config/locales/administrate.it.yml +6 -6
  26. data/config/locales/administrate.ja.yml +6 -6
  27. data/config/locales/administrate.ko.yml +6 -6
  28. data/config/locales/administrate.nl.yml +6 -6
  29. data/config/locales/administrate.pl.yml +6 -6
  30. data/config/locales/administrate.pt-BR.yml +6 -6
  31. data/config/locales/administrate.pt.yml +6 -6
  32. data/config/locales/administrate.ru.yml +6 -6
  33. data/config/locales/administrate.sv.yml +6 -6
  34. data/config/locales/administrate.uk.yml +6 -6
  35. data/config/locales/administrate.vi.yml +6 -6
  36. data/config/locales/administrate.zh-CN.yml +6 -6
  37. data/config/locales/administrate.zh-TW.yml +6 -6
  38. data/docs/authorization.md +69 -0
  39. data/docs/customizing_attribute_partials.md +20 -1
  40. data/docs/customizing_dashboards.md +54 -0
  41. data/docs/getting_started.md +82 -1
  42. data/lib/administrate/field/associative.rb +4 -0
  43. data/lib/administrate/field/base.rb +1 -1
  44. data/lib/administrate/field/belongs_to.rb +4 -3
  45. data/lib/administrate/field/date_time.rb +13 -2
  46. data/lib/administrate/field/deferred.rb +6 -5
  47. data/lib/administrate/field/has_many.rb +2 -2
  48. data/lib/administrate/field/has_one.rb +16 -8
  49. data/lib/administrate/field/polymorphic.rb +41 -3
  50. data/lib/administrate/order.rb +38 -5
  51. data/lib/administrate/resource_resolver.rb +2 -2
  52. data/lib/administrate/search.rb +1 -1
  53. data/lib/administrate/version.rb +1 -1
  54. data/lib/generators/administrate/dashboard/USAGE +1 -1
  55. data/lib/generators/administrate/dashboard/dashboard_generator.rb +7 -1
  56. data/lib/generators/administrate/dashboard/templates/controller.rb.erb +2 -2
  57. data/lib/generators/administrate/install/install_generator.rb +13 -6
  58. data/lib/generators/administrate/install/templates/{application_controller.rb → application_controller.rb.erb} +1 -1
  59. data/lib/generators/administrate/routes/routes_generator.rb +5 -0
  60. data/lib/generators/administrate/routes/templates/routes.rb.erb +1 -1
  61. data/lib/generators/administrate/views/field_generator.rb +19 -5
  62. metadata +8 -4
@@ -2,11 +2,49 @@ require_relative "associative"
2
2
 
3
3
  module Administrate
4
4
  module Field
5
- class Polymorphic < Associative
5
+ class Polymorphic < BelongsTo
6
+ def associated_resource_grouped_options
7
+ classes.map do |klass|
8
+ [klass.to_s, candidate_resources_for(klass).map do |resource|
9
+ [display_candidate_resource(resource), resource.to_global_id]
10
+ end]
11
+ end
12
+ end
13
+
14
+ def self.permitted_attribute(attr, _options = nil)
15
+ { attr => %i{type value} }
16
+ end
17
+
18
+ def permitted_attribute
19
+ { attribute => %i{type value} }
20
+ end
21
+
22
+ def selected_global_id
23
+ data ? data.to_global_id : nil
24
+ end
25
+
6
26
  protected
7
27
 
8
- def associated_dashboard
9
- "#{data.class.name}Dashboard".constantize.new
28
+ def associated_dashboard(klass = data.class)
29
+ "#{klass.name}Dashboard".constantize.new
30
+ end
31
+
32
+ def classes
33
+ options.fetch(:classes) || []
34
+ end
35
+
36
+ private
37
+
38
+ def order
39
+ @_order ||= options.delete(:order)
40
+ end
41
+
42
+ def candidate_resources_for(klass)
43
+ order ? klass.order(order) : klass.all
44
+ end
45
+
46
+ def display_candidate_resource(resource)
47
+ associated_dashboard(resource.class).display_resource(resource)
10
48
  end
11
49
  end
12
50
  end
@@ -6,11 +6,13 @@ module Administrate
6
6
  end
7
7
 
8
8
  def apply(relation)
9
- if relation.columns_hash.keys.include?(attribute.to_s)
10
- relation.order("#{attribute} #{direction}")
11
- else
12
- relation
13
- end
9
+ return order_by_association(relation) unless
10
+ reflect_association(relation).nil?
11
+
12
+ return relation.reorder("#{attribute} #{direction}") if
13
+ relation.columns_hash.keys.include?(attribute.to_s)
14
+
15
+ relation
14
16
  end
15
17
 
16
18
  def ordered_by?(attr)
@@ -41,5 +43,36 @@ module Administrate
41
43
  def opposite_direction
42
44
  direction.to_sym == :asc ? :desc : :asc
43
45
  end
46
+
47
+ def order_by_association(relation)
48
+ return order_by_count(relation) if has_many_attribute?(relation)
49
+
50
+ return order_by_id(relation) if belongs_to_attribute?(relation)
51
+
52
+ relation
53
+ end
54
+
55
+ def order_by_count(relation)
56
+ relation.
57
+ left_joins(attribute.to_sym).
58
+ group(:id).
59
+ reorder("COUNT(#{attribute}.id) #{direction}")
60
+ end
61
+
62
+ def order_by_id(relation)
63
+ relation.reorder("#{attribute}_id #{direction}")
64
+ end
65
+
66
+ def has_many_attribute?(relation)
67
+ reflect_association(relation).macro == :has_many
68
+ end
69
+
70
+ def belongs_to_attribute?(relation)
71
+ reflect_association(relation).macro == :belongs_to
72
+ end
73
+
74
+ def reflect_association(relation)
75
+ relation.klass.reflect_on_association(attribute.to_s)
76
+ end
44
77
  end
45
78
  end
@@ -5,7 +5,7 @@ module Administrate
5
5
  end
6
6
 
7
7
  def dashboard_class
8
- Object.const_get(resource_class_name + "Dashboard")
8
+ ActiveSupport::Inflector.constantize("#{resource_class_name}Dashboard")
9
9
  end
10
10
 
11
11
  def namespace
@@ -13,7 +13,7 @@ module Administrate
13
13
  end
14
14
 
15
15
  def resource_class
16
- Object.const_get(resource_class_name)
16
+ ActiveSupport::Inflector.constantize(resource_class_name)
17
17
  end
18
18
 
19
19
  def resource_name
@@ -24,7 +24,7 @@ module Administrate
24
24
  table_name = ActiveRecord::Base.connection.
25
25
  quote_table_name(@scoped_resource.table_name)
26
26
  attr_name = ActiveRecord::Base.connection.quote_column_name(attr)
27
- "lower(#{table_name}.#{attr_name}) LIKE ?"
27
+ "LOWER(TEXT(#{table_name}.#{attr_name})) LIKE ?"
28
28
  end.join(" OR ")
29
29
  end
30
30
 
@@ -1,3 +1,3 @@
1
1
  module Administrate
2
- VERSION = "0.8.1".freeze
2
+ VERSION = "0.9.0".freeze
3
3
  end
@@ -3,7 +3,7 @@ Description:
3
3
  pulling the attributes from database columns.
4
4
 
5
5
  Example:
6
- rails generate administrate:dashboard FooBar
6
+ rails generate administrate:dashboard FooBar [--namespace admin]
7
7
 
8
8
  This will create:
9
9
  app/dashboards/foo_bar_dashboard.rb
@@ -24,6 +24,8 @@ module Administrate
24
24
  COLLECTION_ATTRIBUTE_LIMIT = 4
25
25
  READ_ONLY_ATTRIBUTES = %w[id created_at updated_at]
26
26
 
27
+ class_option :namespace, type: :string, default: "admin"
28
+
27
29
  source_root File.expand_path("../templates", __FILE__)
28
30
 
29
31
  def create_dashboard_definition
@@ -35,7 +37,7 @@ module Administrate
35
37
 
36
38
  def create_resource_controller
37
39
  destination = Rails.root.join(
38
- "app/controllers/admin/#{file_name.pluralize}_controller.rb",
40
+ "app/controllers/#{namespace}/#{file_name.pluralize}_controller.rb",
39
41
  )
40
42
 
41
43
  template("controller.rb.erb", destination)
@@ -43,6 +45,10 @@ module Administrate
43
45
 
44
46
  private
45
47
 
48
+ def namespace
49
+ options[:namespace]
50
+ end
51
+
46
52
  def attributes
47
53
  klass.reflections.keys + klass.attribute_names - redundant_attributes
48
54
  end
@@ -1,5 +1,5 @@
1
- module Admin
2
- class <%= class_name.pluralize %>Controller < Admin::ApplicationController
1
+ module <%= namespace.classify %>
2
+ class <%= class_name.pluralize %>Controller < <%= namespace.classify %>::ApplicationController
3
3
  # To customize the behavior of this controller,
4
4
  # you can overwrite any of the RESTful actions. For example:
5
5
  #
@@ -8,34 +8,41 @@ module Administrate
8
8
  include Administrate::GeneratorHelpers
9
9
  source_root File.expand_path("../templates", __FILE__)
10
10
 
11
+ class_option :namespace, type: :string, default: "admin"
12
+
11
13
  def run_routes_generator
12
14
  if dashboard_resources.none?
13
- call_generator("administrate:routes")
15
+ call_generator("administrate:routes", "--namespace", namespace)
14
16
  load Rails.root.join("config/routes.rb")
15
17
  end
16
18
  end
17
19
 
18
20
  def create_dashboard_controller
19
- copy_file(
20
- "application_controller.rb",
21
- "app/controllers/admin/application_controller.rb"
21
+ template(
22
+ "application_controller.rb.erb",
23
+ "app/controllers/#{namespace}/application_controller.rb",
22
24
  )
23
25
  end
24
26
 
25
27
  def run_dashboard_generators
26
28
  singular_dashboard_resources.each do |resource|
27
- call_generator("administrate:dashboard", resource)
29
+ call_generator "administrate:dashboard", resource,
30
+ "--namespace", namespace
28
31
  end
29
32
  end
30
33
 
31
34
  private
32
35
 
36
+ def namespace
37
+ options[:namespace]
38
+ end
39
+
33
40
  def singular_dashboard_resources
34
41
  dashboard_resources.map(&:to_s).map(&:singularize)
35
42
  end
36
43
 
37
44
  def dashboard_resources
38
- Administrate::Namespace.new(:admin).resources
45
+ Administrate::Namespace.new(namespace).resources
39
46
  end
40
47
  end
41
48
  end
@@ -4,7 +4,7 @@
4
4
  #
5
5
  # If you want to add pagination or other controller-level concerns,
6
6
  # you're free to overwrite the RESTful controller actions.
7
- module Admin
7
+ module <%= namespace.classify %>
8
8
  class ApplicationController < Administrate::ApplicationController
9
9
  before_action :authenticate_admin
10
10
 
@@ -6,6 +6,7 @@ module Administrate
6
6
  module Generators
7
7
  class RoutesGenerator < Rails::Generators::Base
8
8
  source_root File.expand_path("../templates", __FILE__)
9
+ class_option :namespace, type: :string, default: "admin"
9
10
 
10
11
  def insert_dashboard_routes
11
12
  if should_route_dashboard?
@@ -32,6 +33,10 @@ module Administrate
32
33
 
33
34
  private
34
35
 
36
+ def namespace
37
+ options[:namespace]
38
+ end
39
+
35
40
  def dashboard_resources
36
41
  valid_dashboard_models.map do |model|
37
42
  model.to_s.pluralize.underscore
@@ -1,4 +1,4 @@
1
- namespace :admin do
1
+ namespace :<%= namespace %> do
2
2
  <% dashboard_resources.each do |resource| %> resources :<%= resource %>
3
3
  <%end%>
4
4
  root to: "<%= dashboard_resources.first %>#index"
@@ -14,15 +14,29 @@ module Administrate
14
14
  source_root template_source_path
15
15
 
16
16
  def copy_partials
17
- copy_field_partial(:index)
18
- copy_field_partial(:show)
19
- copy_field_partial(:form)
17
+ resource_path = args.first.try(:underscore)
18
+
19
+ if resource_path == "all"
20
+ entries = Dir.entries(self.class.template_source_path)
21
+ field_types = entries.reject { |name| name[0] == "." }
22
+
23
+ field_types.each do |field_type|
24
+ copy_field_partials(field_type)
25
+ end
26
+ else
27
+ copy_field_partials(resource_path)
28
+ end
20
29
  end
21
30
 
22
31
  private
23
32
 
24
- def copy_field_partial(partial_name)
25
- resource_path = args.first.try(:underscore)
33
+ def copy_field_partials(resource_path)
34
+ copy_field_partial(resource_path, :index)
35
+ copy_field_partial(resource_path, :show)
36
+ copy_field_partial(resource_path, :form)
37
+ end
38
+
39
+ def copy_field_partial(resource_path, partial_name)
26
40
  template_file = "#{resource_path}/_#{partial_name}.html.erb"
27
41
 
28
42
  copy_file(
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: administrate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Charlton
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-07-14 00:00:00.000000000 Z
12
+ date: 2018-02-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -218,6 +218,7 @@ files:
218
218
  - app/assets/stylesheets/administrate/utilities/_text-color.scss
219
219
  - app/assets/stylesheets/docs.scss
220
220
  - app/controllers/administrate/application_controller.rb
221
+ - app/controllers/concerns/administrate/punditize.rb
221
222
  - app/helpers/administrate/application_helper.rb
222
223
  - app/views/administrate/application/_collection.html.erb
223
224
  - app/views/administrate/application/_flashes.html.erb
@@ -267,6 +268,8 @@ files:
267
268
  - app/views/layouts/administrate/application.html.erb
268
269
  - config/i18n-tasks.yml
269
270
  - config/locales/administrate.ar.yml
271
+ - config/locales/administrate.bs.yml
272
+ - config/locales/administrate.ca.yml
270
273
  - config/locales/administrate.da.yml
271
274
  - config/locales/administrate.de.yml
272
275
  - config/locales/administrate.en.yml
@@ -290,6 +293,7 @@ files:
290
293
  - config/unicorn.rb
291
294
  - docs/adding_custom_field_types.md
292
295
  - docs/authentication.md
296
+ - docs/authorization.md
293
297
  - docs/customizing_attribute_partials.md
294
298
  - docs/customizing_controller_actions.md
295
299
  - docs/customizing_dashboards.md
@@ -338,7 +342,7 @@ files:
338
342
  - lib/generators/administrate/field/templates/_show.html.erb
339
343
  - lib/generators/administrate/field/templates/field_object.rb.erb
340
344
  - lib/generators/administrate/install/install_generator.rb
341
- - lib/generators/administrate/install/templates/application_controller.rb
345
+ - lib/generators/administrate/install/templates/application_controller.rb.erb
342
346
  - lib/generators/administrate/routes/routes_generator.rb
343
347
  - lib/generators/administrate/routes/templates/routes.rb.erb
344
348
  - lib/generators/administrate/views/edit_generator.rb
@@ -371,7 +375,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
371
375
  version: '0'
372
376
  requirements: []
373
377
  rubyforge_project:
374
- rubygems_version: 2.6.11
378
+ rubygems_version: 2.7.3
375
379
  signing_key:
376
380
  specification_version: 4
377
381
  summary: A Rails engine for creating super-flexible admin dashboards