Class: Lifeform::Libraries::Default::Input

Inherits:
Phlex::HTML
  • Object
show all
Includes:
CapturingRenderable
Defined in:
lib/lifeform/libraries/default/input.rb

Direct Known Subclasses

Shoelace::Input

Constant Summary collapse

WRAPPER_TAG =
:form_field
INPUT_TAG =
:input

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from CapturingRenderable

#render_in

Constructor Details

#initialize(form, field_definition, **attributes) ⇒ Input

Returns a new instance of Input.



17
18
19
20
21
22
23
24
# File 'lib/lifeform/libraries/default/input.rb', line 17

def initialize(form, field_definition, **attributes)
  @form = form
  @field_definition = field_definition
  @attributes = Lifeform::Form.parameters_to_attributes(field_definition.parameters).merge(attributes)
  @field_type = field_definition.type

  verify_attributes
end

Instance Attribute Details

#attributesObject (readonly)

Returns the value of attribute attributes.



10
11
12
# File 'lib/lifeform/libraries/default/input.rb', line 10

def attributes
  @attributes
end

#field_definitionObject (readonly)

Returns the value of attribute field_definition.



10
11
12
# File 'lib/lifeform/libraries/default/input.rb', line 10

def field_definition
  @field_definition
end

#formObject (readonly)

Returns the value of attribute form.



10
11
12
# File 'lib/lifeform/libraries/default/input.rb', line 10

def form
  @form
end

Instance Method Details

#handle_labelsObject



47
48
49
50
51
52
53
54
55
56
# File 'lib/lifeform/libraries/default/input.rb', line 47

def handle_labels
  label_text = attributes[:label].to_s
  label_name = (attributes[:id] || attributes[:name]).to_s

  @attributes = attributes.filter_map { |k, v| [k, v] unless k == :label }.to_h

  proc {
    label(for: label_name) { unsafe_raw label_text }
  }
end

#model_nameObject



37
38
39
40
41
# File 'lib/lifeform/libraries/default/input.rb', line 37

def model_name
  name_of_model = @form.class.name_of_model(@model)

  form.parent_name ? "#{form.parent_name}[#{name_of_model}]" : name_of_model
end

#template(&block) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/lifeform/libraries/default/input.rb', line 58

def template(&block)
  return if !@if.nil? && !@if

  wrapper_tag = self.class.const_get(:WRAPPER_TAG)
  input_tag = self.class.const_get(:INPUT_TAG)

  field_body = proc {
    @label&.()
    send input_tag, type: @field_type.to_s, **@attributes
    yield_content(&block)
  }
  return field_body.() unless wrapper_tag

  send wrapper_tag, name: @attributes[:name], &field_body
end

#value_for_modelObject



43
44
45
# File 'lib/lifeform/libraries/default/input.rb', line 43

def value_for_model
  @model.send(attributes[:name])
end

#verify_attributesObject

rubocop:disable Metrics



26
27
28
29
30
31
32
33
34
35
# File 'lib/lifeform/libraries/default/input.rb', line 26

def verify_attributes # rubocop:disable Metrics
  @model = attributes.delete(:model)
  @model = form.model if form.model && @model.nil?

  @if = attributes.delete(:if)
  attributes[:value] ||= value_for_model if form.model
  attributes[:name] = "#{model_name}[#{attributes[:name]}]" if @model
  attributes[:id] ||= attributes[:name].parameterize(separator: "_")
  @label = handle_labels if attributes[:label]
end