class AdminIt::Field

Describes any field of data

@author [alexiss]

Constants

EDITORS
TYPES

Attributes

display[R]
options[R]
partial[R]
read[R]
render[R]
type[R]
write[R]
readable[W]
visible[W]
writable[W]

Public Class Methods

create(name, _entity_class, **opts) click to toggle source
# File lib/admin_it/field/field.rb, line 77
def self.create(name, _entity_class, **opts)
  base = self
  Class.new(base) do
    @field_name, @entity_class = name, _entity_class
    import_data_module(base)
    self.type = opts[:type]
    @readable = opts[:readable].nil? ? true : opts[:readable] == true
    @writable = opts[:writable].nil? ? true : opts[:writable] == true
    @visible = opts[:visible].nil? ? true : opts[:visible] == true
    @sortable = opts[:sortable].nil? ? true : opts[:sortable] == true
    @options = opts[:options].is_a?(Hash) ? opts[:options] : {}
    if type == :image
      @options[:s3] = {} unless @options[:s3].is_a?(Hash)
      @options[:s3] = {}.merge(AdminIt.config.s3, @options[:s3])
    end
    @show_label = opts[:show_label].nil? ? true : opts[:show_label] == true
    self.editor = opts[:editor] unless opts[:editor].nil?
  end
end
editor() click to toggle source
# File lib/admin_it/field/field.rb, line 125
def self.editor
  return @editor unless @editor.nil?
  return @editor = :image if type == :image
  return @editor = :combo if type == :enum
  return @editor = :geo_picker if type == :geo_point
  return @editor = :boolean if type == :boolean
  @editor = EDITORS[0]
end
editor=(value) click to toggle source
# File lib/admin_it/field/field.rb, line 101
def self.editor=(value)
  @editor = value.ensure_symbol(values: EDITORS, default: EDITORS[0])
end
hide() click to toggle source
# File lib/admin_it/field/field.rb, line 117
def self.hide
  @visible = false
end
new(readable: nil, writable: nil, visible: nil, sortable: nil, show_label: nil, options: nil) click to toggle source
# File lib/admin_it/field/field.rb, line 138
def initialize(readable: nil, writable: nil, visible: nil, sortable: nil,
               show_label: nil, options: nil)
  run_callbacks :initialize do
    @readable = readable.nil? ? self.class.readable? : readable == true
    @writable = writable.nil? ? self.class.writable? : writable == true
    @visible = visible.nil? ? self.class.visible? : visible == true
    @sortable = sortable.nil? ? self.class.sortable? : sortable == true
    @show_label = show_label.nil? ? self.class.show_label? : show_label == true
  end
end
optionis() click to toggle source
# File lib/admin_it/field/field.rb, line 113
def self.optionis
  @options ||= {}
end
placeholder() click to toggle source
# File lib/admin_it/field/field.rb, line 105
def self.placeholder
  @placeholder ||= display_name
end
readable?() click to toggle source
# File lib/admin_it/field/field.rb, line 55
def self.readable?
  @readable.nil? ? @readable = true : @readable == true
end
show() click to toggle source
# File lib/admin_it/field/field.rb, line 121
def self.show
  @visible = true
end
show_label?() click to toggle source
# File lib/admin_it/field/field.rb, line 71
def self.show_label?
  @show_label.nil? ? @show_label = true : @show_label == true
end
sortable?() click to toggle source
# File lib/admin_it/field/field.rb, line 67
def self.sortable?
  @sortable.nil? ? @sortable = true : @sortable == true
end
type=(value) click to toggle source
# File lib/admin_it/field/field.rb, line 97
def self.type=(value)
  @type = value.ensure_symbol(values: TYPES, default: TYPES[0])
end
visible?() click to toggle source
# File lib/admin_it/field/field.rb, line 63
def self.visible?
  @visible.nil? ? @visible = true : @visible == true
end
writable?() click to toggle source
# File lib/admin_it/field/field.rb, line 59
def self.writable?
  @writable.nil? ? @writable = true : @writable == true
end

Protected Class Methods

default_display_name() click to toggle source
# File lib/admin_it/field/field.rb, line 50
def default_display_name
  field_name
end

Public Instance Methods

hidden?() click to toggle source
# File lib/admin_it/field/field.rb, line 165
def hidden?
  @visible != true
end
hide() click to toggle source
# File lib/admin_it/field/field.rb, line 36
def hide
  dsl_set(:visible, false)
end
input(template, entity) click to toggle source
# File lib/admin_it/field/field.rb, line 215
def input(template, entity)
  typed_method = "#{type}_input".to_sym
  if respond_to?(typed_method)
    send typed_method, template, entity
  else
    Helpers::Input.new(template, self, entity: entity)
  end
end
name() click to toggle source
# File lib/admin_it/field/field.rb, line 149
def name
  @name ||= self.class.field_name
end
read(entity) click to toggle source
# File lib/admin_it/field/field.rb, line 177
def read(entity)
  unless readable?
    fail FieldReadError, "Attempt to read write-only field #{name}"
  end
  self.class.read.nil? ? read_value(entity) : self.class.read.call(entity)
end
readable?() click to toggle source
# File lib/admin_it/field/field.rb, line 153
def readable?
  @readable == true
end
render(entity, instance: nil) click to toggle source
# File lib/admin_it/field/field.rb, line 203
def render(entity, instance: nil)
  renderer = self.class.render
  return if renderer.nil?
  # method used as event emmiter, call block in instance or caller
  # context if it present
  if instance.nil?
    self.class.render.call(entity)
  else
    instance.instance_exec(entity, &renderer)
  end
end
show() click to toggle source
# File lib/admin_it/field/field.rb, line 40
def show
  dsl_set(:visible, true)
end
show_label?() click to toggle source
# File lib/admin_it/field/field.rb, line 173
def show_label?
  @show_label == true
end
sortable?() click to toggle source
# File lib/admin_it/field/field.rb, line 169
def sortable?
  @sortable == true
end
visible?() click to toggle source
# File lib/admin_it/field/field.rb, line 161
def visible?
  @visible == true
end
writable?() click to toggle source
# File lib/admin_it/field/field.rb, line 157
def writable?
  @writable == true
end
write(entity, value) click to toggle source
# File lib/admin_it/field/field.rb, line 191
def write(entity, value)
  unless writable?
    fail FieldWriteError, "Attempt to write read-only field #{name}"
  end
  if self.class.write.nil?
    write_value(entity, value)
  else
    self.class.write.call(entity, value)
  end
  entity
end

Protected Instance Methods

read_value(entity) click to toggle source
# File lib/admin_it/field/field.rb, line 252
def read_value(entity)
  entity.send(name)
end
show_value(entity) click to toggle source

def read_value(entity)

fail NotImplementedError,
     "Attempt to read field #{name} with unimplemented reader"

end

def show_value(entity)

fail NotImplementedError,
     "Attempt to show field #{name} with unimplemented show method"

end

def write_value(entity, value)

fail NotImplementedError,
     "Attempt to write to field #{name} with unimplemented writer"

end

# File lib/admin_it/field/field.rb, line 241
def show_value(entity)
  value = read(entity)
  if type == :enum
    value.text
  elsif type == :geo_point
    value.nil? ? '' : "#{value.x}, #{value.y}"
  else
    value
  end
end
write_value(entity, value) click to toggle source
# File lib/admin_it/field/field.rb, line 256
def write_value(entity, value)
  if type == :geo_point
    point = entity.send(name)
    x, y = value.split(',', 2)
    factory = entity_class.const_get(:FACTORY, true)
    point = factory.point(x.to_f, y.to_f)
    value = point
  end
  entity.send("#{name}=", value)
end