Class: ActionForm::SubformsCollection

Inherits:
Phlex::HTML
  • Object
show all
Extended by:
Forwardable
Includes:
Composition, Rendering
Defined in:
lib/action_form/subforms_collection.rb

Overview

Collection of subforms that can be iterated and rendered

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Composition

included

Methods included from Rendering

#render_element, #render_elements, #render_form, #render_inline_errors, #render_input, #render_label, #render_many_subforms, #render_new_subform_button, #render_remove_subform_button, #render_subform, #render_submit

Constructor Details

#initialize(name) ⇒ SubformsCollection

Returns a new instance of SubformsCollection.



31
32
33
34
35
36
# File 'lib/action_form/subforms_collection.rb', line 31

def initialize(name)
  super()
  @name = name
  @subforms = []
  @tags = {}
end

Class Attribute Details

.defaultObject

Returns the value of attribute default.



16
17
18
# File 'lib/action_form/subforms_collection.rb', line 16

def default
  @default
end

.host_classObject

Returns the value of attribute host_class.



16
17
18
# File 'lib/action_form/subforms_collection.rb', line 16

def host_class
  @host_class
end

.subform_definitionObject

Returns the value of attribute subform_definition.



16
17
18
# File 'lib/action_form/subforms_collection.rb', line 16

def subform_definition
  @subform_definition
end

Instance Attribute Details

#helpersObject

Returns the value of attribute helpers.



13
14
15
# File 'lib/action_form/subforms_collection.rb', line 13

def helpers
  @helpers
end

#nameObject (readonly)

Returns the value of attribute name.



12
13
14
# File 'lib/action_form/subforms_collection.rb', line 12

def name
  @name
end

#subformsObject (readonly)

Returns the value of attribute subforms.



12
13
14
# File 'lib/action_form/subforms_collection.rb', line 12

def subforms
  @subforms
end

#tagsObject (readonly)

Returns the value of attribute tags.



12
13
14
# File 'lib/action_form/subforms_collection.rb', line 12

def tags
  @tags
end

Class Method Details

.inherited(subclass) ⇒ Object



23
24
25
26
27
28
# File 'lib/action_form/subforms_collection.rb', line 23

def inherited(subclass)
  super
  subclass.subform_definition = Class.new(subform_definition) if subform_definition
  subclass.default = default
  subclass.host_class = host_class
end

.subform(subform_class = nil, &block) ⇒ Object



18
19
20
21
# File 'lib/action_form/subforms_collection.rb', line 18

def subform(subform_class = nil, &block)
  @subform_definition ||= subform_class || Class.new(host_class.subform_class)
  @subform_definition.class_eval(&block) if block
end

Instance Method Details

#add_subform_jsObject



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/action_form/subforms_collection.rb', line 52

def add_subform_js
  <<~JS
    function actionFormAddSubform(event) {
      event.preventDefault()
      var template = document.querySelector("##{template_html_id}")
      const content = template.innerHTML.replace(/NEW_RECORD/g, new Date().getTime().toString())
      var beforeElement = event.target.closest(event.target.dataset.insertBeforeSelector)
      if (beforeElement) {
        beforeElement.insertAdjacentHTML("beforebegin", content)
      } else {
        event.target.parentElement.insertAdjacentHTML("beforebegin", content)
      }
    }
  JS
end

#each(&block) ⇒ Object



38
39
40
41
42
# File 'lib/action_form/subforms_collection.rb', line 38

def each(&block)
  return to_enum(:each) unless block

  @subforms.each(&block)
end

#remove_subform_jsObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/action_form/subforms_collection.rb', line 68

def remove_subform_js
  <<~JS
    function actionFormRemoveSubform(event) {
      event.preventDefault()
      var subform = event.target.closest(".new_#{name}")
      if (subform) { subform.remove() }
      var subform = event.target.closest(".#{name}_subform")
      if (subform) {
        subform.style.display = "none"
        var input = subform.querySelector("input[name*='_destroy']")
        if (input) { input.value = "1" }
      }
    }
  JS
end

#render?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/action_form/subforms_collection.rb', line 44

def render?
  true
end

#render_subform_template(subform) ⇒ Object



97
98
99
100
101
# File 'lib/action_form/subforms_collection.rb', line 97

def render_subform_template(subform)
  template(id: template_html_id) do
    div(class: "new_#{name}") { render_subform(subform) }
  end
end

#template_html_idObject



48
49
50
# File 'lib/action_form/subforms_collection.rb', line 48

def template_html_id
  "#{name}_template"
end

#view_templateObject

rubocop:disable Metrics/AbcSize



84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/action_form/subforms_collection.rb', line 84

def view_template # rubocop:disable Metrics/AbcSize
  script(type: "text/javascript") { raw safe(remove_subform_js) }
  script(type: "text/javascript") { raw safe(add_subform_js) }
  subforms.each do |subform|
    subform.helpers = helpers
    if subform.tags[:template]
      render_subform_template(subform)
    else
      div(id: subform.html_id, class: subform.html_class) { render_subform(subform) }
    end
  end
end