rails_admin 3.0.0 → 3.1.0.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Rakefile +2 -0
  4. data/app/assets/javascripts/rails_admin/{application.js → application.js.erb} +8 -0
  5. data/app/assets/stylesheets/rails_admin/{application.scss → application.scss.erb} +4 -0
  6. data/app/controllers/rails_admin/application_controller.rb +2 -0
  7. data/app/controllers/rails_admin/main_controller.rb +9 -14
  8. data/app/helpers/rails_admin/application_helper.rb +37 -9
  9. data/app/helpers/rails_admin/form_builder.rb +10 -0
  10. data/app/helpers/rails_admin/main_helper.rb +7 -15
  11. data/app/views/layouts/rails_admin/_head.html.erb +9 -0
  12. data/app/views/layouts/rails_admin/_secondary_navigation.html.erb +3 -1
  13. data/app/views/layouts/rails_admin/_sidebar_navigation.html.erb +1 -1
  14. data/app/views/layouts/rails_admin/application.html.erb +4 -1
  15. data/app/views/rails_admin/main/_dashboard_history.html.erb +1 -1
  16. data/app/views/rails_admin/main/_form_action_text.html.erb +2 -1
  17. data/app/views/rails_admin/main/_form_file_upload.html.erb +1 -1
  18. data/app/views/rails_admin/main/_form_filtering_multiselect.html.erb +2 -2
  19. data/app/views/rails_admin/main/_form_filtering_select.html.erb +1 -1
  20. data/app/views/rails_admin/main/_form_multiple_file_upload.html.erb +1 -1
  21. data/app/views/rails_admin/main/dashboard.html.erb +2 -2
  22. data/app/views/rails_admin/main/history.html.erb +1 -1
  23. data/app/views/rails_admin/main/index.html.erb +7 -19
  24. data/config/initializers/active_record_extensions.rb +26 -3
  25. data/config/initializers/mongoid_extensions.rb +2 -0
  26. data/config/locales/rails_admin.en.yml +3 -2
  27. data/config/routes.rb +2 -0
  28. data/lib/generators/rails_admin/importmap_formatter.rb +28 -0
  29. data/lib/generators/rails_admin/install_generator.rb +68 -9
  30. data/lib/generators/rails_admin/templates/rails_admin.js +1 -0
  31. data/lib/generators/rails_admin/templates/rails_admin.scss.erb +1 -0
  32. data/lib/generators/rails_admin/templates/rails_admin.webpacker.js +2 -0
  33. data/lib/generators/rails_admin/utils.rb +2 -0
  34. data/lib/rails_admin/abstract_model.rb +9 -2
  35. data/lib/rails_admin/adapters/active_record/association.rb +11 -1
  36. data/lib/rails_admin/adapters/active_record/object_extension.rb +2 -0
  37. data/lib/rails_admin/adapters/active_record/property.rb +2 -0
  38. data/lib/rails_admin/adapters/active_record.rb +25 -2
  39. data/lib/rails_admin/adapters/composite_primary_keys/association.rb +45 -0
  40. data/lib/rails_admin/adapters/composite_primary_keys.rb +40 -0
  41. data/lib/rails_admin/adapters/mongoid/association.rb +14 -4
  42. data/lib/rails_admin/adapters/mongoid/bson.rb +2 -0
  43. data/lib/rails_admin/adapters/mongoid/extension.rb +3 -3
  44. data/lib/rails_admin/adapters/mongoid/object_extension.rb +2 -0
  45. data/lib/rails_admin/adapters/mongoid/property.rb +2 -0
  46. data/lib/rails_admin/adapters/mongoid.rb +4 -2
  47. data/lib/rails_admin/config/actions/base.rb +2 -0
  48. data/lib/rails_admin/config/actions/bulk_delete.rb +2 -0
  49. data/lib/rails_admin/config/actions/dashboard.rb +2 -0
  50. data/lib/rails_admin/config/actions/delete.rb +2 -0
  51. data/lib/rails_admin/config/actions/edit.rb +2 -0
  52. data/lib/rails_admin/config/actions/export.rb +2 -0
  53. data/lib/rails_admin/config/actions/history_index.rb +2 -0
  54. data/lib/rails_admin/config/actions/history_show.rb +2 -0
  55. data/lib/rails_admin/config/actions/index.rb +2 -0
  56. data/lib/rails_admin/config/actions/new.rb +2 -0
  57. data/lib/rails_admin/config/actions/show.rb +2 -0
  58. data/lib/rails_admin/config/actions/show_in_app.rb +2 -0
  59. data/lib/rails_admin/config/actions.rb +2 -0
  60. data/lib/rails_admin/config/configurable.rb +2 -0
  61. data/lib/rails_admin/config/const_load_suppressor.rb +78 -0
  62. data/lib/rails_admin/config/fields/association.rb +2 -0
  63. data/lib/rails_admin/config/fields/base.rb +44 -14
  64. data/lib/rails_admin/config/fields/factories/action_text.rb +2 -0
  65. data/lib/rails_admin/config/fields/factories/active_storage.rb +2 -0
  66. data/lib/rails_admin/config/fields/factories/association.rb +6 -5
  67. data/lib/rails_admin/config/fields/factories/carrierwave.rb +2 -0
  68. data/lib/rails_admin/config/fields/factories/devise.rb +2 -0
  69. data/lib/rails_admin/config/fields/factories/dragonfly.rb +2 -0
  70. data/lib/rails_admin/config/fields/factories/enum.rb +2 -0
  71. data/lib/rails_admin/config/fields/factories/paperclip.rb +2 -0
  72. data/lib/rails_admin/config/fields/factories/password.rb +2 -0
  73. data/lib/rails_admin/config/fields/factories/shrine.rb +2 -0
  74. data/lib/rails_admin/config/fields/group.rb +2 -0
  75. data/lib/rails_admin/config/fields/types/action_text.rb +6 -0
  76. data/lib/rails_admin/config/fields/types/active_record_enum.rb +2 -0
  77. data/lib/rails_admin/config/fields/types/active_storage.rb +14 -0
  78. data/lib/rails_admin/config/fields/types/all.rb +3 -0
  79. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +7 -5
  80. data/lib/rails_admin/config/fields/types/boolean.rb +7 -1
  81. data/lib/rails_admin/config/fields/types/bson_object_id.rb +2 -0
  82. data/lib/rails_admin/config/fields/types/carrierwave.rb +2 -0
  83. data/lib/rails_admin/config/fields/types/citext.rb +2 -0
  84. data/lib/rails_admin/config/fields/types/ck_editor.rb +2 -0
  85. data/lib/rails_admin/config/fields/types/code_mirror.rb +2 -0
  86. data/lib/rails_admin/config/fields/types/color.rb +2 -0
  87. data/lib/rails_admin/config/fields/types/composite_keys_belongs_to_association.rb +31 -0
  88. data/lib/rails_admin/config/fields/types/date.rb +2 -0
  89. data/lib/rails_admin/config/fields/types/datetime.rb +12 -0
  90. data/lib/rails_admin/config/fields/types/decimal.rb +2 -0
  91. data/lib/rails_admin/config/fields/types/dragonfly.rb +2 -0
  92. data/lib/rails_admin/config/fields/types/enum.rb +15 -2
  93. data/lib/rails_admin/config/fields/types/file_upload.rb +2 -0
  94. data/lib/rails_admin/config/fields/types/float.rb +2 -0
  95. data/lib/rails_admin/config/fields/types/froala.rb +2 -0
  96. data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +2 -0
  97. data/lib/rails_admin/config/fields/types/has_many_association.rb +2 -0
  98. data/lib/rails_admin/config/fields/types/has_one_association.rb +7 -1
  99. data/lib/rails_admin/config/fields/types/hidden.rb +2 -0
  100. data/lib/rails_admin/config/fields/types/inet.rb +2 -0
  101. data/lib/rails_admin/config/fields/types/integer.rb +2 -0
  102. data/lib/rails_admin/config/fields/types/json.rb +2 -0
  103. data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +22 -0
  104. data/lib/rails_admin/config/fields/types/multiple_carrierwave.rb +2 -0
  105. data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +2 -0
  106. data/lib/rails_admin/config/fields/types/numeric.rb +6 -0
  107. data/lib/rails_admin/config/fields/types/paperclip.rb +2 -0
  108. data/lib/rails_admin/config/fields/types/password.rb +2 -0
  109. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +2 -0
  110. data/lib/rails_admin/config/fields/types/serialized.rb +2 -0
  111. data/lib/rails_admin/config/fields/types/shrine.rb +2 -0
  112. data/lib/rails_admin/config/fields/types/simple_mde.rb +2 -0
  113. data/lib/rails_admin/config/fields/types/string.rb +2 -0
  114. data/lib/rails_admin/config/fields/types/string_like.rb +6 -0
  115. data/lib/rails_admin/config/fields/types/text.rb +2 -0
  116. data/lib/rails_admin/config/fields/types/time.rb +6 -0
  117. data/lib/rails_admin/config/fields/types/timestamp.rb +2 -0
  118. data/lib/rails_admin/config/fields/types/uuid.rb +2 -0
  119. data/lib/rails_admin/config/fields/types/wysihtml5.rb +2 -0
  120. data/lib/rails_admin/config/fields/types.rb +2 -0
  121. data/lib/rails_admin/config/fields.rb +3 -1
  122. data/lib/rails_admin/config/groupable.rb +2 -0
  123. data/lib/rails_admin/config/has_description.rb +2 -0
  124. data/lib/rails_admin/config/has_fields.rb +3 -1
  125. data/lib/rails_admin/config/has_groups.rb +2 -0
  126. data/lib/rails_admin/config/hideable.rb +2 -0
  127. data/lib/rails_admin/config/inspectable.rb +2 -0
  128. data/lib/rails_admin/config/lazy_model.rb +74 -0
  129. data/lib/rails_admin/config/model.rb +5 -1
  130. data/lib/rails_admin/config/proxyable/proxy.rb +2 -0
  131. data/lib/rails_admin/config/proxyable.rb +2 -0
  132. data/lib/rails_admin/config/sections/base.rb +2 -0
  133. data/lib/rails_admin/config/sections/create.rb +2 -0
  134. data/lib/rails_admin/config/sections/edit.rb +2 -0
  135. data/lib/rails_admin/config/sections/export.rb +2 -0
  136. data/lib/rails_admin/config/sections/list.rb +6 -0
  137. data/lib/rails_admin/config/sections/modal.rb +2 -0
  138. data/lib/rails_admin/config/sections/nested.rb +2 -0
  139. data/lib/rails_admin/config/sections/show.rb +2 -0
  140. data/lib/rails_admin/config/sections/update.rb +2 -0
  141. data/lib/rails_admin/config/sections.rb +2 -0
  142. data/lib/rails_admin/config.rb +26 -37
  143. data/lib/rails_admin/engine.rb +19 -17
  144. data/lib/rails_admin/extension.rb +2 -0
  145. data/lib/rails_admin/extensions/cancancan/authorization_adapter.rb +21 -4
  146. data/lib/rails_admin/extensions/cancancan.rb +2 -0
  147. data/lib/rails_admin/extensions/controller_extension.rb +2 -0
  148. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +49 -27
  149. data/lib/rails_admin/extensions/paper_trail.rb +2 -0
  150. data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +2 -0
  151. data/lib/rails_admin/extensions/pundit.rb +2 -0
  152. data/lib/rails_admin/support/csv_converter.rb +2 -1
  153. data/lib/rails_admin/support/datetime.rb +3 -1
  154. data/lib/rails_admin/support/es_module_processor.rb +23 -0
  155. data/lib/rails_admin/support/hash_helper.rb +2 -0
  156. data/lib/rails_admin/version.rb +4 -2
  157. data/lib/rails_admin.rb +7 -2
  158. data/lib/tasks/rails_admin.rake +2 -0
  159. data/package.json +2 -2
  160. data/src/rails_admin/base.js +13 -1
  161. data/src/rails_admin/filter-box.js +165 -209
  162. data/src/rails_admin/filtering-multiselect.js +5 -10
  163. data/src/rails_admin/filtering-select.js +16 -7
  164. data/src/rails_admin/i18n.js +3 -1
  165. data/src/rails_admin/nested-form-hooks.js +6 -4
  166. data/src/rails_admin/remote-form.js +5 -5
  167. data/src/rails_admin/styles/base/theming.scss +25 -8
  168. data/src/rails_admin/styles/base.scss +5 -5
  169. data/src/rails_admin/styles/widgets.scss +1 -1
  170. data/src/rails_admin/ui.js +45 -18
  171. data/src/rails_admin/widgets.js +7 -2
  172. data/vendor/assets/fonts/rails_admin/fa-solid-900.ttf +0 -0
  173. data/vendor/assets/fonts/rails_admin/fa-solid-900.woff2 +0 -0
  174. data/vendor/assets/javascripts/rails_admin/jquery3.js +118 -109
  175. data/vendor/assets/stylesheets/rails_admin/font-awesome.scss +4531 -2782
  176. metadata +17 -14
  177. data/lib/generators/rails_admin/templates/rails_admin.js.erb +0 -2
  178. data/lib/generators/rails_admin/templates/rails_admin.scss +0 -1
  179. data/lib/generators/rails_admin/templates/webpack.config.js +0 -29
  180. data/lib/rails_admin/support/esmodule_preprocessor.rb +0 -33
  181. data/vendor/assets/fonts/rails_admin/fa-solid-900.eot +0 -0
  182. data/vendor/assets/fonts/rails_admin/fa-solid-900.svg +0 -5034
  183. 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_admin/config/proxyable'
2
4
  require 'rails_admin/config/configurable'
3
5
  require 'rails_admin/config/hideable'
@@ -58,10 +60,28 @@ module RailsAdmin
58
60
  !virtual? || children_fields.first || false
59
61
  end
60
62
 
63
+ def sort_column
64
+ if sortable == true
65
+ "#{abstract_model.table_name}.#{name}"
66
+ elsif (sortable.is_a?(String) || sortable.is_a?(Symbol)) && sortable.to_s.include?('.') # just provide sortable, don't do anything smart
67
+ sortable
68
+ elsif sortable.is_a?(Hash) # just join sortable hash, don't do anything smart
69
+ "#{sortable.keys.first}.#{sortable.values.first}"
70
+ elsif association # use column on target table
71
+ "#{associated_model_config.abstract_model.table_name}.#{sortable}"
72
+ else # use described column in the field conf.
73
+ "#{abstract_model.table_name}.#{sortable}"
74
+ end
75
+ end
76
+
61
77
  register_instance_option :searchable do
62
78
  !virtual? || children_fields.first || false
63
79
  end
64
80
 
81
+ register_instance_option :search_operator do
82
+ RailsAdmin::Config.default_search_operator
83
+ end
84
+
65
85
  register_instance_option :queryable? do
66
86
  !virtual?
67
87
  end
@@ -70,8 +90,22 @@ module RailsAdmin
70
90
  !!searchable
71
91
  end
72
92
 
73
- register_instance_option :search_operator do
74
- @search_operator ||= RailsAdmin::Config.default_search_operator
93
+ register_instance_option :filter_operators do
94
+ []
95
+ end
96
+
97
+ register_instance_option :default_filter_operator do
98
+ nil
99
+ end
100
+
101
+ def filter_options
102
+ {
103
+ label: label,
104
+ name: name,
105
+ operator: default_filter_operator,
106
+ operators: filter_operators,
107
+ type: type,
108
+ }
75
109
  end
76
110
 
77
111
  # serials and dates are reversed in list, which is more natural (last modified items first).
@@ -226,10 +260,6 @@ module RailsAdmin
226
260
  []
227
261
  end
228
262
 
229
- register_instance_option :default_filter_operator do
230
- nil
231
- end
232
-
233
263
  register_instance_option :eager_load do
234
264
  false
235
265
  end
@@ -301,13 +331,13 @@ module RailsAdmin
301
331
  def value
302
332
  bindings[:object].safe_send(name)
303
333
  rescue NoMethodError => e
304
- raise e.exception <<-ERROR.gsub(/^\s{10}/, '')
305
- #{e.message}
306
- If you want to use a RailsAdmin virtual field(= a field without corresponding instance method),
307
- you should declare 'formatted_value' in the field definition.
308
- field :#{name} do
309
- formatted_value{ bindings[:object].call_some_method }
310
- end
334
+ raise e.exception <<~ERROR
335
+ #{e.message}
336
+ If you want to use a RailsAdmin virtual field(= a field without corresponding instance method),
337
+ you should declare 'formatted_value' in the field definition.
338
+ field :#{name} do
339
+ formatted_value{ bindings[:object].call_some_method }
340
+ end
311
341
  ERROR
312
342
  end
313
343
 
@@ -337,7 +367,7 @@ module RailsAdmin
337
367
  end
338
368
 
339
369
  def parse_input(_params)
340
- # overriden
370
+ # overridden
341
371
  end
342
372
 
343
373
  def inverse_of
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields'
2
4
  require 'rails_admin/config/fields/types'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields'
2
4
  require 'rails_admin/config/fields/types'
3
5
  require 'rails_admin/config/fields/types/file_upload'
@@ -1,11 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields'
2
4
  require 'rails_admin/config/fields/types'
3
5
  require 'rails_admin/config/fields/types/belongs_to_association'
4
6
 
5
7
  RailsAdmin::Config::Fields.register_factory do |parent, properties, fields|
6
- association = parent.abstract_model.associations.detect { |a| a.foreign_key == properties.name && %i[belongs_to has_and_belongs_to_many].include?(a.type) }
7
- if association
8
- field = RailsAdmin::Config::Fields::Types.load("#{association.polymorphic? ? :polymorphic : association.type}_association").new(parent, association.name, association)
8
+ parent.abstract_model.associations.filter { |a| Array(a.foreign_key).include?(properties.name) && %i[belongs_to has_and_belongs_to_many].include?(a.type) }.each do |association|
9
+ field = RailsAdmin::Config::Fields::Types.load(association.field_type).new(parent, association.name, association)
9
10
  fields << field
10
11
 
11
12
  child_columns = []
@@ -13,7 +14,7 @@ RailsAdmin::Config::Fields.register_factory do |parent, properties, fields|
13
14
  %i[foreign_key foreign_type foreign_inverse_of]
14
15
  else
15
16
  [:foreign_key]
16
- end.collect { |k| association.send(k) }.compact
17
+ end.flat_map { |k| Array(association.send(k)) }.compact
17
18
 
18
19
  parent.abstract_model.properties.select { |p| possible_field_names.include? p.name }.each do |column|
19
20
  child_field = fields.detect { |f| f.name.to_s == column.name.to_s }
@@ -27,5 +28,5 @@ RailsAdmin::Config::Fields.register_factory do |parent, properties, fields|
27
28
  end
28
29
 
29
30
  field.children_fields child_columns.collect(&:name)
30
- end
31
+ end.any?
31
32
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields'
2
4
  require 'rails_admin/config/fields/types'
3
5
  require 'rails_admin/config/fields/types/file_upload'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields'
2
4
  require 'rails_admin/config/fields/types'
3
5
  require 'rails_admin/config/fields/types/password'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields'
2
4
  require 'rails_admin/config/fields/types'
3
5
  require 'rails_admin/config/fields/types/file_upload'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields'
2
4
  require 'rails_admin/config/fields/types/enum'
3
5
  require 'rails_admin/config/fields/types/active_record_enum'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields'
2
4
  require 'rails_admin/config/fields/types'
3
5
  require 'rails_admin/config/fields/types/file_upload'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields'
2
4
  require 'rails_admin/config/fields/types/password'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields'
2
4
  require 'rails_admin/config/fields/types'
3
5
  require 'rails_admin/config/fields/types/file_upload'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/core_ext/string/inflections'
2
4
  require 'rails_admin/config/proxyable'
3
5
  require 'rails_admin/config/configurable'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/text'
2
4
 
3
5
  module RailsAdmin
@@ -20,6 +22,10 @@ module RailsAdmin
20
22
  "https://cdnjs.cloudflare.com/ajax/libs/trix/#{version}/trix.js"
21
23
  end
22
24
 
25
+ register_instance_option :warn_dynamic_load do
26
+ true
27
+ end
28
+
23
29
  register_instance_option :partial do
24
30
  :form_action_text
25
31
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/enum'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/file_upload'
2
4
 
3
5
  module RailsAdmin
@@ -26,6 +28,18 @@ module RailsAdmin
26
28
  {"#{name}_attachment": :blob}
27
29
  end
28
30
 
31
+ register_instance_option :direct? do
32
+ false
33
+ end
34
+
35
+ register_instance_option :html_attributes do
36
+ {
37
+ required: required? && !value.present?,
38
+ }.merge(
39
+ direct? && {data: {direct_upload_url: bindings[:view].main_app.rails_direct_uploads_url}} || {},
40
+ )
41
+ end
42
+
29
43
  def resource_url(thumb = false)
30
44
  return nil unless value
31
45
 
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/action_text'
2
4
  require 'rails_admin/config/fields/types/active_record_enum'
3
5
  require 'rails_admin/config/fields/types/active_storage'
4
6
  require 'rails_admin/config/fields/types/belongs_to_association'
5
7
  require 'rails_admin/config/fields/types/boolean'
6
8
  require 'rails_admin/config/fields/types/bson_object_id'
9
+ require 'rails_admin/config/fields/types/composite_keys_belongs_to_association'
7
10
  require 'rails_admin/config/fields/types/date'
8
11
  require 'rails_admin/config/fields/types/datetime'
9
12
  require 'rails_admin/config/fields/types/decimal'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/association'
2
4
 
3
5
  module RailsAdmin
@@ -7,6 +9,10 @@ module RailsAdmin
7
9
  class BelongsToAssociation < RailsAdmin::Config::Fields::Association
8
10
  RailsAdmin::Config::Fields::Types.register(self)
9
11
 
12
+ register_instance_option :filter_operators do
13
+ %w[_discard like not_like is starts_with ends_with] + (required? ? [] : %w[_separator _present _blank])
14
+ end
15
+
10
16
  register_instance_option :formatted_value do
11
17
  (o = value) && o.send(associated_model_config.object_label_method)
12
18
  end
@@ -27,12 +33,8 @@ module RailsAdmin
27
33
  true
28
34
  end
29
35
 
30
- def associated_primary_key
31
- association.primary_key
32
- end
33
-
34
36
  def selected_id
35
- bindings[:object].send(association.key_accessor)
37
+ bindings[:object].safe_send(association.key_accessor)
36
38
  end
37
39
 
38
40
  def method_name
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Fields
@@ -22,6 +24,10 @@ module RailsAdmin
22
24
  }
23
25
  end
24
26
 
27
+ register_instance_option :filter_operators do
28
+ %w[_discard true false] + (required? ? [] : %w[_separator _present _blank])
29
+ end
30
+
25
31
  register_instance_option :nullable? do
26
32
  properties&.nullable?
27
33
  end
@@ -31,7 +37,7 @@ module RailsAdmin
31
37
  end
32
38
 
33
39
  register_instance_option :pretty_value do
34
- %(<span class="label label-#{css_classes[form_value]}">#{labels[form_value]}</span>).html_safe
40
+ %(<span class="badge bg-#{css_classes[form_value]}">#{labels[form_value]}</span>).html_safe
35
41
  end
36
42
 
37
43
  register_instance_option :export_value do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/string'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/base'
2
4
  require 'rails_admin/config/fields/types/file_upload'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/text'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/text'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/text'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/string_like'
2
4
 
3
5
  module RailsAdmin
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_admin/config/fields/types/belongs_to_association'
4
+
5
+ module RailsAdmin
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class CompositeKeysBelongsToAssociation < RailsAdmin::Config::Fields::Types::BelongsToAssociation
10
+ RailsAdmin::Config::Fields::Types.register(self)
11
+
12
+ register_instance_option :allowed_methods do
13
+ nested_form ? [method_name] : Array(association.foreign_key)
14
+ end
15
+
16
+ def selected_id
17
+ association.foreign_key.map { |attribute| bindings[:object].safe_send(attribute) }.to_composite_keys.to_s
18
+ end
19
+
20
+ def parse_input(params)
21
+ return unless params[method_name].present? && association.foreign_key.is_a?(Array) && !nested_form
22
+
23
+ association.foreign_key.zip(CompositePrimaryKeys::CompositeKeys.parse(params.delete(method_name))).each do |key, value|
24
+ params[key] = value
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/datetime'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/base'
2
4
  require 'rails_admin/support/datetime'
3
5
 
@@ -16,6 +18,16 @@ module RailsAdmin
16
18
  params[name] = parse_value(params[name]) if params[name]
17
19
  end
18
20
 
21
+ register_instance_option :filter_operators do
22
+ %w[default between today yesterday this_week last_week] + (required? ? [] : %w[_separator _not_null _null])
23
+ end
24
+
25
+ def filter_options
26
+ super.merge(
27
+ datetimepicker_options: datepicker_options,
28
+ )
29
+ end
30
+
19
31
  register_instance_option :date_format do
20
32
  :long
21
33
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/numeric'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/base'
2
4
  require 'rails_admin/config/fields/types/file_upload'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/string'
2
4
 
3
5
  module RailsAdmin
@@ -7,16 +9,27 @@ module RailsAdmin
7
9
  class Enum < RailsAdmin::Config::Fields::Base
8
10
  RailsAdmin::Config::Fields::Types.register(self)
9
11
 
12
+ register_instance_option :filter_operators do
13
+ %w[_discard] +
14
+ enum.map do |label, value|
15
+ {label: label, value: value || label}
16
+ end + (required? ? [] : %w[_separator _present _blank])
17
+ end
18
+
10
19
  register_instance_option :partial do
11
20
  :form_enumeration
12
21
  end
13
22
 
14
23
  register_instance_option :enum_method do
15
- @enum_method ||= bindings[:object].class.respond_to?("#{name}_enum") || bindings[:object].respond_to?("#{name}_enum") ? "#{name}_enum" : name
24
+ @enum_method ||= bindings[:object].class.respond_to?("#{name}_enum") || (bindings[:object] || abstract_model.model.new).respond_to?("#{name}_enum") ? "#{name}_enum" : name
16
25
  end
17
26
 
18
27
  register_instance_option :enum do
19
- bindings[:object].class.respond_to?(enum_method) ? bindings[:object].class.send(enum_method) : bindings[:object].send(enum_method)
28
+ if abstract_model.model.respond_to?(enum_method)
29
+ abstract_model.model.send(enum_method)
30
+ else
31
+ (bindings[:object] || abstract_model.model.new).send(enum_method)
32
+ end
20
33
  end
21
34
 
22
35
  register_instance_option :pretty_value do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/string'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/numeric'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/text'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/has_many_association'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/association'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/association'
2
4
 
3
5
  module RailsAdmin
@@ -8,6 +10,10 @@ module RailsAdmin
8
10
  # Register field type for the type loader
9
11
  RailsAdmin::Config::Fields::Types.register(self)
10
12
 
13
+ register_instance_option :filter_operators do
14
+ %w[_discard like not_like is starts_with ends_with] + (required? ? [] : %w[_separator _present _blank])
15
+ end
16
+
11
17
  register_instance_option :partial do
12
18
  nested_form ? :form_nested_one : :form_filtering_select
13
19
  end
@@ -18,7 +24,7 @@ module RailsAdmin
18
24
  end
19
25
 
20
26
  def selected_id
21
- value.try :id
27
+ value.try(:id).try(:to_s)
22
28
  end
23
29
 
24
30
  def method_name
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/string_like'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/base'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/numeric'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/text'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/multiple_file_upload'
2
4
 
3
5
  module RailsAdmin
@@ -12,6 +14,10 @@ module RailsAdmin
12
14
  {resize_to_limit: [100, 100]}
13
15
  end
14
16
 
17
+ register_instance_option :keep_value do
18
+ value.signed_id
19
+ end
20
+
15
21
  register_instance_option :delete_value do
16
22
  value.id
17
23
  end
@@ -41,6 +47,10 @@ module RailsAdmin
41
47
  ActiveStorageAttachment
42
48
  end
43
49
 
50
+ register_instance_option :keep_method do
51
+ method_name if ::ActiveStorage.replace_on_assign_to_many
52
+ end
53
+
44
54
  register_instance_option :delete_method do
45
55
  "remove_#{name}" if bindings[:object].respond_to?("remove_#{name}")
46
56
  end
@@ -48,6 +58,18 @@ module RailsAdmin
48
58
  register_instance_option :eager_load do
49
59
  {"#{name}_attachments": :blob}
50
60
  end
61
+
62
+ register_instance_option :direct? do
63
+ false
64
+ end
65
+
66
+ register_instance_option :html_attributes do
67
+ {
68
+ required: required? && !value.present?,
69
+ }.merge(
70
+ direct? && {data: {direct_upload_url: bindings[:view].main_app.rails_direct_uploads_url}} || {},
71
+ )
72
+ end
51
73
  end
52
74
  end
53
75
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/types/multiple_file_upload'
2
4
 
3
5
  module RailsAdmin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAdmin
2
4
  module Config
3
5
  module Fields
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/base'
2
4
 
3
5
  module RailsAdmin
@@ -8,6 +10,10 @@ module RailsAdmin
8
10
  # Register field type for the type loader
9
11
  RailsAdmin::Config::Fields::Types.register(self)
10
12
 
13
+ register_instance_option :filter_operators do
14
+ %w[default between] + (required? ? [] : %w[_separator _not_null _null])
15
+ end
16
+
11
17
  register_instance_option :view_helper do
12
18
  :number_field
13
19
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_admin/config/fields/base'
2
4
  require 'rails_admin/config/fields/types/file_upload'
3
5