sferik/rails_admin

View on GitHub
lib/rails_admin/config/fields/factories/active_storage.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require 'rails_admin/config/fields'
require 'rails_admin/config/fields/types'
require 'rails_admin/config/fields/types/file_upload'

RailsAdmin::Config::Fields.register_factory do |parent, properties, fields|
  if defined?(::ActiveStorage) && properties.try(:association?) && (match = /\A(.+)_attachments?\Z/.match properties.name) && properties.klass.to_s == 'ActiveStorage::Attachment'
    name = match[1]
    field = RailsAdmin::Config::Fields::Types.load(
      properties.type == :has_many ? :multiple_active_storage : :active_storage,
    ).new(parent, name, properties)
    fields << field
    associations =
      if properties.type == :has_many
        [:"#{name}_attachments", :"#{name}_blobs"]
      else
        [:"#{name}_attachment", :"#{name}_blob"]
      end
    children_fields = associations.map do |child_name|
      child_association = parent.abstract_model.associations.detect { |p| p.name.to_sym == child_name }
      next unless child_association

      child_field = fields.detect { |f| f.name == child_name } || RailsAdmin::Config::Fields.default_factory.call(parent, child_association, fields)
      child_field.hide unless field == child_field
      child_field.filterable(false) unless field == child_field
      child_field.name
    end.flatten.compact
    field.children_fields(children_fields)
    true
  else
    false
  end
end