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.
Files changed (184) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +46 -0
  3. data/LICENSE.md +21 -0
  4. data/README.md +317 -0
  5. data/Rakefile +25 -0
  6. data/app/assets/javascripts/rails_admin/custom/ui.js +1 -0
  7. data/app/assets/stylesheets/rails_admin/framework.css +2375 -0
  8. data/app/assets/stylesheets/rails_admin/skin.css +472 -0
  9. data/app/assets/stylesheets/rails_admin/tokens.css +281 -0
  10. data/app/assets/stylesheets/rails_admin.css +47 -0
  11. data/app/controllers/rails_admin_next/application_controller.rb +98 -0
  12. data/app/controllers/rails_admin_next/main_controller.rb +185 -0
  13. data/app/helpers/rails_admin_next/application_helper.rb +254 -0
  14. data/app/helpers/rails_admin_next/form_builder.rb +173 -0
  15. data/app/helpers/rails_admin_next/main_helper.rb +63 -0
  16. data/app/views/layouts/rails_admin_next/_head.html.erb +29 -0
  17. data/app/views/layouts/rails_admin_next/_navigation.html.erb +18 -0
  18. data/app/views/layouts/rails_admin_next/_secondary_navigation.html.erb +27 -0
  19. data/app/views/layouts/rails_admin_next/_sidebar_navigation.html.erb +6 -0
  20. data/app/views/layouts/rails_admin_next/application.html.erb +42 -0
  21. data/app/views/layouts/rails_admin_next/content.html.erb +22 -0
  22. data/app/views/layouts/rails_admin_next/modal.js.erb +7 -0
  23. data/app/views/rails_admin_next/main/_dashboard_history.html.erb +46 -0
  24. data/app/views/rails_admin_next/main/_delete_notice.html.erb +36 -0
  25. data/app/views/rails_admin_next/main/_form_action_text.html.erb +2 -0
  26. data/app/views/rails_admin_next/main/_form_boolean.html.erb +15 -0
  27. data/app/views/rails_admin_next/main/_form_colorpicker.html.erb +6 -0
  28. data/app/views/rails_admin_next/main/_form_datetime.html.erb +14 -0
  29. data/app/views/rails_admin_next/main/_form_enumeration.html.erb +26 -0
  30. data/app/views/rails_admin_next/main/_form_field.html.erb +2 -0
  31. data/app/views/rails_admin_next/main/_form_file_upload.html.erb +18 -0
  32. data/app/views/rails_admin_next/main/_form_filtering_multiselect.html.erb +20 -0
  33. data/app/views/rails_admin_next/main/_form_filtering_select.html.erb +22 -0
  34. data/app/views/rails_admin_next/main/_form_multiple_file_upload.html.erb +21 -0
  35. data/app/views/rails_admin_next/main/_form_nested_many.html.erb +20 -0
  36. data/app/views/rails_admin_next/main/_form_nested_one.html.erb +19 -0
  37. data/app/views/rails_admin_next/main/_form_polymorphic_association.html.erb +24 -0
  38. data/app/views/rails_admin_next/main/_form_text.html.erb +2 -0
  39. data/app/views/rails_admin_next/main/_pagination.html.erb +54 -0
  40. data/app/views/rails_admin_next/main/_submit_buttons.html.erb +26 -0
  41. data/app/views/rails_admin_next/main/bulk_delete.html.erb +19 -0
  42. data/app/views/rails_admin_next/main/dashboard.html.erb +64 -0
  43. data/app/views/rails_admin_next/main/delete.html.erb +21 -0
  44. data/app/views/rails_admin_next/main/edit.html.erb +3 -0
  45. data/app/views/rails_admin_next/main/export.html.erb +149 -0
  46. data/app/views/rails_admin_next/main/history.html.erb +80 -0
  47. data/app/views/rails_admin_next/main/index.html.erb +186 -0
  48. data/app/views/rails_admin_next/main/new.html.erb +3 -0
  49. data/app/views/rails_admin_next/main/show.html.erb +30 -0
  50. data/config/brakeman.ignore +145 -0
  51. data/config/importmap.rails_admin.rb +29 -0
  52. data/config/initializers/active_record_extensions.rb +21 -0
  53. data/config/locales/rails_admin_next.en.yml +158 -0
  54. data/config/routes.rb +14 -0
  55. data/lib/generators/rails_admin_next/install_generator.rb +39 -0
  56. data/lib/generators/rails_admin_next/templates/initializer.erb +40 -0
  57. data/lib/generators/rails_admin_next/utils.rb +21 -0
  58. data/lib/rails_admin_next/abstract_model.rb +266 -0
  59. data/lib/rails_admin_next/adapters/active_record/association.rb +130 -0
  60. data/lib/rails_admin_next/adapters/active_record/object_extension.rb +13 -0
  61. data/lib/rails_admin_next/adapters/active_record/property.rb +58 -0
  62. data/lib/rails_admin_next/adapters/active_record.rb +371 -0
  63. data/lib/rails_admin_next/config/actions/base.rb +160 -0
  64. data/lib/rails_admin_next/config/actions/bulk_delete.rb +67 -0
  65. data/lib/rails_admin_next/config/actions/dashboard.rb +62 -0
  66. data/lib/rails_admin_next/config/actions/delete.rb +58 -0
  67. data/lib/rails_admin_next/config/actions/edit.rb +56 -0
  68. data/lib/rails_admin_next/config/actions/export.rb +47 -0
  69. data/lib/rails_admin_next/config/actions/history_index.rb +40 -0
  70. data/lib/rails_admin_next/config/actions/history_show.rb +40 -0
  71. data/lib/rails_admin_next/config/actions/index.rb +108 -0
  72. data/lib/rails_admin_next/config/actions/new.rb +69 -0
  73. data/lib/rails_admin_next/config/actions/show.rb +36 -0
  74. data/lib/rails_admin_next/config/actions/show_in_app.rb +37 -0
  75. data/lib/rails_admin_next/config/actions.rb +122 -0
  76. data/lib/rails_admin_next/config/configurable.rb +107 -0
  77. data/lib/rails_admin_next/config/const_load_suppressor.rb +78 -0
  78. data/lib/rails_admin_next/config/fields/association.rb +169 -0
  79. data/lib/rails_admin_next/config/fields/base.rb +391 -0
  80. data/lib/rails_admin_next/config/fields/collection_association.rb +90 -0
  81. data/lib/rails_admin_next/config/fields/factories/action_text.rb +14 -0
  82. data/lib/rails_admin_next/config/fields/factories/active_storage.rb +34 -0
  83. data/lib/rails_admin_next/config/fields/factories/association.rb +32 -0
  84. data/lib/rails_admin_next/config/fields/factories/encrypted_password.rb +28 -0
  85. data/lib/rails_admin_next/config/fields/factories/enum.rb +23 -0
  86. data/lib/rails_admin_next/config/fields/factories/password.rb +19 -0
  87. data/lib/rails_admin_next/config/fields/group.rb +77 -0
  88. data/lib/rails_admin_next/config/fields/singular_association.rb +62 -0
  89. data/lib/rails_admin_next/config/fields/types/action_text.rb +20 -0
  90. data/lib/rails_admin_next/config/fields/types/active_record_enum.rb +62 -0
  91. data/lib/rails_admin_next/config/fields/types/active_storage.rb +70 -0
  92. data/lib/rails_admin_next/config/fields/types/all.rb +32 -0
  93. data/lib/rails_admin_next/config/fields/types/belongs_to_association.rb +48 -0
  94. data/lib/rails_admin_next/config/fields/types/boolean.rb +70 -0
  95. data/lib/rails_admin_next/config/fields/types/citext.rb +15 -0
  96. data/lib/rails_admin_next/config/fields/types/color.rb +43 -0
  97. data/lib/rails_admin_next/config/fields/types/date.rb +38 -0
  98. data/lib/rails_admin_next/config/fields/types/datetime.rb +79 -0
  99. data/lib/rails_admin_next/config/fields/types/decimal.rb +23 -0
  100. data/lib/rails_admin_next/config/fields/types/enum.rb +52 -0
  101. data/lib/rails_admin_next/config/fields/types/file_upload.rb +87 -0
  102. data/lib/rails_admin_next/config/fields/types/float.rb +23 -0
  103. data/lib/rails_admin_next/config/fields/types/has_and_belongs_to_many_association.rb +16 -0
  104. data/lib/rails_admin_next/config/fields/types/has_many_association.rb +16 -0
  105. data/lib/rails_admin_next/config/fields/types/has_one_association.rb +35 -0
  106. data/lib/rails_admin_next/config/fields/types/hidden.rb +31 -0
  107. data/lib/rails_admin_next/config/fields/types/inet.rb +15 -0
  108. data/lib/rails_admin_next/config/fields/types/integer.rb +20 -0
  109. data/lib/rails_admin_next/config/fields/types/json.rb +37 -0
  110. data/lib/rails_admin_next/config/fields/types/multiple_active_storage.rb +82 -0
  111. data/lib/rails_admin_next/config/fields/types/multiple_file_upload.rb +134 -0
  112. data/lib/rails_admin_next/config/fields/types/numeric.rb +24 -0
  113. data/lib/rails_admin_next/config/fields/types/password.rb +45 -0
  114. data/lib/rails_admin_next/config/fields/types/polymorphic_association.rb +118 -0
  115. data/lib/rails_admin_next/config/fields/types/serialized.rb +28 -0
  116. data/lib/rails_admin_next/config/fields/types/string.rb +50 -0
  117. data/lib/rails_admin_next/config/fields/types/string_like.rb +25 -0
  118. data/lib/rails_admin_next/config/fields/types/text.rb +28 -0
  119. data/lib/rails_admin_next/config/fields/types/time.rb +39 -0
  120. data/lib/rails_admin_next/config/fields/types/timestamp.rb +16 -0
  121. data/lib/rails_admin_next/config/fields/types/uuid.rb +15 -0
  122. data/lib/rails_admin_next/config/fields/types.rb +29 -0
  123. data/lib/rails_admin_next/config/fields.rb +88 -0
  124. data/lib/rails_admin_next/config/groupable.rb +20 -0
  125. data/lib/rails_admin_next/config/has_description.rb +14 -0
  126. data/lib/rails_admin_next/config/has_fields.rb +144 -0
  127. data/lib/rails_admin_next/config/has_groups.rb +27 -0
  128. data/lib/rails_admin_next/config/hideable.rb +30 -0
  129. data/lib/rails_admin_next/config/inspectable.rb +39 -0
  130. data/lib/rails_admin_next/config/lazy_model.rb +74 -0
  131. data/lib/rails_admin_next/config/model.rb +126 -0
  132. data/lib/rails_admin_next/config/proxyable/proxy.rb +42 -0
  133. data/lib/rails_admin_next/config/proxyable.rb +26 -0
  134. data/lib/rails_admin_next/config/sections/base.rb +36 -0
  135. data/lib/rails_admin_next/config/sections/create.rb +13 -0
  136. data/lib/rails_admin_next/config/sections/edit.rb +13 -0
  137. data/lib/rails_admin_next/config/sections/export.rb +13 -0
  138. data/lib/rails_admin_next/config/sections/list.rb +63 -0
  139. data/lib/rails_admin_next/config/sections/modal.rb +12 -0
  140. data/lib/rails_admin_next/config/sections/nested.rb +12 -0
  141. data/lib/rails_admin_next/config/sections/show.rb +12 -0
  142. data/lib/rails_admin_next/config/sections/update.rb +12 -0
  143. data/lib/rails_admin_next/config/sections.rb +39 -0
  144. data/lib/rails_admin_next/config.rb +436 -0
  145. data/lib/rails_admin_next/engine.rb +91 -0
  146. data/lib/rails_admin_next/extension.rb +35 -0
  147. data/lib/rails_admin_next/extensions/cancancan/authorization_adapter.rb +90 -0
  148. data/lib/rails_admin_next/extensions/cancancan.rb +5 -0
  149. data/lib/rails_admin_next/extensions/controller_extension.rb +8 -0
  150. data/lib/rails_admin_next/extensions/paper_trail/auditing_adapter.rb +192 -0
  151. data/lib/rails_admin_next/extensions/paper_trail.rb +5 -0
  152. data/lib/rails_admin_next/extensions/pundit/authorization_adapter.rb +72 -0
  153. data/lib/rails_admin_next/extensions/pundit.rb +5 -0
  154. data/lib/rails_admin_next/extensions/url_for_extension.rb +15 -0
  155. data/lib/rails_admin_next/icons.rb +143 -0
  156. data/lib/rails_admin_next/support/composite_keys_serializer.rb +15 -0
  157. data/lib/rails_admin_next/support/csv_converter.rb +100 -0
  158. data/lib/rails_admin_next/support/hash_helper.rb +31 -0
  159. data/lib/rails_admin_next/support/paginated_collection.rb +79 -0
  160. data/lib/rails_admin_next/version.rb +17 -0
  161. data/lib/rails_admin_next.rb +72 -0
  162. data/lib/tasks/rails_admin.rake +40 -0
  163. data/src/rails_admin/application.js +15 -0
  164. data/src/rails_admin/base.js +12 -0
  165. data/src/rails_admin/controllers/alert_controller.js +28 -0
  166. data/src/rails_admin/controllers/collapse_controller.js +16 -0
  167. data/src/rails_admin/controllers/dropdown_controller.js +110 -0
  168. data/src/rails_admin/controllers/feedback_controller.js +73 -0
  169. data/src/rails_admin/controllers/filter_box_controller.js +346 -0
  170. data/src/rails_admin/controllers/filtering_multiselect_controller.js +386 -0
  171. data/src/rails_admin/controllers/filtering_select_controller.js +509 -0
  172. data/src/rails_admin/controllers/index.js +31 -0
  173. data/src/rails_admin/controllers/modal_controller.js +142 -0
  174. data/src/rails_admin/controllers/nested_form_controller.js +117 -0
  175. data/src/rails_admin/controllers/polymorphic_controller.js +26 -0
  176. data/src/rails_admin/controllers/remote_form_controller.js +173 -0
  177. data/src/rails_admin/controllers/sidescroll_controller.js +23 -0
  178. data/src/rails_admin/dom-ready.js +20 -0
  179. data/src/rails_admin/dom.js +19 -0
  180. data/src/rails_admin/i18n.js +20 -0
  181. data/src/rails_admin/icons.js +64 -0
  182. data/src/rails_admin/interactions.js +221 -0
  183. data/src/rails_admin/select_query.js +65 -0
  184. 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