rails_admin 3.0.0 → 3.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/README.md +4 -2
  4. data/Rakefile +2 -0
  5. data/app/assets/javascripts/rails_admin/{application.js → application.js.erb} +8 -0
  6. data/app/assets/stylesheets/rails_admin/{application.scss → application.scss.erb} +4 -0
  7. data/app/controllers/rails_admin/application_controller.rb +2 -0
  8. data/app/controllers/rails_admin/main_controller.rb +9 -14
  9. data/app/helpers/rails_admin/application_helper.rb +37 -9
  10. data/app/helpers/rails_admin/form_builder.rb +10 -0
  11. data/app/helpers/rails_admin/main_helper.rb +7 -15
  12. data/app/views/layouts/rails_admin/_head.html.erb +12 -3
  13. data/app/views/layouts/rails_admin/_secondary_navigation.html.erb +3 -1
  14. data/app/views/layouts/rails_admin/_sidebar_navigation.html.erb +1 -1
  15. data/app/views/layouts/rails_admin/application.html.erb +4 -1
  16. data/app/views/rails_admin/main/_dashboard_history.html.erb +1 -1
  17. data/app/views/rails_admin/main/_form_action_text.html.erb +2 -1
  18. data/app/views/rails_admin/main/_form_file_upload.html.erb +1 -1
  19. data/app/views/rails_admin/main/_form_filtering_multiselect.html.erb +2 -2
  20. data/app/views/rails_admin/main/_form_filtering_select.html.erb +1 -1
  21. data/app/views/rails_admin/main/_form_multiple_file_upload.html.erb +1 -1
  22. data/app/views/rails_admin/main/dashboard.html.erb +2 -2
  23. data/app/views/rails_admin/main/history.html.erb +1 -1
  24. data/app/views/rails_admin/main/index.html.erb +7 -19
  25. data/config/initializers/active_record_extensions.rb +26 -3
  26. data/config/initializers/mongoid_extensions.rb +2 -0
  27. data/config/locales/rails_admin.en.yml +3 -2
  28. data/config/routes.rb +2 -0
  29. data/lib/generators/rails_admin/importmap_formatter.rb +28 -0
  30. data/lib/generators/rails_admin/install_generator.rb +71 -9
  31. data/lib/generators/rails_admin/templates/rails_admin.js +1 -0
  32. data/lib/generators/rails_admin/templates/rails_admin.scss.erb +1 -0
  33. data/lib/generators/rails_admin/templates/rails_admin.webpacker.js +2 -0
  34. data/lib/generators/rails_admin/utils.rb +2 -0
  35. data/lib/rails_admin/abstract_model.rb +9 -2
  36. data/lib/rails_admin/adapters/active_record/association.rb +11 -1
  37. data/lib/rails_admin/adapters/active_record/object_extension.rb +2 -0
  38. data/lib/rails_admin/adapters/active_record/property.rb +2 -0
  39. data/lib/rails_admin/adapters/active_record.rb +25 -2
  40. data/lib/rails_admin/adapters/composite_primary_keys/association.rb +45 -0
  41. data/lib/rails_admin/adapters/composite_primary_keys.rb +40 -0
  42. data/lib/rails_admin/adapters/mongoid/association.rb +14 -4
  43. data/lib/rails_admin/adapters/mongoid/bson.rb +2 -0
  44. data/lib/rails_admin/adapters/mongoid/extension.rb +3 -3
  45. data/lib/rails_admin/adapters/mongoid/object_extension.rb +2 -0
  46. data/lib/rails_admin/adapters/mongoid/property.rb +2 -0
  47. data/lib/rails_admin/adapters/mongoid.rb +4 -2
  48. data/lib/rails_admin/config/actions/base.rb +2 -0
  49. data/lib/rails_admin/config/actions/bulk_delete.rb +2 -0
  50. data/lib/rails_admin/config/actions/dashboard.rb +2 -0
  51. data/lib/rails_admin/config/actions/delete.rb +2 -0
  52. data/lib/rails_admin/config/actions/edit.rb +2 -0
  53. data/lib/rails_admin/config/actions/export.rb +2 -0
  54. data/lib/rails_admin/config/actions/history_index.rb +2 -0
  55. data/lib/rails_admin/config/actions/history_show.rb +2 -0
  56. data/lib/rails_admin/config/actions/index.rb +2 -0
  57. data/lib/rails_admin/config/actions/new.rb +2 -0
  58. data/lib/rails_admin/config/actions/show.rb +2 -0
  59. data/lib/rails_admin/config/actions/show_in_app.rb +2 -0
  60. data/lib/rails_admin/config/actions.rb +2 -0
  61. data/lib/rails_admin/config/configurable.rb +2 -0
  62. data/lib/rails_admin/config/const_load_suppressor.rb +78 -0
  63. data/lib/rails_admin/config/fields/association.rb +2 -0
  64. data/lib/rails_admin/config/fields/base.rb +44 -14
  65. data/lib/rails_admin/config/fields/factories/action_text.rb +2 -0
  66. data/lib/rails_admin/config/fields/factories/active_storage.rb +2 -0
  67. data/lib/rails_admin/config/fields/factories/association.rb +6 -5
  68. data/lib/rails_admin/config/fields/factories/carrierwave.rb +2 -0
  69. data/lib/rails_admin/config/fields/factories/devise.rb +2 -0
  70. data/lib/rails_admin/config/fields/factories/dragonfly.rb +2 -0
  71. data/lib/rails_admin/config/fields/factories/enum.rb +2 -0
  72. data/lib/rails_admin/config/fields/factories/paperclip.rb +2 -0
  73. data/lib/rails_admin/config/fields/factories/password.rb +2 -0
  74. data/lib/rails_admin/config/fields/factories/shrine.rb +2 -0
  75. data/lib/rails_admin/config/fields/group.rb +2 -0
  76. data/lib/rails_admin/config/fields/types/action_text.rb +6 -0
  77. data/lib/rails_admin/config/fields/types/active_record_enum.rb +2 -0
  78. data/lib/rails_admin/config/fields/types/active_storage.rb +14 -0
  79. data/lib/rails_admin/config/fields/types/all.rb +3 -0
  80. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +7 -5
  81. data/lib/rails_admin/config/fields/types/boolean.rb +7 -1
  82. data/lib/rails_admin/config/fields/types/bson_object_id.rb +2 -0
  83. data/lib/rails_admin/config/fields/types/carrierwave.rb +2 -0
  84. data/lib/rails_admin/config/fields/types/citext.rb +2 -0
  85. data/lib/rails_admin/config/fields/types/ck_editor.rb +2 -0
  86. data/lib/rails_admin/config/fields/types/code_mirror.rb +2 -0
  87. data/lib/rails_admin/config/fields/types/color.rb +2 -0
  88. data/lib/rails_admin/config/fields/types/composite_keys_belongs_to_association.rb +31 -0
  89. data/lib/rails_admin/config/fields/types/date.rb +2 -0
  90. data/lib/rails_admin/config/fields/types/datetime.rb +12 -0
  91. data/lib/rails_admin/config/fields/types/decimal.rb +2 -0
  92. data/lib/rails_admin/config/fields/types/dragonfly.rb +2 -0
  93. data/lib/rails_admin/config/fields/types/enum.rb +15 -2
  94. data/lib/rails_admin/config/fields/types/file_upload.rb +2 -0
  95. data/lib/rails_admin/config/fields/types/float.rb +2 -0
  96. data/lib/rails_admin/config/fields/types/froala.rb +2 -0
  97. data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +2 -0
  98. data/lib/rails_admin/config/fields/types/has_many_association.rb +2 -0
  99. data/lib/rails_admin/config/fields/types/has_one_association.rb +7 -1
  100. data/lib/rails_admin/config/fields/types/hidden.rb +2 -0
  101. data/lib/rails_admin/config/fields/types/inet.rb +2 -0
  102. data/lib/rails_admin/config/fields/types/integer.rb +2 -0
  103. data/lib/rails_admin/config/fields/types/json.rb +2 -0
  104. data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +22 -0
  105. data/lib/rails_admin/config/fields/types/multiple_carrierwave.rb +2 -0
  106. data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +2 -0
  107. data/lib/rails_admin/config/fields/types/numeric.rb +6 -0
  108. data/lib/rails_admin/config/fields/types/paperclip.rb +2 -0
  109. data/lib/rails_admin/config/fields/types/password.rb +2 -0
  110. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +2 -0
  111. data/lib/rails_admin/config/fields/types/serialized.rb +2 -0
  112. data/lib/rails_admin/config/fields/types/shrine.rb +2 -0
  113. data/lib/rails_admin/config/fields/types/simple_mde.rb +2 -0
  114. data/lib/rails_admin/config/fields/types/string.rb +2 -0
  115. data/lib/rails_admin/config/fields/types/string_like.rb +6 -0
  116. data/lib/rails_admin/config/fields/types/text.rb +2 -0
  117. data/lib/rails_admin/config/fields/types/time.rb +6 -0
  118. data/lib/rails_admin/config/fields/types/timestamp.rb +2 -0
  119. data/lib/rails_admin/config/fields/types/uuid.rb +2 -0
  120. data/lib/rails_admin/config/fields/types/wysihtml5.rb +2 -0
  121. data/lib/rails_admin/config/fields/types.rb +2 -0
  122. data/lib/rails_admin/config/fields.rb +3 -1
  123. data/lib/rails_admin/config/groupable.rb +2 -0
  124. data/lib/rails_admin/config/has_description.rb +2 -0
  125. data/lib/rails_admin/config/has_fields.rb +3 -1
  126. data/lib/rails_admin/config/has_groups.rb +2 -0
  127. data/lib/rails_admin/config/hideable.rb +2 -0
  128. data/lib/rails_admin/config/inspectable.rb +2 -0
  129. data/lib/rails_admin/config/lazy_model.rb +74 -0
  130. data/lib/rails_admin/config/model.rb +5 -1
  131. data/lib/rails_admin/config/proxyable/proxy.rb +2 -0
  132. data/lib/rails_admin/config/proxyable.rb +2 -0
  133. data/lib/rails_admin/config/sections/base.rb +2 -0
  134. data/lib/rails_admin/config/sections/create.rb +2 -0
  135. data/lib/rails_admin/config/sections/edit.rb +2 -0
  136. data/lib/rails_admin/config/sections/export.rb +2 -0
  137. data/lib/rails_admin/config/sections/list.rb +6 -0
  138. data/lib/rails_admin/config/sections/modal.rb +2 -0
  139. data/lib/rails_admin/config/sections/nested.rb +2 -0
  140. data/lib/rails_admin/config/sections/show.rb +2 -0
  141. data/lib/rails_admin/config/sections/update.rb +2 -0
  142. data/lib/rails_admin/config/sections.rb +2 -0
  143. data/lib/rails_admin/config.rb +30 -42
  144. data/lib/rails_admin/engine.rb +19 -17
  145. data/lib/rails_admin/extension.rb +2 -0
  146. data/lib/rails_admin/extensions/cancancan/authorization_adapter.rb +21 -4
  147. data/lib/rails_admin/extensions/cancancan.rb +2 -0
  148. data/lib/rails_admin/extensions/controller_extension.rb +2 -0
  149. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +49 -27
  150. data/lib/rails_admin/extensions/paper_trail.rb +2 -0
  151. data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +2 -0
  152. data/lib/rails_admin/extensions/pundit.rb +2 -0
  153. data/lib/rails_admin/support/csv_converter.rb +2 -2
  154. data/lib/rails_admin/support/datetime.rb +3 -1
  155. data/lib/rails_admin/support/es_module_processor.rb +23 -0
  156. data/lib/rails_admin/support/hash_helper.rb +2 -0
  157. data/lib/rails_admin/version.rb +4 -2
  158. data/lib/rails_admin.rb +7 -2
  159. data/lib/tasks/rails_admin.rake +2 -0
  160. data/package.json +2 -2
  161. data/src/rails_admin/base.js +14 -3
  162. data/src/rails_admin/filter-box.js +166 -210
  163. data/src/rails_admin/filtering-multiselect.js +5 -10
  164. data/src/rails_admin/filtering-select.js +16 -7
  165. data/src/rails_admin/i18n.js +3 -1
  166. data/src/rails_admin/jquery.js +3 -0
  167. data/src/rails_admin/nested-form-hooks.js +6 -4
  168. data/src/rails_admin/remote-form.js +5 -5
  169. data/src/rails_admin/styles/base/theming.scss +25 -8
  170. data/src/rails_admin/styles/base.scss +5 -5
  171. data/src/rails_admin/styles/widgets.scss +1 -1
  172. data/src/rails_admin/ui.js +52 -19
  173. data/src/rails_admin/widgets.js +7 -2
  174. data/vendor/assets/fonts/rails_admin/fa-solid-900.ttf +0 -0
  175. data/vendor/assets/fonts/rails_admin/fa-solid-900.woff2 +0 -0
  176. data/vendor/assets/javascripts/rails_admin/jquery3.js +118 -109
  177. data/vendor/assets/stylesheets/rails_admin/font-awesome.scss +4531 -2782
  178. metadata +16 -14
  179. data/lib/generators/rails_admin/templates/rails_admin.js.erb +0 -2
  180. data/lib/generators/rails_admin/templates/rails_admin.scss +0 -1
  181. data/lib/generators/rails_admin/templates/webpack.config.js +0 -29
  182. data/lib/rails_admin/support/esmodule_preprocessor.rb +0 -33
  183. data/vendor/assets/fonts/rails_admin/fa-solid-900.eot +0 -0
  184. data/vendor/assets/fonts/rails_admin/fa-solid-900.svg +0 -5034
  185. data/vendor/assets/fonts/rails_admin/fa-solid-900.woff +0 -0
  186. data/vendor/assets/images/rails_admin/bootstrap/glyphicons-halflings-white.png +0 -0
  187. data/vendor/assets/images/rails_admin/bootstrap/glyphicons-halflings.png +0 -0
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/string'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/belongs_to_association'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/text'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/file_upload'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/text'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/string_like'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/base'
2
4
 
3
5
  module RailsAdmin
@@ -5,6 +7,10 @@ module RailsAdmin
5
7
  module Fields
6
8
  module Types
7
9
  class StringLike < RailsAdmin::Config::Fields::Base
10
+ register_instance_option :filter_operators do
11
+ %w[_discard like not_like is starts_with ends_with] + (required? ? [] : %w[_separator _present _blank])
12
+ end
13
+
8
14
  register_instance_option :treat_empty_as_nil? do
9
15
  properties.try(:nullable?)
10
16
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/string_like'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/datetime'
2
4
 
3
5
  module RailsAdmin
@@ -11,6 +13,10 @@ module RailsAdmin
11
13
  abstract_model.model.type_for_attribute(name.to_s).serialize(super)&.change(year: 2000, month: 1, day: 1)
12
14
  end
13
15
 
16
+ register_instance_option :filter_operators do
17
+ %w[default between] + (required? ? [] : %w[_separator _not_null _null])
18
+ end
19
+
14
20
  register_instance_option :datepicker_options do
15
21
  {
16
22
  allowInput: true,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/datetime'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/string'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/text'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/core_ext/string/inflections'
2
4
  require 'rails_admin/config/fields'
3
5
  require 'rails_admin/config/fields/association'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Fields
@@ -20,7 +22,7 @@ module RailsAdmin
20
22
 
21
23
  # Registry of field factories.
22
24
  #
23
- # Field factory is an anonymous function that recieves the parent object,
25
+ # Field factory is an anonymous function that receives the parent object,
24
26
  # an array of field properties and an array of fields already instantiated.
25
27
  #
26
28
  # If the factory returns true then that property will not be run through
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/group'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  # Provides accessor and autoregistering of model's description.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  # Provides accessors and autoregistering of model's fields.
@@ -42,7 +44,7 @@ module RailsAdmin
42
44
  [*name].each { |field_name| field(field_name, type, false, &block) }
43
45
  end
44
46
 
45
- # include fields by name and apply an optionnal block to each (through a call to fields),
47
+ # include fields by name and apply an optional block to each (through a call to fields),
46
48
  # or include fields by conditions if no field names
47
49
  def include_fields(*field_names, &block)
48
50
  if field_names.empty?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/group'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  # Defines a visibility configuration
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Inspectable
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_admin/config/model'
4
+
5
+ module RailsAdmin
6
+ module Config
7
+ class LazyModel < BasicObject
8
+ def initialize(entity, &block)
9
+ @entity = entity
10
+ @deferred_blocks = [*block]
11
+ @initialized = false
12
+ end
13
+
14
+ def add_deferred_block(&block)
15
+ if @initialized
16
+ @model.instance_eval(&block)
17
+ else
18
+ @deferred_blocks << block
19
+ end
20
+ end
21
+
22
+ def target
23
+ @model ||= ::RailsAdmin::Config::Model.new(@entity)
24
+ # When evaluating multiple configuration blocks, the order of
25
+ # execution is important. As one would expect (in my opinion),
26
+ # options defined within a resource should take precedence over
27
+ # more general options defined in an initializer. This way,
28
+ # general settings for a number of resources could be specified
29
+ # in the initializer, while models could override these settings
30
+ # later, if required.
31
+ #
32
+ # CAVEAT: It cannot be guaranteed that blocks defined in an initializer
33
+ # will be loaded (and adde to @deferred_blocks) first. For instance, if
34
+ # the initializer references a model class before defining
35
+ # a RailsAdmin configuration block, the configuration from the
36
+ # resource will get added to @deferred_blocks first:
37
+ #
38
+ # # app/models/some_model.rb
39
+ # class SomeModel
40
+ # rails_admin do
41
+ # :
42
+ # end
43
+ # end
44
+ #
45
+ # # config/initializers/rails_admin.rb
46
+ # model = 'SomeModel'.constantize # blocks from SomeModel get loaded
47
+ # model.config model do # blocks from initializer gets loaded
48
+ # :
49
+ # end
50
+ #
51
+ # Thus, sort all blocks to execute for a resource by Proc.source_path,
52
+ # to guarantee that blocks from 'config/initializers' evaluate before
53
+ # blocks defined within a model class.
54
+ unless @deferred_blocks.empty?
55
+ @deferred_blocks.
56
+ partition { |block| block.source_location.first =~ %r{config/initializers} }.
57
+ flatten.
58
+ each { |block| @model.instance_eval(&block) }
59
+ @deferred_blocks = []
60
+ end
61
+ @initialized = true
62
+ @model
63
+ end
64
+
65
+ def method_missing(method_name, *args, &block)
66
+ target.send(method_name, *args, &block)
67
+ end
68
+
69
+ def respond_to_missing?(method_name, include_private = false)
70
+ super || target.respond_to?(method_name, include_private)
71
+ end
72
+ end
73
+ end
74
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config'
2
4
  require 'rails_admin/config/proxyable'
3
5
  require 'rails_admin/config/configurable'
@@ -34,8 +36,10 @@ module RailsAdmin
34
36
  case entity
35
37
  when RailsAdmin::AbstractModel
36
38
  entity
37
- when Class, String, Symbol
39
+ when Class, String
38
40
  RailsAdmin::AbstractModel.new(entity)
41
+ when Symbol
42
+ RailsAdmin::AbstractModel.new(entity.to_s)
39
43
  else
40
44
  RailsAdmin::AbstractModel.new(entity.class)
41
45
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Proxyable
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/proxyable/proxy'
2
4
  module RailsAdmin
3
5
  module Config
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/proxyable'
2
4
  require 'rails_admin/config/configurable'
3
5
  require 'rails_admin/config/inspectable'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/sections/edit'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/sections/base'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/sections/base'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/sections/base'
2
4
 
3
5
  module RailsAdmin
@@ -28,6 +30,10 @@ module RailsAdmin
28
30
  nil
29
31
  end
30
32
 
33
+ register_instance_option :search_help do
34
+ nil
35
+ end
36
+
31
37
  register_instance_option :sort_by do
32
38
  parent.abstract_model.primary_key
33
39
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/sections/edit'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/sections/edit'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/sections/base'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/sections/edit'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/core_ext/string/inflections'
2
4
  require 'rails_admin/config/sections/base'
3
5
  require 'rails_admin/config/sections/edit'
@@ -1,4 +1,6 @@
1
- require 'rails_admin/config/model'
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_admin/config/lazy_model'
2
4
  require 'rails_admin/config/sections/list'
3
5
  require 'active_support/core_ext/module/attribute_accessors'
4
6
 
@@ -20,10 +22,6 @@ module RailsAdmin
20
22
 
21
23
  DEFAULT_CURRENT_USER = proc {}
22
24
 
23
- # Variables to track initialization process
24
- @initialized = false
25
- @deferred_blocks = []
26
-
27
25
  class << self
28
26
  # Application title, can be an array of two elements
29
27
  attr_accessor :main_app_name
@@ -73,6 +71,9 @@ module RailsAdmin
73
71
  # @see RailsAdmin.config
74
72
  attr_reader :registry
75
73
 
74
+ # Bootstrap CSS classes used for Navigation bar
75
+ attr_accessor :navbar_css_classes
76
+
76
77
  # show Gravatar in Navigation bar
77
78
  attr_accessor :show_gravatar
78
79
 
@@ -83,22 +84,6 @@ module RailsAdmin
83
84
  # Set where RailsAdmin fetches JS/CSS from, defaults to :sprockets
84
85
  attr_writer :asset_source
85
86
 
86
- # Finish initialization by executing deferred configuration blocks
87
- def initialize!
88
- @deferred_blocks.each { |block| block.call(self) }
89
- @deferred_blocks.clear
90
- @initialized = true
91
- end
92
-
93
- # Evaluate the given block either immediately or lazily, based on initialization status.
94
- def apply(&block)
95
- if @initialized
96
- yield(self)
97
- else
98
- @deferred_blocks << block
99
- end
100
- end
101
-
102
87
  # Setup authentication to be run as a before filter
103
88
  # This is run inside the controller instance so you can setup any authentication you need to
104
89
  #
@@ -134,7 +119,7 @@ module RailsAdmin
134
119
  klass = RailsAdmin::AUDITING_ADAPTERS[extension]
135
120
  klass.setup if klass.respond_to? :setup
136
121
  @audit = proc do
137
- @auditing_adapter = klass.new(*([self] + args).compact)
122
+ @auditing_adapter = klass.new(*([self] + args).compact, &block)
138
123
  end
139
124
  elsif block
140
125
  @audit = block
@@ -171,7 +156,7 @@ module RailsAdmin
171
156
  klass = RailsAdmin::AUTHORIZATION_ADAPTERS[extension]
172
157
  klass.setup if klass.respond_to? :setup
173
158
  @authorize = proc do
174
- @authorization_adapter = klass.new(*([self] + args).compact)
159
+ @authorization_adapter = klass.new(*([self] + args).compact, &block)
175
160
  end
176
161
  elsif block
177
162
  @authorize = block
@@ -244,7 +229,7 @@ module RailsAdmin
244
229
  case entity
245
230
  when RailsAdmin::AbstractModel
246
231
  entity.model.try(:name).try :to_sym
247
- when Class
232
+ when Class, ConstLoadSuppressor::ConstProxy
248
233
  entity.name.to_sym
249
234
  when String, Symbol
250
235
  entity.to_sym
@@ -252,19 +237,22 @@ module RailsAdmin
252
237
  entity.class.name.to_sym
253
238
  end
254
239
 
255
- @registry[key] ||= RailsAdmin::Config::Model.new(entity)
256
- @registry[key].instance_eval(&block) if block && @registry[key].abstract_model
240
+ @registry[key] ||= RailsAdmin::Config::LazyModel.new(key.to_s)
241
+ @registry[key].add_deferred_block(&block) if block
257
242
  @registry[key]
258
243
  end
259
244
 
260
245
  def asset_source
261
246
  @asset_source ||=
262
247
  begin
263
- warn <<-MSG.gsub(/^ +/, '').freeze
264
- [Warning] After upgrading RailsAdmin to 3.x you haven't set asset_source yet, using :sprockets as the default.
265
- To suppress this message, run 'rails rails_admin:install' to setup the asset delivery method suitable to you.
266
- MSG
267
- :sprockets
248
+ detected = defined?(Sprockets) ? :sprockets : :invalid
249
+ unless ARGV.join(' ').include? 'rails_admin:install'
250
+ warn <<~MSG
251
+ [Warning] After upgrading RailsAdmin to 3.x you haven't set asset_source yet, using :#{detected} as the default.
252
+ To suppress this message, run 'rails rails_admin:install' to setup the asset delivery method suitable to you.
253
+ MSG
254
+ end
255
+ detected
268
256
  end
269
257
  end
270
258
 
@@ -282,10 +270,12 @@ module RailsAdmin
282
270
  @parent_controller = name
283
271
 
284
272
  if defined?(RailsAdmin::ApplicationController) || defined?(RailsAdmin::MainController)
285
- RailsAdmin.send(:remove_const, :ApplicationController)
286
- RailsAdmin.send(:remove_const, :MainController)
287
- load RailsAdmin::Engine.root.join('app/controllers/rails_admin/application_controller.rb')
288
- load RailsAdmin::Engine.root.join('app/controllers/rails_admin/main_controller.rb')
273
+ RailsAdmin::Config::ConstLoadSuppressor.allowing do
274
+ RailsAdmin.send(:remove_const, :ApplicationController)
275
+ RailsAdmin.send(:remove_const, :MainController)
276
+ load RailsAdmin::Engine.root.join('app/controllers/rails_admin/application_controller.rb')
277
+ load RailsAdmin::Engine.root.join('app/controllers/rails_admin/main_controller.rb')
278
+ end
289
279
  end
290
280
  end
291
281
 
@@ -334,6 +324,7 @@ module RailsAdmin
334
324
  @label_methods = %i[name title]
335
325
  @main_app_name = proc { [Rails.application.engine_name.titleize.chomp(' Application'), 'Admin'] }
336
326
  @registry = {}
327
+ @navbar_css_classes = %w[navbar-dark bg-primary border-bottom]
337
328
  @show_gravatar = true
338
329
  @navigation_static_links = {}
339
330
  @navigation_static_label = nil
@@ -354,10 +345,8 @@ module RailsAdmin
354
345
 
355
346
  # Perform reset, then load RailsAdmin initializer again
356
347
  def reload!
357
- @initialized = false
358
348
  reset
359
349
  load RailsAdmin::Engine.config.initializer_path
360
- initialize!
361
350
  end
362
351
 
363
352
  # Get all models that are configured as visible sorted by their weight and label.
@@ -375,23 +364,22 @@ module RailsAdmin
375
364
 
376
365
  private
377
366
 
378
- def lchomp(base, arg)
379
- base.to_s.reverse.chomp(arg.to_s.reverse).reverse
380
- end
381
-
382
367
  def viable_models
383
368
  included_models.collect(&:to_s).presence || begin
384
369
  @@system_models ||= # memoization for tests
385
370
  ([Rails.application] + Rails::Engine.subclasses.collect(&:instance)).flat_map do |app|
386
371
  (app.paths['app/models'].to_a + app.config.eager_load_paths).collect do |load_path|
387
372
  Dir.glob(app.root.join(load_path)).collect do |load_dir|
373
+ path_prefix = "#{app.root.join(load_dir)}/"
388
374
  Dir.glob("#{load_dir}/**/*.rb").collect do |filename|
389
375
  # app/models/module/class.rb => module/class.rb => module/class => Module::Class
390
- lchomp(filename, "#{app.root.join(load_dir)}/").chomp('.rb').camelize
376
+ filename.delete_prefix(path_prefix).chomp('.rb').camelize
391
377
  end
392
378
  end
393
379
  end
394
380
  end.flatten.reject { |m| m.starts_with?('Concerns::') } # rubocop:disable Style/MultilineBlockChain
381
+
382
+ @@system_models + @registry.keys.collect(&:to_s)
395
383
  end
396
384
  end
397
385
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'kaminari'
2
4
  require 'nested_form'
3
5
  require 'rails'
@@ -9,19 +11,9 @@ module RailsAdmin
9
11
  class Engine < Rails::Engine
10
12
  isolate_namespace RailsAdmin
11
13
 
12
- config.action_dispatch.rescue_responses['RailsAdmin::ActionNotAllowed'] = :forbidden
14
+ attr_accessor :importmap
13
15
 
14
- initializer 'RailsAdmin precompile hook', group: :all do |app|
15
- if defined?(Sprockets)
16
- app.config.assets.precompile += %w[
17
- rails_admin/application.js
18
- rails_admin/application.css
19
- ]
20
- app.config.assets.paths << RailsAdmin::Engine.root.join('src')
21
- require 'rails_admin/support/esmodule_preprocessor'
22
- Sprockets.register_preprocessor 'application/javascript', RailsAdmin::ESModulePreprocessor
23
- end
24
- end
16
+ config.action_dispatch.rescue_responses['RailsAdmin::ActionNotAllowed'] = :forbidden
25
17
 
26
18
  initializer 'RailsAdmin reload config in development' do |app|
27
19
  config.initializer_path = app.root.join('config/initializers/rails_admin.rb')
@@ -43,6 +35,21 @@ module RailsAdmin
43
35
  end
44
36
  end
45
37
 
38
+ initializer 'RailsAdmin precompile hook', group: :all do |app|
39
+ case RailsAdmin.config.asset_source
40
+ when :sprockets
41
+ app.config.assets.precompile += %w[
42
+ rails_admin/application.js
43
+ rails_admin/application.css
44
+ ]
45
+ app.config.assets.paths << RailsAdmin::Engine.root.join('src')
46
+ require 'rails_admin/support/es_module_processor'
47
+ Sprockets.register_bundle_processor 'application/javascript', RailsAdmin::Support::ESModuleProcessor
48
+ when :importmap
49
+ self.importmap = Importmap::Map.new.draw(app.root.join('config/importmap.rails_admin.rb'))
50
+ end
51
+ end
52
+
46
53
  # Check for required middlewares, users may forget to use them in Rails API mode
47
54
  config.after_initialize do |app|
48
55
  has_session_store = app.config.middleware.to_a.any? do |m|
@@ -66,11 +73,6 @@ module RailsAdmin
66
73
  ERROR
67
74
  end
68
75
 
69
- RailsAdmin::Config.initialize!
70
-
71
- # Force route reload, since it doesn't reflect RailsAdmin action configuration yet
72
- app.reload_routes!
73
-
74
76
  RailsAdmin::Version.warn_with_js_version
75
77
  end
76
78
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/extensions/controller_extension'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Extensions
3
5
  module CanCanCan
@@ -7,18 +9,33 @@ module RailsAdmin
7
9
  def current_ability
8
10
  # use _current_user instead of default current_user so it works with
9
11
  # whatever current user method is defined with RailsAdmin
10
- @current_ability ||= @ability.new(_current_user)
12
+ @current_ability ||= ability_class.new(_current_user)
11
13
  end
12
14
  end
13
15
 
16
+ include RailsAdmin::Config::Configurable
17
+
18
+ def self.setup
19
+ RailsAdmin::Extensions::ControllerExtension.include ControllerExtension
20
+ end
21
+
14
22
  # See the +authorize_with+ config method for where the initialization happens.
15
- def initialize(controller, ability = ::Ability)
23
+ def initialize(controller, ability = nil, &block)
16
24
  @controller = controller
17
- @controller.instance_variable_set '@ability', ability
18
- @controller.extend ControllerExtension
25
+ ability_class { ability } if ability
26
+ instance_eval(&block) if block
27
+
28
+ adapter = self
29
+ ControllerExtension.define_method(:ability_class) do
30
+ adapter.ability_class
31
+ end
19
32
  @controller.current_ability.authorize! :access, :rails_admin
20
33
  end
21
34
 
35
+ register_instance_option :ability_class do
36
+ Ability
37
+ end
38
+
22
39
  # This method is called in every controller action and should raise an exception
23
40
  # when the authorization fails. The first argument is the name of the controller
24
41
  # action as a symbol (:create, :bulk_delete, etc.). The second argument is the
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/extensions/cancancan/authorization_adapter'
2
4
 
3
5
  RailsAdmin.add_extension(:cancancan, RailsAdmin::Extensions::CanCanCan, authorization: true)