class Avo::Fields::BaseField

def component_for_view(view = :index)

def component_for_view(view = :index)
  "Avo::Fields::#{view_component_name}::#{view.to_s.camelize}Component".safe_constantize
end

def custom?

def custom?
  !method(:initialize).source_location.first.include?("lib/avo/field")
rescue
  true
end

def database_id(model)

Try to see if the field has a different database ID than it's name
def database_id(model)
  foreign_key
rescue
  id
end

def fill_field(model, key, value, params)

def fill_field(model, key, value, params)
  return model unless model.methods.include? key.to_sym
  model.send("#{key}=", value)
  model
end

def has_own_panel?

def has_own_panel?
  false
end

def hydrate(model: nil, resource: nil, action: nil, view: nil, panel_name: nil, user: nil)

def hydrate(model: nil, resource: nil, action: nil, view: nil, panel_name: nil, user: nil)
  @model = model if model.present?
  @view = view if view.present?
  @resource = resource if resource.present?
  @action = action if action.present?
  @user = user if user.present?
  @panel_name = panel_name if panel_name.present?
  self
end

def initialize(id, _options: {}, **args, &block)

def initialize(id, _options: {}, **args, &block)
  super(id, **args, &block)
  @id = id
  @name = args[:name] || id.to_s.humanize(keep_id_suffix: true)
  @translation_key = args[:translation_key]
  @block = block
  @required = args[:required] || false
  @readonly = args[:readonly] || false
  @sortable = args[:sortable] || false
  @nullable = args[:nullable] || false
  @null_values = args[:null_values] || [nil, ""]
  @format_using = args[:format_using] || nil
  @placeholder = args[:placeholder] || id.to_s.humanize(keep_id_suffix: true)
  @help = args[:help] || nil
  @default = args[:default] || nil
  @visible = args[:visible] || true
  @as_label = args[:as_label] || false
  @as_avatar = args[:as_avatar] || false
  @as_description = args[:as_description] || false
  @updatable = true
  @computable = true
  @computed = block.present?
  @computed_value = nil
  # Set the visibility
  show_on args[:show_on] if args[:show_on].present?
  hide_on args[:hide_on] if args[:hide_on].present?
  only_on args[:only_on] if args[:only_on].present?
  except_on args[:except_on] if args[:except_on].present?
end

def model_errors

def model_errors
  return {} if model.nil?
  model.errors
end

def model_or_class(model)

def model_or_class(model)
  if model.instance_of?(String)
    "class"
  else
    "model"
  end
end

def resolve_attribute(value)

def resolve_attribute(value)
  value
end

def to_permitted_param

def to_permitted_param
  id.to_sym
end

def type

def type
  self.class.name.demodulize.to_s.underscore.gsub("_field", "")
end

def value(property = nil)

def value(property = nil)
  property ||= id
  # Get model value
  final_value = @model.send(property) if (model_or_class(@model) == "model") && @model.respond_to?(property)
  if (@view === :new) || @action.present?
    final_value = if default.present? && default.respond_to?(:call)
      default.call
    else
      default
    end
  end
  # Run callback block if present
  if computable && block.present?
    final_value = block.call @model, @resource, @view, self
  end
  # Run the value through resolver if present
  final_value = @format_using.call final_value if @format_using.present?
  final_value
end

def view_component_name

def view_component_name
  "#{type.camelize}Field"
end

def visible?

def visible?
  if visible.present? && visible.respond_to?(:call)
    visible.call resource: resource
  else
    visible
  end
end