lib/rails_admin/config/fields/types/multiple_file_upload.rb
# frozen_string_literal: true
module RailsAdmin
module Config
module Fields
module Types
class MultipleFileUpload < RailsAdmin::Config::Fields::Base
RailsAdmin::Config::Fields::Types.register(self)
class AbstractAttachment
include RailsAdmin::Config::Proxyable
include RailsAdmin::Config::Configurable
attr_reader :value
def initialize(value)
@value = value
end
register_instance_option :thumb_method do
nil
end
register_instance_option :keep_value do
nil
end
register_instance_option :delete_value do
nil
end
register_deprecated_instance_option :delete_key, :delete_value
register_instance_option :pretty_value do
if value.presence
v = bindings[:view]
url = resource_url
if image
thumb_url = resource_url(thumb_method)
image_html = v.image_tag(thumb_url, class: 'img-thumbnail')
url == thumb_url ? image_html : v.link_to(image_html, url, target: '_blank', rel: 'noopener noreferrer')
else
display_value = value.respond_to?(:filename) ? value.filename : value
v.link_to(display_value, url, target: '_blank', rel: 'noopener noreferrer')
end
end
end
register_instance_option :image? do
mime_type = Mime::Type.lookup_by_extension(resource_url.to_s.split('.').last)
mime_type.to_s.match?(/^image/)
end
def resource_url(_thumb = false)
raise 'not implemented'
end
end
def initialize(*args)
super
@attachment_configurations = []
end
register_instance_option :attachment_class do
AbstractAttachment
end
register_instance_option :partial do
:form_multiple_file_upload
end
register_instance_option :cache_method do
nil
end
register_instance_option :delete_method do
nil
end
register_instance_option :keep_method do
nil
end
register_instance_option :reorderable? do
false
end
register_instance_option :export_value do
attachments.map(&:resource_url).map(&:to_s).join(',')
end
register_instance_option :pretty_value do
bindings[:view].safe_join attachments.map(&:pretty_value), ' '
end
register_instance_option :allowed_methods do
[method_name, cache_method, delete_method].compact
end
register_instance_option :html_attributes do
{
required: required? && !value.present?,
}
end
def attachment(&block)
@attachment_configurations << block
end
def attachments
Array(value).map do |attached|
attachment = attachment_class.new(attached)
@attachment_configurations.each do |config|
attachment.instance_eval(&config)
end
attachment.with(bindings)
end
end
# virtual class
def virtual?
true
end
end
end
end
end
end