Class: Field

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/fields/field.rb

Overview

Copyright © 2008-2013 Michael Dvorkin and contributors.

Fat Free CRM is freely distributable under the terms of MIT license. See MIT-LICENSE file or www.opensource.org/licenses/mit-license.php


Schema Information

Table name: fields

id             :integer         not null, primary key
type           :string(255)
field_group_id :integer
position       :integer
pair_id        :integer
name           :string(64)
label          :string(128)
hint           :string(255)
placeholder    :string(255)
as             :string(32)
collection     :text
disabled       :boolean
required       :boolean
maxlength      :integer
minlength      :integer
created_at     :datetime
updated_at     :datetime

Direct Known Subclasses

CoreField, CustomField

Constant Summary collapse

BASE_FIELD_TYPES =
{
  'string'      => { klass: 'CustomField', type: 'string' },
  'text'        => { klass: 'CustomField', type: 'text' },
  'email'       => { klass: 'CustomField', type: 'string' },
  'url'         => { klass: 'CustomField', type: 'string' },
  'tel'         => { klass: 'CustomField', type: 'string' },
  'select'      => { klass: 'CustomField', type: 'string' },
  'radio_buttons' => { klass: 'CustomField', type: 'string' },
  'check_boxes' => { klass: 'CustomField', type: 'text' },
  'boolean'     => { klass: 'CustomField', type: 'boolean' },
  'date'        => { klass: 'CustomField', type: 'date' },
  'datetime'    => { klass: 'CustomField', type: 'timestamp' },
  'decimal'     => { klass: 'CustomField', type: 'decimal', column_options: { precision: 15, scale: 2 } },
  'integer'     => { klass: 'CustomField', type: 'integer' },
  'float'       => { klass: 'CustomField', type: 'float' }
}.with_indifferent_access

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.field_typesObject

Provides access to registered field_types




113
114
115
# File 'app/models/fields/field.rb', line 113

def field_types
  @@field_types ||= BASE_FIELD_TYPES
end

.lookup_class(as) ⇒ Object

Returns class name given a key




127
128
129
# File 'app/models/fields/field.rb', line 127

def lookup_class(as)
  (@@field_types ||= BASE_FIELD_TYPES)[as][:klass]
end

.register(options) ⇒ Object

Register custom fields so they are available to the rest of the app Example options: :as => ‘datepair’, :type => ‘date’, :klass => ‘CustomFieldDatePair’




120
121
122
123
# File 'app/models/fields/field.rb', line 120

def register(options)
  as = options.delete(:as)
  (@@field_types ||= BASE_FIELD_TYPES).merge!(as => options)
end

Instance Method Details

#collection_stringObject



85
86
87
# File 'app/models/fields/field.rb', line 85

def collection_string
  collection.try(:join, "|")
end

#collection_string=(value) ⇒ Object



81
82
83
# File 'app/models/fields/field.rb', line 81

def collection_string=(value)
  self.collection = value.split("|").map(&:strip).reject(&:blank?)
end

#column_type(field_type = as) ⇒ Object



70
71
72
# File 'app/models/fields/field.rb', line 70

def column_type(field_type = as)
  (opts = Field.field_types[field_type]) ? opts[:type] : raise("Unknown field_type: #{field_type}")
end

#input_optionsObject



74
75
76
77
78
79
# File 'app/models/fields/field.rb', line 74

def input_options
  input_html = {}
  attributes.reject do |k, v|
    !%w[as collection disabled label placeholder required minlength maxlength].include?(k) || v.blank?
  end.symbolize_keys.merge(input_html)
end

#render(value) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/models/fields/field.rb', line 93

def render(value)
  case as
  when 'checkbox'
    value.to_s == '0' ? "no" : "yes"
  when 'date'
    value&.strftime(I18n.t("date.formats.mmddyy"))
  when 'datetime'
    value&.in_time_zone&.strftime(I18n.t("time.formats.mmddyyyy_hhmm"))
  when 'check_boxes'
    value.select(&:present?).in_groups_of(2, false).map { |g| g.join(', ') }.join("<br />".html_safe) if Array === value
  else
    value.to_s
  end
end

#render_value(object) ⇒ Object



89
90
91
# File 'app/models/fields/field.rb', line 89

def render_value(object)
  render object.send(name)
end