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/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