rails_admin 3.0.0 → 3.1.2

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 (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)