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/generators'
2
4
  require 'rails_admin/version'
3
5
  require File.expand_path('utils', __dir__)
@@ -8,7 +10,7 @@ module RailsAdmin
8
10
  include Generators::Utils::InstanceMethods
9
11
 
10
12
  argument :_namespace, type: :string, required: false, desc: 'RailsAdmin url namespace'
11
- class_option :asset, type: :string, required: false, default: nil, desc: 'Asset delivery method [options: webpacker, sprockets]'
13
+ class_option :asset, type: :string, required: false, default: nil, desc: 'Asset delivery method [options: webpacker, webpack, sprockets, importmap]'
12
14
  desc 'RailsAdmin installation generator'
13
15
 
14
16
  def install
@@ -27,10 +29,14 @@ module RailsAdmin
27
29
  case asset
28
30
  when 'webpack'
29
31
  configure_for_webpack
32
+ when 'importmap'
33
+ configure_for_importmap
30
34
  when 'webpacker'
31
35
  configure_for_webpacker5
32
36
  when 'sprockets'
33
37
  configure_for_sprockets
38
+ else
39
+ raise "Unknown asset source: #{asset}"
34
40
  end
35
41
  end
36
42
 
@@ -41,6 +47,10 @@ module RailsAdmin
41
47
 
42
48
  if defined?(Webpacker)
43
49
  'webpacker'
50
+ elsif Rails.root.join('webpack.config.js').exist?
51
+ 'webpack'
52
+ elsif Rails.root.join('config/importmap.rb').exist?
53
+ 'importmap'
44
54
  else
45
55
  'sprockets'
46
56
  end
@@ -52,17 +62,69 @@ module RailsAdmin
52
62
 
53
63
  def configure_for_webpacker5
54
64
  run "yarn add rails_admin@#{RailsAdmin::Version.js}"
55
- @scss_relative_dir = '../stylesheets/'
56
- template 'rails_admin.js.erb', 'app/javascript/packs/rails_admin.js'
57
- template 'rails_admin.scss', 'app/javascript/stylesheets/rails_admin.scss'
65
+ template 'rails_admin.webpacker.js', 'app/javascript/packs/rails_admin.js'
66
+ template 'rails_admin.scss.erb', 'app/javascript/stylesheets/rails_admin.scss'
67
+ # To work around https://github.com/railsadminteam/rails_admin/issues/3565
68
+ add_package_json_field('resolutions', {'rails_admin/@fortawesome/fontawesome-free' => '^5.15.0'})
58
69
  end
59
70
 
60
71
  def configure_for_webpack
61
- run "yarn add rails_admin@#{RailsAdmin::Version.js} css-loader mini-css-extract-plugin sass sass-loader"
62
- @scss_relative_dir = './'
63
- template 'rails_admin.js.erb', 'app/javascript/rails_admin.js'
64
- template 'rails_admin.scss', 'app/javascript/rails_admin.scss'
65
- template 'webpack.config.js', 'webpack.config.js'
72
+ run "yarn add rails_admin@#{RailsAdmin::Version.js}"
73
+ template 'rails_admin.js', 'app/javascript/rails_admin.js'
74
+ webpack_config = File.join(destination_root, 'webpack.config.js')
75
+ marker = %r{application: ["']./app/javascript/application.js["']}
76
+ if File.exist?(webpack_config) && File.read(webpack_config) =~ marker
77
+ insert_into_file 'webpack.config.js', %(,\n rails_admin: "./app/javascript/rails_admin.js"), after: marker
78
+ else
79
+ say 'Add `rails_admin: "./app/javascript/rails_admin.js"` to the entry section in your webpack.config.js.', :red
80
+ end
81
+ setup_css({'build' => 'webpack --config webpack.config.js'})
82
+ end
83
+
84
+ def configure_for_importmap
85
+ run "yarn add rails_admin@#{RailsAdmin::Version.js}"
86
+ template 'rails_admin.js', 'app/javascript/rails_admin.js'
87
+ require_relative 'importmap_formatter'
88
+ add_file 'config/importmap.rails_admin.rb', ImportmapFormatter.new.format
89
+ setup_css
90
+ end
91
+
92
+ def setup_css(additional_script_entries = {})
93
+ gem 'cssbundling-rails'
94
+ rake 'css:install:sass'
95
+
96
+ @fa_font_path = '.'
97
+ template 'rails_admin.scss.erb', 'app/assets/stylesheets/rails_admin.scss'
98
+ asset_config = %{Rails.application.config.assets.paths << Rails.root.join("node_modules/@fortawesome/fontawesome-free/webfonts")\n}
99
+ if File.exist? File.join(destination_root, 'config/initializers/assets.rb')
100
+ append_to_file 'config/initializers/assets.rb', asset_config
101
+ else
102
+ add_file 'config/initializers/assets.rb', asset_config
103
+ end
104
+ add_package_json_field('scripts', additional_script_entries.merge({'build:css' => 'sass ./app/assets/stylesheets/rails_admin.scss:./app/assets/builds/rails_admin.css --no-source-map --load-path=node_modules'}), <<~INSTRUCTION)
105
+ Taking 'build:css' as an example, if you're already have application.sass.css for the sass build, the resulting script would look like:
106
+ sass ./app/assets/stylesheets/application.sass.scss:./app/assets/builds/application.css ./app/assets/stylesheets/rails_admin.scss:./app/assets/builds/rails_admin.css --no-source-map --load-path=node_modules
107
+ INSTRUCTION
108
+ end
109
+
110
+ def add_package_json_field(name, entries, instruction = nil)
111
+ display "Add #{name} to package.json"
112
+ package = begin
113
+ JSON.parse(File.read(File.join(destination_root, 'package.json')))
114
+ rescue Errno::ENOENT, JSON::ParserError
115
+ {}
116
+ end
117
+ if package[name] && (package[name].keys & entries.keys).any?
118
+ say <<~MESSAGE, :red
119
+ You need to merge "#{name}": #{JSON.pretty_generate(entries)} into the existing #{name} in your package.json.#{instruction && "\n#{instruction}"}
120
+ MESSAGE
121
+ else
122
+ package[name] ||= {}
123
+ entries.each do |entry, value|
124
+ package[name][entry] = value
125
+ end
126
+ add_file 'package.json', "#{JSON.pretty_generate(package)}\n"
127
+ end
66
128
  end
67
129
  end
68
130
  end
@@ -0,0 +1 @@
1
+ import "rails_admin/src/rails_admin/base";
@@ -0,0 +1 @@
1
+ <%= @fa_font_path ? %{$fa-font-path: "#{@fa_font_path}";\n} : '' %>@import "rails_admin/src/rails_admin/styles/base";
@@ -0,0 +1,2 @@
1
+ import "rails_admin/src/rails_admin/base";
2
+ import "../stylesheets/rails_admin.scss";
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Generators
3
5
  module Utils
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/support/datetime'
2
4
 
3
5
  module RailsAdmin
@@ -99,8 +101,13 @@ module RailsAdmin
99
101
 
100
102
  def initialize_active_record
101
103
  @adapter = :active_record
102
- require 'rails_admin/adapters/active_record'
103
- extend Adapters::ActiveRecord
104
+ if defined?(::CompositePrimaryKeys)
105
+ require 'rails_admin/adapters/composite_primary_keys'
106
+ extend Adapters::CompositePrimaryKeys
107
+ else
108
+ require 'rails_admin/adapters/active_record'
109
+ extend Adapters::ActiveRecord
110
+ end
104
111
  end
105
112
 
106
113
  def initialize_mongoid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Adapters
3
5
  module ActiveRecord
@@ -21,6 +23,14 @@ module RailsAdmin
21
23
  association.macro
22
24
  end
23
25
 
26
+ def field_type
27
+ if polymorphic?
28
+ :polymorphic_association
29
+ else
30
+ :"#{association.macro}_association"
31
+ end
32
+ end
33
+
24
34
  def klass
25
35
  if options[:polymorphic]
26
36
  polymorphic_parents(:active_record, model.name.to_s, name) || []
@@ -82,7 +92,7 @@ module RailsAdmin
82
92
  end
83
93
 
84
94
  def read_only?
85
- (klass.all.instance_eval(&scope).readonly_value if scope.is_a? Proc) ||
95
+ (klass.all.instance_exec(&scope).readonly_value if scope.is_a?(Proc) && scope.arity == 0) ||
86
96
  association.nested? ||
87
97
  false
88
98
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Adapters
3
5
  module ActiveRecord
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Adapters
3
5
  module ActiveRecord
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_record'
2
4
  require 'rails_admin/adapters/active_record/association'
3
5
  require 'rails_admin/adapters/active_record/object_extension'
@@ -31,11 +33,11 @@ module RailsAdmin
31
33
  scope ||= scoped
32
34
  scope = scope.includes(options[:include]) if options[:include]
33
35
  scope = scope.limit(options[:limit]) if options[:limit]
34
- scope = scope.where(primary_key => options[:bulk_ids]) if options[:bulk_ids]
36
+ scope = bulk_scope(scope, options) if options[:bulk_ids]
35
37
  scope = query_scope(scope, options[:query]) if options[:query]
36
38
  scope = filter_scope(scope, options[:filters]) if options[:filters]
37
39
  scope = scope.send(Kaminari.config.page_method_name, options[:page]).per(options[:per]) if options[:page] && options[:per]
38
- scope = scope.reorder("#{options[:sort]} #{options[:sort_reverse] ? 'asc' : 'desc'}") if options[:sort]
40
+ scope = sort_scope(scope, options) if options[:sort]
39
41
  scope
40
42
  end
41
43
 
@@ -105,6 +107,27 @@ module RailsAdmin
105
107
  true
106
108
  end
107
109
 
110
+ private
111
+
112
+ def bulk_scope(scope, options)
113
+ scope.where(primary_key => options[:bulk_ids])
114
+ end
115
+
116
+ def sort_scope(scope, options)
117
+ direction = options[:sort_reverse] ? :asc : :desc
118
+ case options[:sort]
119
+ when String, Symbol
120
+ scope.reorder("#{options[:sort]} #{direction}")
121
+ when Array
122
+ scope.reorder(options[:sort].zip(Array.new(options[:sort].size) { direction }).to_h)
123
+ when Hash
124
+ scope.reorder(options[:sort].map { |table_name, column| "#{table_name}.#{column}" }.
125
+ zip(Array.new(options[:sort].size) { direction }).to_h)
126
+ else
127
+ raise ArgumentError.new("Unsupported sort value: #{options[:sort]}")
128
+ end
129
+ end
130
+
108
131
  class WhereBuilder
109
132
  def initialize(scope)
110
133
  @statements = []
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsAdmin
4
+ module Adapters
5
+ module CompositePrimaryKeys
6
+ class Association < RailsAdmin::Adapters::ActiveRecord::Association
7
+ def field_type
8
+ if type == :belongs_to && association.foreign_key.is_a?(Array)
9
+ :composite_keys_belongs_to_association
10
+ else
11
+ super
12
+ end
13
+ end
14
+
15
+ def primary_key
16
+ return nil if polymorphic?
17
+
18
+ value = association.association_primary_key
19
+
20
+ if value.is_a? Array
21
+ :id
22
+ else
23
+ value.to_sym
24
+ end
25
+ end
26
+
27
+ def foreign_key
28
+ if association.foreign_key.is_a? Array
29
+ association.foreign_key.map(&:to_sym)
30
+ else
31
+ super
32
+ end
33
+ end
34
+
35
+ def key_accessor
36
+ if type == :belongs_to && foreign_key.is_a?(Array)
37
+ :"#{name}_id"
38
+ else
39
+ super
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_admin/adapters/active_record'
4
+ require 'rails_admin/adapters/composite_primary_keys/association'
5
+
6
+ module RailsAdmin
7
+ module Adapters
8
+ module CompositePrimaryKeys
9
+ include RailsAdmin::Adapters::ActiveRecord
10
+
11
+ def get(id, scope = scoped)
12
+ begin
13
+ object = scope.find(id)
14
+ rescue ::ActiveRecord::RecordNotFound
15
+ return nil
16
+ end
17
+
18
+ object.extend(RailsAdmin::Adapters::ActiveRecord::ObjectExtension)
19
+ end
20
+
21
+ def associations
22
+ model.reflect_on_all_associations.collect do |association|
23
+ RailsAdmin::Adapters::CompositePrimaryKeys::Association.new(association, model)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def bulk_scope(scope, options)
30
+ if primary_key.is_a? Array
31
+ options[:bulk_ids].map do |id|
32
+ scope.where(primary_key.zip(::CompositePrimaryKeys::CompositeKeys.parse(id)).to_h)
33
+ end.reduce(&:or)
34
+ else
35
+ super
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Adapters
3
5
  module Mongoid
@@ -34,6 +36,14 @@ module RailsAdmin
34
36
  end
35
37
  end
36
38
 
39
+ def field_type
40
+ if polymorphic?
41
+ :polymorphic_association
42
+ else
43
+ :"#{type}_association"
44
+ end
45
+ end
46
+
37
47
  def klass
38
48
  if polymorphic? && %i[referenced_in belongs_to].include?(macro)
39
49
  polymorphic_parents(:mongoid, model.name, name) || []
@@ -111,10 +121,10 @@ module RailsAdmin
111
121
  def nested_options
112
122
  nested = nested_attributes_options.try { |o| o[name] }
113
123
  if !nested && %i[embeds_one embeds_many].include?(macro.to_sym) && !cyclic?
114
- raise <<-MSG.gsub(/^\s+/, '')
115
- Embbeded association without accepts_nested_attributes_for can't be handled by RailsAdmin,
116
- because embedded model doesn't have top-level access.
117
- Please add `accepts_nested_attributes_for :#{association.name}' line to `#{model}' model.
124
+ raise <<~MSG
125
+ Embedded association without accepts_nested_attributes_for can't be handled by RailsAdmin,
126
+ because embedded model doesn't have top-level access.
127
+ Please add `accepts_nested_attributes_for :#{association.name}' line to `#{model}' model.
118
128
  MSG
119
129
  end
120
130
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mongoid'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Adapters
3
5
  module Mongoid
@@ -9,9 +11,7 @@ module RailsAdmin
9
11
  self.nested_attributes_options = {}
10
12
  class << self
11
13
  def rails_admin(&block)
12
- RailsAdmin.config do |config|
13
- config.model(self, &block)
14
- end
14
+ RailsAdmin.config(self, &block)
15
15
  end
16
16
 
17
17
  alias_method :accepts_nested_attributes_for_without_rails_admin, :accepts_nested_attributes_for
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Adapters
3
5
  module Mongoid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Adapters
3
5
  module Mongoid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mongoid'
2
4
  require 'rails_admin/config/sections/list'
3
5
  require 'rails_admin/adapters/mongoid/association'
@@ -52,7 +54,7 @@ module RailsAdmin
52
54
  scope
53
55
  rescue NoMethodError => e
54
56
  if /page/.match?(e.message)
55
- e = e.exception <<-ERROR.gsub(/^\s{12}/, '')
57
+ e = e.exception <<~ERROR
56
58
  #{e.message}
57
59
  If you don't have kaminari-mongoid installed, add `gem 'kaminari-mongoid'` to your Gemfile.
58
60
  ERROR
@@ -199,7 +201,7 @@ module RailsAdmin
199
201
  case target_association.type
200
202
  when :belongs_to, :has_and_belongs_to_many
201
203
  [{target_association.foreign_key.to_s => {'$in' => model.where('$or' => conditions).all.collect { |r| r.send(target_association.primary_key) }}}]
202
- when :has_many
204
+ when :has_many, :has_one
203
205
  [{target_association.primary_key.to_s => {'$in' => model.where('$or' => conditions).all.collect { |r| r.send(target_association.foreign_key) }}}]
204
206
  end
205
207
  end
@@ -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/hideable'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'activemodel-serializers-xml'
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
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  # A module for all configurables.
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsAdmin
4
+ module Config
5
+ module ConstLoadSuppressor
6
+ class << self
7
+ @original_const_missing = nil
8
+
9
+ def suppressing
10
+ raise 'Constant Loading is already suppressed' if @original_const_missing
11
+
12
+ begin
13
+ @original_const_missing = Object.method(:const_missing)
14
+ intercept_const_missing
15
+ yield
16
+ ensure
17
+ Object.define_singleton_method(:const_missing, @original_const_missing)
18
+ @original_const_missing = nil
19
+ end
20
+ end
21
+
22
+ def allowing
23
+ if @original_const_missing
24
+ begin
25
+ Object.define_singleton_method(:const_missing, @original_const_missing)
26
+ yield
27
+ ensure
28
+ intercept_const_missing
29
+ end
30
+ else
31
+ yield
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def intercept_const_missing
38
+ Object.define_singleton_method(:const_missing) do |name|
39
+ ConstProxy.new(name.to_s)
40
+ end
41
+ end
42
+ end
43
+
44
+ class ConstProxy < BasicObject
45
+ attr_reader :name
46
+
47
+ def initialize(name)
48
+ @name = name
49
+ end
50
+
51
+ def klass
52
+ @klass ||=
53
+ begin
54
+ unless ::Object.const_defined?(name)
55
+ ::Kernel.raise <<~MESSAGE
56
+ The constant #{name} is not loaded yet upon the execution of the RailsAdmin initializer.
57
+ We don't recommend to do this and may lead to issues, but if you really have to do so you can explicitly require it by adding:
58
+
59
+ require '#{name.underscore}'
60
+
61
+ on top of config/initializers/rails_admin.rb.
62
+ MESSAGE
63
+ end
64
+ name.constantize
65
+ end
66
+ end
67
+
68
+ def method_missing(method_name, *args, &block)
69
+ klass.send(method_name, *args, &block)
70
+ end
71
+
72
+ def respond_to_missing?(method_name, include_private = false)
73
+ super || klass.respond_to?(method_name, include_private)
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config'
2
4
  require 'rails_admin/config/fields/base'
3
5