Class: LatoCms::PageField

Inherits:
ApplicationRecord
  • Object
show all
Defined in:
app/models/lato_cms/page_field.rb

Constant Summary collapse

REPEATER_ORDER_FIELD_ID =
"__repeater_order".freeze

Instance Method Summary collapse

Instance Method Details

#as_json(_options = {}) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'app/models/lato_cms/page_field.rb', line 78

def as_json(_options = {})
  result = {
    id: id,
    field_id: base_field_id,
    field_type: field_type,
    field_name: field_name,
    required: field_required?,
    value: nil,
    attachments: []
  }

  case field_type
  when 'file', 'image'
    attached = files.first
    result[:attachments] = attached ? [attachment_as_json(attached)] : []
  when 'gallery'
    order = value ? (JSON.parse(value) rescue []) : []
    all_files = files.to_a
    ordered = order.any? ? all_files.sort_by { |f| order.index(f.id.to_s) || Float::INFINITY } : all_files
    result[:attachments] = ordered.map { |f| attachment_as_json(f) }
  else
    result[:value] = parsed_value
  end

  result
end

#base_field_idObject



56
57
58
59
60
# File 'app/models/lato_cms/page_field.rb', line 56

def base_field_id
  return field_id unless repeater_item_id

  field_id.to_s.split('.', 2).last
end

#field_configObject



38
39
40
41
42
43
44
# File 'app/models/lato_cms/page_field.rb', line 38

def field_config
  return nil if repeater_order?

  component = LatoCms::TemplateManager.find_component(component_id)
  return nil unless component
  component.dig('fields', base_field_id)
end

#field_nameObject



66
67
68
# File 'app/models/lato_cms/page_field.rb', line 66

def field_name
  field_config&.dig('name') || field_id.to_s.humanize
end

#field_required?Boolean

Returns:

  • (Boolean)


70
71
72
# File 'app/models/lato_cms/page_field.rb', line 70

def field_required?
  field_config&.dig('required') == true
end

#field_settingsObject



74
75
76
# File 'app/models/lato_cms/page_field.rb', line 74

def field_settings
  field_config&.dig('settings') || {}
end

#field_typeObject



62
63
64
# File 'app/models/lato_cms/page_field.rb', line 62

def field_type
  field_config&.dig('type') || 'string'
end

#parsed_valueObject



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'app/models/lato_cms/page_field.rb', line 17

def parsed_value
  return nil if value.blank?

  case field_type
  when 'number'
    value.include?('.') ? value.to_f : value.to_i
  when 'boolean'
    value == 'true'
  when 'json'
    JSON.parse(value) rescue value
  when 'date'
    Date.parse(value) rescue value
  when 'datetime'
    DateTime.parse(value) rescue value
  when 'multiselect'
    JSON.parse(value) rescue [value]
  else
    value
  end
end

#repeater_item_idObject



50
51
52
53
54
# File 'app/models/lato_cms/page_field.rb', line 50

def repeater_item_id
  return nil unless field_id.to_s.include?('.')

  field_id.to_s.split('.', 2).first
end

#repeater_order?Boolean

Returns:

  • (Boolean)


46
47
48
# File 'app/models/lato_cms/page_field.rb', line 46

def repeater_order?
  field_id == REPEATER_ORDER_FIELD_ID
end