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.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/README.md +4 -2
- 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 +71 -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 +30 -42
- 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 -2
- 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 +4 -2
- 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 +14 -3
- data/src/rails_admin/filter-box.js +166 -210
- 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/jquery.js +3 -0
- 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 +52 -19
- 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 +16 -14
- 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
- data/vendor/assets/images/rails_admin/bootstrap/glyphicons-halflings-white.png +0 -0
- 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
|
-
|
|
56
|
-
template 'rails_admin.
|
|
57
|
-
|
|
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}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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";
|
|
@@ -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
|