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,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/types/string"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class Enum < RailsAdminNext::Config::Fields::Base
10
+ RailsAdminNext::Config::Fields::Types.register(self)
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
+
19
+ register_instance_option :partial do
20
+ :form_enumeration
21
+ end
22
+
23
+ register_instance_option :enum_method do
24
+ @enum_method ||= (bindings[:object].class.respond_to?("#{name}_enum") || (bindings[:object] || abstract_model.model.new).respond_to?("#{name}_enum")) ? "#{name}_enum" : name
25
+ end
26
+
27
+ register_instance_option :enum do
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
33
+ end
34
+
35
+ register_instance_option :pretty_value do
36
+ if enum.is_a?(::Hash)
37
+ enum.select { |_k, v| v.to_s == value.to_s }.keys.first.to_s.presence || value.presence || " - "
38
+ elsif enum.is_a?(::Array) && enum.first.is_a?(::Array)
39
+ enum.detect { |e| e[1].to_s == value.to_s }.try(:first).to_s.presence || value.presence || " - "
40
+ else
41
+ value.presence || " - "
42
+ end
43
+ end
44
+
45
+ register_instance_option :multiple? do
46
+ properties && [:serialized].include?(properties.type)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/types/string"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class FileUpload < RailsAdminNext::Config::Fields::Base
10
+ RailsAdminNext::Config::Fields::Types.register(self)
11
+
12
+ register_instance_option :partial do
13
+ :form_file_upload
14
+ end
15
+
16
+ register_instance_option :thumb_method do
17
+ nil
18
+ end
19
+
20
+ register_instance_option :delete_method do
21
+ nil
22
+ end
23
+
24
+ register_instance_option :cache_method do
25
+ nil
26
+ end
27
+
28
+ register_instance_option :cache_value do
29
+ bindings[:object].public_send(cache_method) if cache_method
30
+ end
31
+
32
+ register_instance_option :export_value do
33
+ resource_url.to_s
34
+ end
35
+
36
+ register_instance_option :link_name do
37
+ value
38
+ end
39
+
40
+ register_instance_option :pretty_value do
41
+ if value.presence
42
+ v = bindings[:view]
43
+ url = resource_url
44
+ if image
45
+ thumb_url = resource_url(thumb_method)
46
+ image_html = v.image_tag(thumb_url, class: "img-thumbnail")
47
+ (url == thumb_url) ? image_html : v.link_to(image_html, url, target: "_blank", rel: "noopener noreferrer")
48
+ else
49
+ v.link_to(link_name, url, target: "_blank", rel: "noopener noreferrer")
50
+ end
51
+ end
52
+ end
53
+
54
+ register_instance_option :image? do
55
+ mime_type = Mime::Type.lookup_by_extension(extension)
56
+ mime_type.to_s.match?(/^image/)
57
+ end
58
+
59
+ register_instance_option :allowed_methods do
60
+ [method_name, delete_method, cache_method].compact
61
+ end
62
+
63
+ register_instance_option :html_attributes do
64
+ {
65
+ required: required? && !value.present?
66
+ }
67
+ end
68
+
69
+ def extension
70
+ URI.parse(resource_url).path.split(".").last
71
+ rescue URI::InvalidURIError
72
+ nil
73
+ end
74
+
75
+ # virtual class
76
+ def resource_url
77
+ raise "not implemented"
78
+ end
79
+
80
+ def virtual?
81
+ true
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/types/numeric"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class Float < RailsAdminNext::Config::Fields::Types::Numeric
10
+ # Register field type for the type loader
11
+ RailsAdminNext::Config::Fields::Types.register(self)
12
+
13
+ register_instance_option :html_attributes do
14
+ {
15
+ required: required?,
16
+ step: "any"
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/collection_association"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class HasAndBelongsToManyAssociation < RailsAdminNext::Config::Fields::CollectionAssociation
10
+ # Register field type for the type loader
11
+ RailsAdminNext::Config::Fields::Types.register(self)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/collection_association"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class HasManyAssociation < RailsAdminNext::Config::Fields::CollectionAssociation
10
+ # Register field type for the type loader
11
+ RailsAdminNext::Config::Fields::Types.register(self)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/singular_association"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class HasOneAssociation < RailsAdminNext::Config::Fields::SingularAssociation
10
+ # Register field type for the type loader
11
+ RailsAdminNext::Config::Fields::Types.register(self)
12
+
13
+ register_instance_option :allowed_methods do
14
+ nested_form ? [method_name] : [name]
15
+ end
16
+
17
+ def associated_prepopulate_params
18
+ {associated_model_config.abstract_model.param_key => {association.foreign_key => bindings[:object].try(:id)}}
19
+ end
20
+
21
+ def parse_input(params)
22
+ return super if nested_form
23
+
24
+ id = params.delete(method_name)
25
+ params[name] = associated_model_config.abstract_model.get(id) if id
26
+ end
27
+
28
+ def selected_id
29
+ format_key(value.try(:id)).try(:to_s)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/types/string_like"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class Hidden < StringLike
10
+ RailsAdminNext::Config::Fields::Types.register(self)
11
+
12
+ register_instance_option :view_helper do
13
+ :hidden_field
14
+ end
15
+
16
+ register_instance_option :label do
17
+ false
18
+ end
19
+
20
+ register_instance_option :help do
21
+ false
22
+ end
23
+
24
+ def generic_help
25
+ false
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/base"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class Inet < RailsAdminNext::Config::Fields::Base
10
+ RailsAdminNext::Config::Fields::Types.register(self)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/types/numeric"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class Integer < RailsAdminNext::Config::Fields::Types::Numeric
10
+ # Register field type for the type loader
11
+ RailsAdminNext::Config::Fields::Types.register(self)
12
+
13
+ register_instance_option :sort_reverse? do
14
+ serial?
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/types/text"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class Json < RailsAdminNext::Config::Fields::Types::Text
10
+ # Register field type for the type loader
11
+ RailsAdminNext::Config::Fields::Types.register(self)
12
+ RailsAdminNext::Config::Fields::Types.register(:jsonb, self)
13
+
14
+ register_instance_option :formatted_value do
15
+ value ? JSON.pretty_generate(value) : nil
16
+ end
17
+
18
+ register_instance_option :pretty_value do
19
+ bindings[:view].content_tag(:pre) { formatted_value }.html_safe
20
+ end
21
+
22
+ register_instance_option :export_value do
23
+ formatted_value
24
+ end
25
+
26
+ def parse_value(value)
27
+ value.present? ? JSON.parse(value) : nil
28
+ end
29
+
30
+ def parse_input(params)
31
+ params[name] = parse_value(params[name]) if params[name].is_a?(::String)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/types/multiple_file_upload"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class MultipleActiveStorage < RailsAdminNext::Config::Fields::Types::MultipleFileUpload
10
+ RailsAdminNext::Config::Fields::Types.register(self)
11
+
12
+ class ActiveStorageAttachment < RailsAdminNext::Config::Fields::Types::MultipleFileUpload::AbstractAttachment
13
+ register_instance_option :thumb_method do
14
+ {resize_to_limit: [100, 100]}
15
+ end
16
+
17
+ register_instance_option :keep_value do
18
+ value.signed_id
19
+ end
20
+
21
+ register_instance_option :delete_value do
22
+ value.id
23
+ end
24
+
25
+ register_instance_option :image? do
26
+ value && (value.representable? || value.content_type.match?(/^image/))
27
+ end
28
+
29
+ def resource_url(thumb = false)
30
+ return nil unless value
31
+
32
+ if thumb && value.representable?
33
+ representation = value.representation(thumb_method)
34
+ Rails.application.routes.url_helpers.rails_blob_representation_path(
35
+ representation.blob.signed_id, representation.variation.key, representation.blob.filename, only_path: true
36
+ )
37
+ else
38
+ Rails.application.routes.url_helpers.rails_blob_path(value, only_path: true)
39
+ end
40
+ end
41
+ end
42
+
43
+ register_instance_option :attachment_class do
44
+ ActiveStorageAttachment
45
+ end
46
+
47
+ register_instance_option :keep_method do
48
+ method_name
49
+ end
50
+
51
+ register_instance_option :delete_method do
52
+ "remove_#{name}" if bindings[:object].respond_to?("remove_#{name}")
53
+ end
54
+
55
+ register_instance_option :eager_load do
56
+ {"#{name}_attachments": :blob}
57
+ end
58
+
59
+ register_instance_option :direct? do
60
+ false
61
+ end
62
+
63
+ register_instance_option :html_attributes do
64
+ {
65
+ required: required? && !value.present?
66
+ }.merge(
67
+ direct? && {data: {direct_upload_url: bindings[:view].main_app.rails_direct_uploads_url}} || {}
68
+ )
69
+ end
70
+
71
+ register_instance_option :searchable do
72
+ false
73
+ end
74
+
75
+ register_instance_option :sortable do
76
+ false
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsAdminNext
4
+ module Config
5
+ module Fields
6
+ module Types
7
+ class MultipleFileUpload < RailsAdminNext::Config::Fields::Base
8
+ RailsAdminNext::Config::Fields::Types.register(self)
9
+
10
+ class AbstractAttachment
11
+ include RailsAdminNext::Config::Proxyable
12
+ include RailsAdminNext::Config::Configurable
13
+
14
+ attr_reader :value
15
+
16
+ def initialize(value)
17
+ @value = value
18
+ end
19
+
20
+ register_instance_option :thumb_method do
21
+ nil
22
+ end
23
+
24
+ register_instance_option :keep_value do
25
+ nil
26
+ end
27
+
28
+ register_instance_option :delete_value do
29
+ nil
30
+ end
31
+
32
+ register_deprecated_instance_option :delete_key, :delete_value
33
+
34
+ register_instance_option :pretty_value do
35
+ if value.presence
36
+ v = bindings[:view]
37
+ url = resource_url
38
+ if image
39
+ thumb_url = resource_url(thumb_method)
40
+ image_html = v.image_tag(thumb_url, class: "img-thumbnail")
41
+ (url == thumb_url) ? image_html : v.link_to(image_html, url, target: "_blank", rel: "noopener noreferrer")
42
+ else
43
+ display_value = value.respond_to?(:filename) ? value.filename : value
44
+ v.link_to(display_value, url, target: "_blank", rel: "noopener noreferrer")
45
+ end
46
+ end
47
+ end
48
+
49
+ register_instance_option :image? do
50
+ mime_type = Mime::Type.lookup_by_extension(extension)
51
+ mime_type.to_s.match?(/^image/)
52
+ end
53
+
54
+ def resource_url(_thumb = false)
55
+ raise "not implemented"
56
+ end
57
+
58
+ def extension
59
+ URI.parse(resource_url).path.split(".").last
60
+ rescue URI::InvalidURIError
61
+ nil
62
+ end
63
+ end
64
+
65
+ def initialize(*args)
66
+ super
67
+ @attachment_configurations = []
68
+ end
69
+
70
+ register_instance_option :attachment_class do
71
+ AbstractAttachment
72
+ end
73
+
74
+ register_instance_option :partial do
75
+ :form_multiple_file_upload
76
+ end
77
+
78
+ register_instance_option :cache_method do
79
+ nil
80
+ end
81
+
82
+ register_instance_option :delete_method do
83
+ nil
84
+ end
85
+
86
+ register_instance_option :keep_method do
87
+ nil
88
+ end
89
+
90
+ register_instance_option :reorderable? do
91
+ false
92
+ end
93
+
94
+ register_instance_option :export_value do
95
+ attachments.map(&:resource_url).join(",")
96
+ end
97
+
98
+ register_instance_option :pretty_value do
99
+ bindings[:view].safe_join attachments.map(&:pretty_value), " "
100
+ end
101
+
102
+ register_instance_option :allowed_methods do
103
+ [method_name, cache_method, delete_method].compact
104
+ end
105
+
106
+ register_instance_option :html_attributes do
107
+ {
108
+ required: required? && !value.present?
109
+ }
110
+ end
111
+
112
+ def attachment(&block)
113
+ @attachment_configurations << block
114
+ end
115
+
116
+ def attachments
117
+ Array(value).map do |attached|
118
+ attachment = attachment_class.new(attached)
119
+ @attachment_configurations.each do |config|
120
+ attachment.instance_eval(&config)
121
+ end
122
+ attachment.with(bindings)
123
+ end
124
+ end
125
+
126
+ # virtual class
127
+ def virtual?
128
+ true
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/base"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class Numeric < RailsAdminNext::Config::Fields::Base
10
+ # Register field type for the type loader
11
+ RailsAdminNext::Config::Fields::Types.register(self)
12
+
13
+ register_instance_option :filter_operators do
14
+ %w[default between] + (required? ? [] : %w[_separator _not_null _null])
15
+ end
16
+
17
+ register_instance_option :view_helper do
18
+ :number_field
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_admin_next/config/fields/types/string"
4
+
5
+ module RailsAdminNext
6
+ module Config
7
+ module Fields
8
+ module Types
9
+ class Password < RailsAdminNext::Config::Fields::Types::String
10
+ # Register field type for the type loader
11
+ RailsAdminNext::Config::Fields::Types.register(self)
12
+
13
+ register_instance_option :view_helper do
14
+ :password_field
15
+ end
16
+
17
+ def parse_input(params)
18
+ if params[name].present?
19
+ params[name] = params[name]
20
+ else
21
+ params.delete(name)
22
+ end
23
+ end
24
+
25
+ register_instance_option :formatted_value do
26
+ "".html_safe
27
+ end
28
+
29
+ # Password field's value does not need to be read
30
+ def value
31
+ ""
32
+ end
33
+
34
+ register_instance_option :visible do
35
+ section.is_a?(RailsAdminNext::Config::Sections::Edit)
36
+ end
37
+
38
+ register_instance_option :pretty_value do
39
+ "*****"
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end