rails_admin 3.0.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/Rakefile +2 -0
- data/app/assets/javascripts/rails_admin/{application.js → application.js.erb} +8 -0
- data/app/assets/stylesheets/rails_admin/{application.scss → application.scss.erb} +4 -0
- data/app/controllers/rails_admin/application_controller.rb +2 -0
- data/app/controllers/rails_admin/main_controller.rb +9 -14
- data/app/helpers/rails_admin/application_helper.rb +37 -9
- data/app/helpers/rails_admin/form_builder.rb +10 -0
- data/app/helpers/rails_admin/main_helper.rb +7 -15
- data/app/views/layouts/rails_admin/_head.html.erb +12 -3
- data/app/views/layouts/rails_admin/_secondary_navigation.html.erb +3 -1
- data/app/views/layouts/rails_admin/_sidebar_navigation.html.erb +1 -1
- data/app/views/layouts/rails_admin/application.html.erb +4 -1
- data/app/views/rails_admin/main/_dashboard_history.html.erb +1 -1
- data/app/views/rails_admin/main/_form_action_text.html.erb +2 -1
- data/app/views/rails_admin/main/_form_file_upload.html.erb +1 -1
- data/app/views/rails_admin/main/_form_filtering_multiselect.html.erb +2 -2
- data/app/views/rails_admin/main/_form_filtering_select.html.erb +1 -1
- data/app/views/rails_admin/main/_form_multiple_file_upload.html.erb +1 -1
- data/app/views/rails_admin/main/dashboard.html.erb +2 -2
- data/app/views/rails_admin/main/history.html.erb +1 -1
- data/app/views/rails_admin/main/index.html.erb +7 -19
- data/config/initializers/active_record_extensions.rb +26 -3
- data/config/initializers/mongoid_extensions.rb +2 -0
- data/config/locales/rails_admin.en.yml +3 -2
- data/config/routes.rb +2 -0
- data/lib/generators/rails_admin/importmap_formatter.rb +28 -0
- data/lib/generators/rails_admin/install_generator.rb +68 -9
- data/lib/generators/rails_admin/templates/rails_admin.js +1 -0
- data/lib/generators/rails_admin/templates/rails_admin.scss.erb +1 -0
- data/lib/generators/rails_admin/templates/rails_admin.webpacker.js +2 -0
- data/lib/generators/rails_admin/utils.rb +2 -0
- data/lib/rails_admin/abstract_model.rb +9 -2
- data/lib/rails_admin/adapters/active_record/association.rb +11 -1
- data/lib/rails_admin/adapters/active_record/object_extension.rb +2 -0
- data/lib/rails_admin/adapters/active_record/property.rb +2 -0
- data/lib/rails_admin/adapters/active_record.rb +25 -2
- data/lib/rails_admin/adapters/composite_primary_keys/association.rb +45 -0
- data/lib/rails_admin/adapters/composite_primary_keys.rb +40 -0
- data/lib/rails_admin/adapters/mongoid/association.rb +14 -4
- data/lib/rails_admin/adapters/mongoid/bson.rb +2 -0
- data/lib/rails_admin/adapters/mongoid/extension.rb +3 -3
- data/lib/rails_admin/adapters/mongoid/object_extension.rb +2 -0
- data/lib/rails_admin/adapters/mongoid/property.rb +2 -0
- data/lib/rails_admin/adapters/mongoid.rb +4 -2
- data/lib/rails_admin/config/actions/base.rb +2 -0
- data/lib/rails_admin/config/actions/bulk_delete.rb +2 -0
- data/lib/rails_admin/config/actions/dashboard.rb +2 -0
- data/lib/rails_admin/config/actions/delete.rb +2 -0
- data/lib/rails_admin/config/actions/edit.rb +2 -0
- data/lib/rails_admin/config/actions/export.rb +2 -0
- data/lib/rails_admin/config/actions/history_index.rb +2 -0
- data/lib/rails_admin/config/actions/history_show.rb +2 -0
- data/lib/rails_admin/config/actions/index.rb +2 -0
- data/lib/rails_admin/config/actions/new.rb +2 -0
- data/lib/rails_admin/config/actions/show.rb +2 -0
- data/lib/rails_admin/config/actions/show_in_app.rb +2 -0
- data/lib/rails_admin/config/actions.rb +2 -0
- data/lib/rails_admin/config/configurable.rb +2 -0
- data/lib/rails_admin/config/const_load_suppressor.rb +78 -0
- data/lib/rails_admin/config/fields/association.rb +2 -0
- data/lib/rails_admin/config/fields/base.rb +44 -14
- data/lib/rails_admin/config/fields/factories/action_text.rb +2 -0
- data/lib/rails_admin/config/fields/factories/active_storage.rb +2 -0
- data/lib/rails_admin/config/fields/factories/association.rb +6 -5
- data/lib/rails_admin/config/fields/factories/carrierwave.rb +2 -0
- data/lib/rails_admin/config/fields/factories/devise.rb +2 -0
- data/lib/rails_admin/config/fields/factories/dragonfly.rb +2 -0
- data/lib/rails_admin/config/fields/factories/enum.rb +2 -0
- data/lib/rails_admin/config/fields/factories/paperclip.rb +2 -0
- data/lib/rails_admin/config/fields/factories/password.rb +2 -0
- data/lib/rails_admin/config/fields/factories/shrine.rb +2 -0
- data/lib/rails_admin/config/fields/group.rb +2 -0
- data/lib/rails_admin/config/fields/types/action_text.rb +6 -0
- data/lib/rails_admin/config/fields/types/active_record_enum.rb +2 -0
- data/lib/rails_admin/config/fields/types/active_storage.rb +14 -0
- data/lib/rails_admin/config/fields/types/all.rb +3 -0
- data/lib/rails_admin/config/fields/types/belongs_to_association.rb +7 -5
- data/lib/rails_admin/config/fields/types/boolean.rb +7 -1
- data/lib/rails_admin/config/fields/types/bson_object_id.rb +2 -0
- data/lib/rails_admin/config/fields/types/carrierwave.rb +2 -0
- data/lib/rails_admin/config/fields/types/citext.rb +2 -0
- data/lib/rails_admin/config/fields/types/ck_editor.rb +2 -0
- data/lib/rails_admin/config/fields/types/code_mirror.rb +2 -0
- data/lib/rails_admin/config/fields/types/color.rb +2 -0
- data/lib/rails_admin/config/fields/types/composite_keys_belongs_to_association.rb +31 -0
- data/lib/rails_admin/config/fields/types/date.rb +2 -0
- data/lib/rails_admin/config/fields/types/datetime.rb +12 -0
- data/lib/rails_admin/config/fields/types/decimal.rb +2 -0
- data/lib/rails_admin/config/fields/types/dragonfly.rb +2 -0
- data/lib/rails_admin/config/fields/types/enum.rb +15 -2
- data/lib/rails_admin/config/fields/types/file_upload.rb +2 -0
- data/lib/rails_admin/config/fields/types/float.rb +2 -0
- data/lib/rails_admin/config/fields/types/froala.rb +2 -0
- data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +2 -0
- data/lib/rails_admin/config/fields/types/has_many_association.rb +2 -0
- data/lib/rails_admin/config/fields/types/has_one_association.rb +7 -1
- data/lib/rails_admin/config/fields/types/hidden.rb +2 -0
- data/lib/rails_admin/config/fields/types/inet.rb +2 -0
- data/lib/rails_admin/config/fields/types/integer.rb +2 -0
- data/lib/rails_admin/config/fields/types/json.rb +2 -0
- data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +22 -0
- data/lib/rails_admin/config/fields/types/multiple_carrierwave.rb +2 -0
- data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +2 -0
- data/lib/rails_admin/config/fields/types/numeric.rb +6 -0
- data/lib/rails_admin/config/fields/types/paperclip.rb +2 -0
- data/lib/rails_admin/config/fields/types/password.rb +2 -0
- data/lib/rails_admin/config/fields/types/polymorphic_association.rb +2 -0
- data/lib/rails_admin/config/fields/types/serialized.rb +2 -0
- data/lib/rails_admin/config/fields/types/shrine.rb +2 -0
- data/lib/rails_admin/config/fields/types/simple_mde.rb +2 -0
- data/lib/rails_admin/config/fields/types/string.rb +2 -0
- data/lib/rails_admin/config/fields/types/string_like.rb +6 -0
- data/lib/rails_admin/config/fields/types/text.rb +2 -0
- data/lib/rails_admin/config/fields/types/time.rb +6 -0
- data/lib/rails_admin/config/fields/types/timestamp.rb +2 -0
- data/lib/rails_admin/config/fields/types/uuid.rb +2 -0
- data/lib/rails_admin/config/fields/types/wysihtml5.rb +2 -0
- data/lib/rails_admin/config/fields/types.rb +2 -0
- data/lib/rails_admin/config/fields.rb +3 -1
- data/lib/rails_admin/config/groupable.rb +2 -0
- data/lib/rails_admin/config/has_description.rb +2 -0
- data/lib/rails_admin/config/has_fields.rb +3 -1
- data/lib/rails_admin/config/has_groups.rb +2 -0
- data/lib/rails_admin/config/hideable.rb +2 -0
- data/lib/rails_admin/config/inspectable.rb +2 -0
- data/lib/rails_admin/config/lazy_model.rb +74 -0
- data/lib/rails_admin/config/model.rb +5 -1
- data/lib/rails_admin/config/proxyable/proxy.rb +2 -0
- data/lib/rails_admin/config/proxyable.rb +2 -0
- data/lib/rails_admin/config/sections/base.rb +2 -0
- data/lib/rails_admin/config/sections/create.rb +2 -0
- data/lib/rails_admin/config/sections/edit.rb +2 -0
- data/lib/rails_admin/config/sections/export.rb +2 -0
- data/lib/rails_admin/config/sections/list.rb +6 -0
- data/lib/rails_admin/config/sections/modal.rb +2 -0
- data/lib/rails_admin/config/sections/nested.rb +2 -0
- data/lib/rails_admin/config/sections/show.rb +2 -0
- data/lib/rails_admin/config/sections/update.rb +2 -0
- data/lib/rails_admin/config/sections.rb +2 -0
- data/lib/rails_admin/config.rb +26 -37
- data/lib/rails_admin/engine.rb +19 -17
- data/lib/rails_admin/extension.rb +2 -0
- data/lib/rails_admin/extensions/cancancan/authorization_adapter.rb +21 -4
- data/lib/rails_admin/extensions/cancancan.rb +2 -0
- data/lib/rails_admin/extensions/controller_extension.rb +2 -0
- data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +49 -27
- data/lib/rails_admin/extensions/paper_trail.rb +2 -0
- data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +2 -0
- data/lib/rails_admin/extensions/pundit.rb +2 -0
- data/lib/rails_admin/support/csv_converter.rb +2 -1
- data/lib/rails_admin/support/datetime.rb +3 -1
- data/lib/rails_admin/support/es_module_processor.rb +23 -0
- data/lib/rails_admin/support/hash_helper.rb +2 -0
- data/lib/rails_admin/version.rb +3 -1
- data/lib/rails_admin.rb +7 -2
- data/lib/tasks/rails_admin.rake +2 -0
- data/package.json +2 -2
- data/src/rails_admin/base.js +13 -1
- data/src/rails_admin/filter-box.js +165 -209
- data/src/rails_admin/filtering-multiselect.js +5 -10
- data/src/rails_admin/filtering-select.js +16 -7
- data/src/rails_admin/i18n.js +3 -1
- data/src/rails_admin/nested-form-hooks.js +6 -4
- data/src/rails_admin/remote-form.js +5 -5
- data/src/rails_admin/styles/base/theming.scss +25 -8
- data/src/rails_admin/styles/base.scss +5 -5
- data/src/rails_admin/styles/widgets.scss +1 -1
- data/src/rails_admin/ui.js +45 -18
- data/src/rails_admin/widgets.js +7 -2
- data/vendor/assets/fonts/rails_admin/fa-solid-900.ttf +0 -0
- data/vendor/assets/fonts/rails_admin/fa-solid-900.woff2 +0 -0
- data/vendor/assets/javascripts/rails_admin/jquery3.js +118 -109
- data/vendor/assets/stylesheets/rails_admin/font-awesome.scss +4531 -2782
- metadata +15 -12
- data/lib/generators/rails_admin/templates/rails_admin.js.erb +0 -2
- data/lib/generators/rails_admin/templates/rails_admin.scss +0 -1
- data/lib/generators/rails_admin/templates/webpack.config.js +0 -29
- data/lib/rails_admin/support/esmodule_preprocessor.rb +0 -33
- data/vendor/assets/fonts/rails_admin/fa-solid-900.eot +0 -0
- data/vendor/assets/fonts/rails_admin/fa-solid-900.svg +0 -5034
- data/vendor/assets/fonts/rails_admin/fa-solid-900.woff +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,66 @@ module RailsAdmin
|
|
52
62
|
|
53
63
|
def configure_for_webpacker5
|
54
64
|
run "yarn add rails_admin@#{RailsAdmin::Version.js}"
|
55
|
-
|
56
|
-
template 'rails_admin.
|
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'
|
58
67
|
end
|
59
68
|
|
60
69
|
def configure_for_webpack
|
61
|
-
run "yarn add rails_admin@#{RailsAdmin::Version.js}
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
70
|
+
run "yarn add rails_admin@#{RailsAdmin::Version.js}"
|
71
|
+
template 'rails_admin.js', 'app/javascript/rails_admin.js'
|
72
|
+
webpack_config = File.join(destination_root, 'webpack.config.js')
|
73
|
+
marker = %r{application: ["']./app/javascript/application.js["']}
|
74
|
+
if File.exist?(webpack_config) && File.read(webpack_config) =~ marker
|
75
|
+
insert_into_file 'webpack.config.js', %(,\n rails_admin: "./app/javascript/rails_admin.js"), after: marker
|
76
|
+
else
|
77
|
+
say 'Add `rails_admin: "./app/javascript/rails_admin.js"` to the entry section in your webpack.config.js.', :red
|
78
|
+
end
|
79
|
+
setup_css({'build' => 'webpack --config webpack.config.js'})
|
80
|
+
end
|
81
|
+
|
82
|
+
def configure_for_importmap
|
83
|
+
run "yarn add rails_admin@#{RailsAdmin::Version.js}"
|
84
|
+
template 'rails_admin.js', 'app/javascript/rails_admin.js'
|
85
|
+
require_relative 'importmap_formatter'
|
86
|
+
add_file 'config/importmap.rails_admin.rb', ImportmapFormatter.new.format
|
87
|
+
setup_css
|
88
|
+
end
|
89
|
+
|
90
|
+
def setup_css(additional_script_entries = {})
|
91
|
+
gem 'cssbundling-rails'
|
92
|
+
rake 'css:install:sass'
|
93
|
+
|
94
|
+
@fa_font_path = '.'
|
95
|
+
template 'rails_admin.scss.erb', 'app/assets/stylesheets/rails_admin.scss'
|
96
|
+
asset_config = %{Rails.application.config.assets.paths << Rails.root.join("node_modules/@fortawesome/fontawesome-free/webfonts")\n}
|
97
|
+
if File.exist? File.join(destination_root, 'config/initializers/assets.rb')
|
98
|
+
append_to_file 'config/initializers/assets.rb', asset_config
|
99
|
+
else
|
100
|
+
add_file 'config/initializers/assets.rb', asset_config
|
101
|
+
end
|
102
|
+
add_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'}))
|
103
|
+
end
|
104
|
+
|
105
|
+
def add_scripts(entries)
|
106
|
+
display 'Add scripts to package.json'
|
107
|
+
package = begin
|
108
|
+
JSON.parse(File.read(File.join(destination_root, 'package.json')))
|
109
|
+
rescue Errno::ENOENT, JSON::ParserError
|
110
|
+
{}
|
111
|
+
end
|
112
|
+
if package['scripts'] && (package['scripts'].keys & entries.keys).any?
|
113
|
+
say <<-MESSAGE.gsub(/^ {10}/, ''), :red
|
114
|
+
You need to merge "scripts": #{JSON.pretty_generate(entries)} into the existing scripts in your package.json .
|
115
|
+
Taking 'build:css' as an example, if you're already have application.sass.css for the sass build, the resulting script would look like:
|
116
|
+
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
|
117
|
+
MESSAGE
|
118
|
+
else
|
119
|
+
package['scripts'] ||= {}
|
120
|
+
entries.each do |entry, build_script|
|
121
|
+
package['scripts'][entry] = build_script
|
122
|
+
end
|
123
|
+
add_file 'package.json', JSON.pretty_generate(package)
|
124
|
+
end
|
66
125
|
end
|
67
126
|
end
|
68
127
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
import "rails_admin/src/rails_admin/base";
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= instance_variable_defined?(:@fa_font_path) ? %{$fa-font-path: "#{@fa_font_path}";\n} : '' %>@import "rails_admin/src/rails_admin/styles/base";
|
@@ -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
|
-
|
103
|
-
|
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.
|
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
|
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
|
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
|
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
|
115
|
-
|
116
|
-
|
117
|
-
|
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
|
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
|
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
|
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
|
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
|
@@ -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
|