rails_admin_next 1.0.0
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 +7 -0
- data/Gemfile +46 -0
- data/LICENSE.md +21 -0
- data/README.md +317 -0
- data/Rakefile +25 -0
- data/app/assets/javascripts/rails_admin/custom/ui.js +1 -0
- data/app/assets/stylesheets/rails_admin/framework.css +2375 -0
- data/app/assets/stylesheets/rails_admin/skin.css +472 -0
- data/app/assets/stylesheets/rails_admin/tokens.css +281 -0
- data/app/assets/stylesheets/rails_admin.css +47 -0
- data/app/controllers/rails_admin_next/application_controller.rb +98 -0
- data/app/controllers/rails_admin_next/main_controller.rb +185 -0
- data/app/helpers/rails_admin_next/application_helper.rb +254 -0
- data/app/helpers/rails_admin_next/form_builder.rb +173 -0
- data/app/helpers/rails_admin_next/main_helper.rb +63 -0
- data/app/views/layouts/rails_admin_next/_head.html.erb +29 -0
- data/app/views/layouts/rails_admin_next/_navigation.html.erb +18 -0
- data/app/views/layouts/rails_admin_next/_secondary_navigation.html.erb +27 -0
- data/app/views/layouts/rails_admin_next/_sidebar_navigation.html.erb +6 -0
- data/app/views/layouts/rails_admin_next/application.html.erb +42 -0
- data/app/views/layouts/rails_admin_next/content.html.erb +22 -0
- data/app/views/layouts/rails_admin_next/modal.js.erb +7 -0
- data/app/views/rails_admin_next/main/_dashboard_history.html.erb +46 -0
- data/app/views/rails_admin_next/main/_delete_notice.html.erb +36 -0
- data/app/views/rails_admin_next/main/_form_action_text.html.erb +2 -0
- data/app/views/rails_admin_next/main/_form_boolean.html.erb +15 -0
- data/app/views/rails_admin_next/main/_form_colorpicker.html.erb +6 -0
- data/app/views/rails_admin_next/main/_form_datetime.html.erb +14 -0
- data/app/views/rails_admin_next/main/_form_enumeration.html.erb +26 -0
- data/app/views/rails_admin_next/main/_form_field.html.erb +2 -0
- data/app/views/rails_admin_next/main/_form_file_upload.html.erb +18 -0
- data/app/views/rails_admin_next/main/_form_filtering_multiselect.html.erb +20 -0
- data/app/views/rails_admin_next/main/_form_filtering_select.html.erb +22 -0
- data/app/views/rails_admin_next/main/_form_multiple_file_upload.html.erb +21 -0
- data/app/views/rails_admin_next/main/_form_nested_many.html.erb +20 -0
- data/app/views/rails_admin_next/main/_form_nested_one.html.erb +19 -0
- data/app/views/rails_admin_next/main/_form_polymorphic_association.html.erb +24 -0
- data/app/views/rails_admin_next/main/_form_text.html.erb +2 -0
- data/app/views/rails_admin_next/main/_pagination.html.erb +54 -0
- data/app/views/rails_admin_next/main/_submit_buttons.html.erb +26 -0
- data/app/views/rails_admin_next/main/bulk_delete.html.erb +19 -0
- data/app/views/rails_admin_next/main/dashboard.html.erb +64 -0
- data/app/views/rails_admin_next/main/delete.html.erb +21 -0
- data/app/views/rails_admin_next/main/edit.html.erb +3 -0
- data/app/views/rails_admin_next/main/export.html.erb +149 -0
- data/app/views/rails_admin_next/main/history.html.erb +80 -0
- data/app/views/rails_admin_next/main/index.html.erb +186 -0
- data/app/views/rails_admin_next/main/new.html.erb +3 -0
- data/app/views/rails_admin_next/main/show.html.erb +30 -0
- data/config/brakeman.ignore +145 -0
- data/config/importmap.rails_admin.rb +29 -0
- data/config/initializers/active_record_extensions.rb +21 -0
- data/config/locales/rails_admin_next.en.yml +158 -0
- data/config/routes.rb +14 -0
- data/lib/generators/rails_admin_next/install_generator.rb +39 -0
- data/lib/generators/rails_admin_next/templates/initializer.erb +40 -0
- data/lib/generators/rails_admin_next/utils.rb +21 -0
- data/lib/rails_admin_next/abstract_model.rb +266 -0
- data/lib/rails_admin_next/adapters/active_record/association.rb +130 -0
- data/lib/rails_admin_next/adapters/active_record/object_extension.rb +13 -0
- data/lib/rails_admin_next/adapters/active_record/property.rb +58 -0
- data/lib/rails_admin_next/adapters/active_record.rb +371 -0
- data/lib/rails_admin_next/config/actions/base.rb +160 -0
- data/lib/rails_admin_next/config/actions/bulk_delete.rb +67 -0
- data/lib/rails_admin_next/config/actions/dashboard.rb +62 -0
- data/lib/rails_admin_next/config/actions/delete.rb +58 -0
- data/lib/rails_admin_next/config/actions/edit.rb +56 -0
- data/lib/rails_admin_next/config/actions/export.rb +47 -0
- data/lib/rails_admin_next/config/actions/history_index.rb +40 -0
- data/lib/rails_admin_next/config/actions/history_show.rb +40 -0
- data/lib/rails_admin_next/config/actions/index.rb +108 -0
- data/lib/rails_admin_next/config/actions/new.rb +69 -0
- data/lib/rails_admin_next/config/actions/show.rb +36 -0
- data/lib/rails_admin_next/config/actions/show_in_app.rb +37 -0
- data/lib/rails_admin_next/config/actions.rb +122 -0
- data/lib/rails_admin_next/config/configurable.rb +107 -0
- data/lib/rails_admin_next/config/const_load_suppressor.rb +78 -0
- data/lib/rails_admin_next/config/fields/association.rb +169 -0
- data/lib/rails_admin_next/config/fields/base.rb +391 -0
- data/lib/rails_admin_next/config/fields/collection_association.rb +90 -0
- data/lib/rails_admin_next/config/fields/factories/action_text.rb +14 -0
- data/lib/rails_admin_next/config/fields/factories/active_storage.rb +34 -0
- data/lib/rails_admin_next/config/fields/factories/association.rb +32 -0
- data/lib/rails_admin_next/config/fields/factories/encrypted_password.rb +28 -0
- data/lib/rails_admin_next/config/fields/factories/enum.rb +23 -0
- data/lib/rails_admin_next/config/fields/factories/password.rb +19 -0
- data/lib/rails_admin_next/config/fields/group.rb +77 -0
- data/lib/rails_admin_next/config/fields/singular_association.rb +62 -0
- data/lib/rails_admin_next/config/fields/types/action_text.rb +20 -0
- data/lib/rails_admin_next/config/fields/types/active_record_enum.rb +62 -0
- data/lib/rails_admin_next/config/fields/types/active_storage.rb +70 -0
- data/lib/rails_admin_next/config/fields/types/all.rb +32 -0
- data/lib/rails_admin_next/config/fields/types/belongs_to_association.rb +48 -0
- data/lib/rails_admin_next/config/fields/types/boolean.rb +70 -0
- data/lib/rails_admin_next/config/fields/types/citext.rb +15 -0
- data/lib/rails_admin_next/config/fields/types/color.rb +43 -0
- data/lib/rails_admin_next/config/fields/types/date.rb +38 -0
- data/lib/rails_admin_next/config/fields/types/datetime.rb +79 -0
- data/lib/rails_admin_next/config/fields/types/decimal.rb +23 -0
- data/lib/rails_admin_next/config/fields/types/enum.rb +52 -0
- data/lib/rails_admin_next/config/fields/types/file_upload.rb +87 -0
- data/lib/rails_admin_next/config/fields/types/float.rb +23 -0
- data/lib/rails_admin_next/config/fields/types/has_and_belongs_to_many_association.rb +16 -0
- data/lib/rails_admin_next/config/fields/types/has_many_association.rb +16 -0
- data/lib/rails_admin_next/config/fields/types/has_one_association.rb +35 -0
- data/lib/rails_admin_next/config/fields/types/hidden.rb +31 -0
- data/lib/rails_admin_next/config/fields/types/inet.rb +15 -0
- data/lib/rails_admin_next/config/fields/types/integer.rb +20 -0
- data/lib/rails_admin_next/config/fields/types/json.rb +37 -0
- data/lib/rails_admin_next/config/fields/types/multiple_active_storage.rb +82 -0
- data/lib/rails_admin_next/config/fields/types/multiple_file_upload.rb +134 -0
- data/lib/rails_admin_next/config/fields/types/numeric.rb +24 -0
- data/lib/rails_admin_next/config/fields/types/password.rb +45 -0
- data/lib/rails_admin_next/config/fields/types/polymorphic_association.rb +118 -0
- data/lib/rails_admin_next/config/fields/types/serialized.rb +28 -0
- data/lib/rails_admin_next/config/fields/types/string.rb +50 -0
- data/lib/rails_admin_next/config/fields/types/string_like.rb +25 -0
- data/lib/rails_admin_next/config/fields/types/text.rb +28 -0
- data/lib/rails_admin_next/config/fields/types/time.rb +39 -0
- data/lib/rails_admin_next/config/fields/types/timestamp.rb +16 -0
- data/lib/rails_admin_next/config/fields/types/uuid.rb +15 -0
- data/lib/rails_admin_next/config/fields/types.rb +29 -0
- data/lib/rails_admin_next/config/fields.rb +88 -0
- data/lib/rails_admin_next/config/groupable.rb +20 -0
- data/lib/rails_admin_next/config/has_description.rb +14 -0
- data/lib/rails_admin_next/config/has_fields.rb +144 -0
- data/lib/rails_admin_next/config/has_groups.rb +27 -0
- data/lib/rails_admin_next/config/hideable.rb +30 -0
- data/lib/rails_admin_next/config/inspectable.rb +39 -0
- data/lib/rails_admin_next/config/lazy_model.rb +74 -0
- data/lib/rails_admin_next/config/model.rb +126 -0
- data/lib/rails_admin_next/config/proxyable/proxy.rb +42 -0
- data/lib/rails_admin_next/config/proxyable.rb +26 -0
- data/lib/rails_admin_next/config/sections/base.rb +36 -0
- data/lib/rails_admin_next/config/sections/create.rb +13 -0
- data/lib/rails_admin_next/config/sections/edit.rb +13 -0
- data/lib/rails_admin_next/config/sections/export.rb +13 -0
- data/lib/rails_admin_next/config/sections/list.rb +63 -0
- data/lib/rails_admin_next/config/sections/modal.rb +12 -0
- data/lib/rails_admin_next/config/sections/nested.rb +12 -0
- data/lib/rails_admin_next/config/sections/show.rb +12 -0
- data/lib/rails_admin_next/config/sections/update.rb +12 -0
- data/lib/rails_admin_next/config/sections.rb +39 -0
- data/lib/rails_admin_next/config.rb +436 -0
- data/lib/rails_admin_next/engine.rb +91 -0
- data/lib/rails_admin_next/extension.rb +35 -0
- data/lib/rails_admin_next/extensions/cancancan/authorization_adapter.rb +90 -0
- data/lib/rails_admin_next/extensions/cancancan.rb +5 -0
- data/lib/rails_admin_next/extensions/controller_extension.rb +8 -0
- data/lib/rails_admin_next/extensions/paper_trail/auditing_adapter.rb +192 -0
- data/lib/rails_admin_next/extensions/paper_trail.rb +5 -0
- data/lib/rails_admin_next/extensions/pundit/authorization_adapter.rb +72 -0
- data/lib/rails_admin_next/extensions/pundit.rb +5 -0
- data/lib/rails_admin_next/extensions/url_for_extension.rb +15 -0
- data/lib/rails_admin_next/icons.rb +143 -0
- data/lib/rails_admin_next/support/composite_keys_serializer.rb +15 -0
- data/lib/rails_admin_next/support/csv_converter.rb +100 -0
- data/lib/rails_admin_next/support/hash_helper.rb +31 -0
- data/lib/rails_admin_next/support/paginated_collection.rb +79 -0
- data/lib/rails_admin_next/version.rb +17 -0
- data/lib/rails_admin_next.rb +72 -0
- data/lib/tasks/rails_admin.rake +40 -0
- data/src/rails_admin/application.js +15 -0
- data/src/rails_admin/base.js +12 -0
- data/src/rails_admin/controllers/alert_controller.js +28 -0
- data/src/rails_admin/controllers/collapse_controller.js +16 -0
- data/src/rails_admin/controllers/dropdown_controller.js +110 -0
- data/src/rails_admin/controllers/feedback_controller.js +73 -0
- data/src/rails_admin/controllers/filter_box_controller.js +346 -0
- data/src/rails_admin/controllers/filtering_multiselect_controller.js +386 -0
- data/src/rails_admin/controllers/filtering_select_controller.js +509 -0
- data/src/rails_admin/controllers/index.js +31 -0
- data/src/rails_admin/controllers/modal_controller.js +142 -0
- data/src/rails_admin/controllers/nested_form_controller.js +117 -0
- data/src/rails_admin/controllers/polymorphic_controller.js +26 -0
- data/src/rails_admin/controllers/remote_form_controller.js +173 -0
- data/src/rails_admin/controllers/sidescroll_controller.js +23 -0
- data/src/rails_admin/dom-ready.js +20 -0
- data/src/rails_admin/dom.js +19 -0
- data/src/rails_admin/i18n.js +20 -0
- data/src/rails_admin/icons.js +64 -0
- data/src/rails_admin/interactions.js +221 -0
- data/src/rails_admin/select_query.js +65 -0
- metadata +346 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RailsAdminNext
|
|
4
|
+
module Config
|
|
5
|
+
# A module for all configurables.
|
|
6
|
+
|
|
7
|
+
module Configurable
|
|
8
|
+
def self.included(base)
|
|
9
|
+
base.send :extend, ClassMethods
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def has_option?(name)
|
|
13
|
+
options = self.class.instance_variable_get(:@config_options)
|
|
14
|
+
options&.key?(name)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Register an instance option for this object only
|
|
18
|
+
def register_instance_option(option_name, &default)
|
|
19
|
+
scope = class << self; self; end
|
|
20
|
+
self.class.register_instance_option(option_name, scope, &default)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def register_deprecated_instance_option(option_name, replacement_option_name = nil, &custom_error)
|
|
24
|
+
scope = class << self; self; end
|
|
25
|
+
self.class.register_deprecated_instance_option(option_name, replacement_option_name, scope, &custom_error)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def with_recurring(option_name, value_proc, default_proc)
|
|
31
|
+
# Track recursive invocation with an instance variable. This prevents run-away recursion
|
|
32
|
+
# and allows configurations such as
|
|
33
|
+
# label { "#{label}".upcase }
|
|
34
|
+
# This will use the default definition when called recursively.
|
|
35
|
+
Thread.current[:rails_admin_recurring] ||= {}
|
|
36
|
+
Thread.current[:rails_admin_recurring][self] ||= {}
|
|
37
|
+
if Thread.current[:rails_admin_recurring][self][option_name]
|
|
38
|
+
instance_eval(&default_proc)
|
|
39
|
+
else
|
|
40
|
+
Thread.current[:rails_admin_recurring][self][option_name] = true
|
|
41
|
+
instance_eval(&value_proc)
|
|
42
|
+
end
|
|
43
|
+
ensure
|
|
44
|
+
Thread.current[:rails_admin_recurring].delete(self)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
module ClassMethods
|
|
48
|
+
# Register an instance option. Instance option is a configuration
|
|
49
|
+
# option that stores its value within an instance variable and is
|
|
50
|
+
# accessed by an instance method. Both go by the name of the option.
|
|
51
|
+
def register_instance_option(option_name, scope = self, &default)
|
|
52
|
+
options = scope.instance_variable_get(:@config_options) ||
|
|
53
|
+
scope.instance_variable_set(:@config_options, {})
|
|
54
|
+
|
|
55
|
+
option_name = option_name.to_s
|
|
56
|
+
options[option_name] = nil
|
|
57
|
+
|
|
58
|
+
# If it's a boolean create an alias for it and remove question mark
|
|
59
|
+
if option_name.end_with?("?")
|
|
60
|
+
scope.send(:define_method, "#{option_name.chop!}?") do
|
|
61
|
+
send(option_name)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Define getter/setter by the option name
|
|
66
|
+
scope.send(:define_method, option_name) do |*args, &block|
|
|
67
|
+
if !args[0].nil? || block
|
|
68
|
+
# Invocation with args --> This is the declaration of the option, i.e. setter
|
|
69
|
+
instance_variable_set("@#{option_name}_registered", args[0].nil? ? block : args[0])
|
|
70
|
+
else
|
|
71
|
+
# Invocation without args nor block --> It's the use of the option, i.e. getter
|
|
72
|
+
value = instance_variable_get("@#{option_name}_registered")
|
|
73
|
+
case value
|
|
74
|
+
when Proc
|
|
75
|
+
value = with_recurring(option_name, value, default)
|
|
76
|
+
when nil
|
|
77
|
+
value = instance_eval(&default)
|
|
78
|
+
end
|
|
79
|
+
value
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def register_deprecated_instance_option(option_name, replacement_option_name = nil, scope = self)
|
|
85
|
+
scope.send(:define_method, option_name) do |*args, &block|
|
|
86
|
+
if replacement_option_name
|
|
87
|
+
RailsAdminNext.deprecator.warn("The #{option_name} configuration option is deprecated, please use #{replacement_option_name}.")
|
|
88
|
+
send(replacement_option_name, *args, &block)
|
|
89
|
+
elsif block_given?
|
|
90
|
+
yield
|
|
91
|
+
else
|
|
92
|
+
raise "The #{option_name} configuration option is removed without replacement."
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Register a class option. Class option is a configuration
|
|
98
|
+
# option that stores it's value within a class object's instance variable
|
|
99
|
+
# and is accessed by a class method. Both go by the name of the option.
|
|
100
|
+
def register_class_option(option_name, &default)
|
|
101
|
+
scope = class << self; self; end
|
|
102
|
+
register_instance_option(option_name, scope, &default)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RailsAdminNext
|
|
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 RailsAdminNext 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_next.rb.
|
|
62
|
+
MESSAGE
|
|
63
|
+
end
|
|
64
|
+
name.constantize
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def method_missing(method_name, *, &)
|
|
69
|
+
klass.send(method_name, *, &)
|
|
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
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config"
|
|
4
|
+
require "rails_admin_next/config/fields/base"
|
|
5
|
+
|
|
6
|
+
module RailsAdminNext
|
|
7
|
+
module Config
|
|
8
|
+
module Fields
|
|
9
|
+
class Association < RailsAdminNext::Config::Fields::Base
|
|
10
|
+
# Reader for the association information hash
|
|
11
|
+
def association
|
|
12
|
+
@properties
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def method_name
|
|
16
|
+
nested_form ? :"#{name}_attributes" : association.key_accessor
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
register_instance_option :pretty_value do
|
|
20
|
+
v = bindings[:view]
|
|
21
|
+
[value].flatten.select(&:present?).collect do |associated|
|
|
22
|
+
amc = polymorphic? ? RailsAdminNext.config(associated) : associated_model_config # perf optimization for non-polymorphic associations
|
|
23
|
+
am = amc.abstract_model
|
|
24
|
+
wording = associated.send(amc.object_label_method)
|
|
25
|
+
can_see = !am.embedded? && (show_action = v.action(:show, am, associated))
|
|
26
|
+
can_see ? v.link_to(wording, v.url_for(action: show_action.action_name, model_name: am.to_param, id: associated.id)) : ERB::Util.html_escape(wording)
|
|
27
|
+
end.to_sentence.html_safe.presence || "-"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Accessor whether association is visible or not. By default
|
|
31
|
+
# association checks whether the child model is excluded in
|
|
32
|
+
# configuration or not.
|
|
33
|
+
register_instance_option :visible? do
|
|
34
|
+
@visible ||= !associated_model_config.excluded?
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Keyed by the association's name (not its accessor key), so it resolves via
|
|
38
|
+
# human_attribute_name like any other attribute label.
|
|
39
|
+
register_instance_option :label do
|
|
40
|
+
(@label ||= {})[::I18n.locale] ||= abstract_model.model.human_attribute_name association.name
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# scope for possible associable records
|
|
44
|
+
register_instance_option :associated_collection_scope do
|
|
45
|
+
# bindings[:object] & bindings[:controller] available
|
|
46
|
+
associated_collection_scope_limit = (associated_collection_cache_all ? nil : 30)
|
|
47
|
+
proc do |scope|
|
|
48
|
+
scope.limit(associated_collection_scope_limit)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# inverse relationship
|
|
53
|
+
register_instance_option :inverse_of do
|
|
54
|
+
association.inverse_of
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# preload entire associated collection (per associated_collection_scope) on load
|
|
58
|
+
# Be sure to set limit in associated_collection_scope if set is large
|
|
59
|
+
register_instance_option :associated_collection_cache_all do
|
|
60
|
+
@associated_collection_cache_all ||= dynamically_scope_by.blank? && (associated_model_config.abstract_model.count < associated_model_limit)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# client-side dynamic scoping
|
|
64
|
+
register_instance_option :dynamically_scope_by do
|
|
65
|
+
nil
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# parses #dynamically_scope_by and returns a Hash in the form of
|
|
69
|
+
# {[form field name in this model]: [field name in the associated model]}
|
|
70
|
+
def dynamic_scope_relationships
|
|
71
|
+
@dynamic_scope_relationships ||=
|
|
72
|
+
Array.wrap(dynamically_scope_by).flat_map do |field|
|
|
73
|
+
field.is_a?(Hash) ? field.to_a : [[field, field]]
|
|
74
|
+
end.map do |field_name, target_name| # rubocop:disable Style/MultilineBlockChain
|
|
75
|
+
field = section.fields.detect { |f| f.name == field_name }
|
|
76
|
+
raise "Field '#{field_name}' was given for #dynamically_scope_by but not found in '#{abstract_model.model_name}'" unless field
|
|
77
|
+
|
|
78
|
+
target_field = associated_model_config.list.fields.detect { |f| f.name == target_name }
|
|
79
|
+
raise "Field '#{field_name}' was given for #dynamically_scope_by but not found in '#{associated_model_config.abstract_model.model_name}'" unless target_field
|
|
80
|
+
raise "Field '#{field_name}' in '#{associated_model_config.abstract_model.model_name}' can't be used for dynamic scoping because it's not filterable" unless target_field.filterable
|
|
81
|
+
|
|
82
|
+
[field.method_name, target_name]
|
|
83
|
+
end.to_h
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# determines whether association's elements can be removed
|
|
87
|
+
register_instance_option :removable? do
|
|
88
|
+
association.foreign_key_nullable?
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
register_instance_option :eager_load do
|
|
92
|
+
!!searchable
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
register_instance_option :inline_add do
|
|
96
|
+
true
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
register_instance_option :inline_edit do
|
|
100
|
+
true
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Reader for the association's child model's configuration
|
|
104
|
+
def associated_model_config
|
|
105
|
+
@associated_model_config ||= RailsAdminNext.config(association.klass)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Reader for the association's child model object's label method
|
|
109
|
+
def associated_object_label_method
|
|
110
|
+
@associated_object_label_method ||= associated_model_config.object_label_method
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Reader for associated primary key
|
|
114
|
+
def associated_primary_key
|
|
115
|
+
association.primary_key
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Returns params which are to be set in modals
|
|
119
|
+
def associated_prepopulate_params
|
|
120
|
+
{}
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Reader whether this is a polymorphic association
|
|
124
|
+
def polymorphic?
|
|
125
|
+
association.polymorphic?
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Reader for nested attributes
|
|
129
|
+
register_instance_option :nested_form do
|
|
130
|
+
association.nested_options
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Reader for the association's value unformatted
|
|
134
|
+
def value
|
|
135
|
+
bindings[:object].send(association.name)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Returns collection of all selectable records
|
|
139
|
+
def collection(scope = nil)
|
|
140
|
+
(scope || bindings[:controller].list_entries(associated_model_config, :index, associated_collection_scope, false))
|
|
141
|
+
.map { |o| [o.send(associated_object_label_method), format_key(o.send(associated_primary_key)).to_s] }
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# has many?
|
|
145
|
+
def multiple?
|
|
146
|
+
true
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def virtual?
|
|
150
|
+
true
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def associated_model_limit
|
|
154
|
+
RailsAdminNext.config.default_associated_collection_limit
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
private
|
|
158
|
+
|
|
159
|
+
def format_key(key)
|
|
160
|
+
if key.is_a?(Array)
|
|
161
|
+
RailsAdminNext.config.composite_keys_serializer.serialize(key)
|
|
162
|
+
else
|
|
163
|
+
key
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|