Module: Pakyow::Presenter::Renderer::Behavior::SetupForms Private

Extended by:
Support::Extension
Defined in:
lib/pakyow/presenter/renderer/behavior/setup_forms.rb

This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.

Class Method Summary collapse

Class Method Details

.attach(presenter, app) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/pakyow/presenter/renderer/behavior/setup_forms.rb', line 108

def self.attach(presenter, app)
  presenter.render node: -> {
    forms = self.forms
    if !object.is_a?(StringDoc) && object.significant?(:form)
      forms << self
    end

    forms
  } do
    unless setup?
      if object = object_for_form
        if app.class.includes_framework?(:data) && object.is_a?(Data::Proxy)
          object = object.one
        end
      end

      if !object.nil?
        if labeled?(:endpoint)
          setup(object)
        else
          if object.key?(:id)
            update(object)
          else
            create(object)
          end
        end
      elsif labeled?(:binding)
        case presentables[:__endpoint_name]
        when :edit
          update(
            __endpoint.params.each_with_object({}) { |(key, _), passed_params|
              key = key.to_sym
              passed_params[key] = __params[key]
            }
          )
        else
          create
        end
      else
        # setup
      end
    end

    view.object.label(:form)[:origin] = presentables[:__origin]

    node = view.object.each_significant_node(:field).find { |field_node|
      field_node.attributes[:name] == "pw-form"
    }

    unless node.nil?
      node.attributes[:value] = presentables[:__verifier].sign(
        label(:form).to_json
      )
    end
  end

  presenter.render node: -> {
    stringified_param = app.config.security.csrf.param.to_s
    node = object.each_significant_node(:field, descend: true).find { |field_node|
      field_node.attributes[:name] == stringified_param
    }

    unless node.nil?
      View.from_object(node)
    end
  } do
    attributes[:value] = presentables[:__verifier].sign(Support::MessageVerifier.key)
  end

  presenter.render node: -> {
    object.each_significant_node(:method_override, descend: true).map { |node|
      View.from_object(node)
    }
  } do
    remove if attributes[:value].empty?
  end
end

.build(view, app) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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
104
105
# File 'lib/pakyow/presenter/renderer/behavior/setup_forms.rb', line 42

def self.build(view, app)
  forms = view.forms
  if !view.object.is_a?(StringDoc) && view.object.significant?(:form)
    forms << view
  end

  forms.each do |form|
    # Allows app renders to set metadata values on forms.
    #
    form.object.set_label(:form, {})

    # Set the form id.
    #
    form_id = SecureRandom.hex(24)
    form.object.label(:form)[:id] = form_id
    form.object.set_label(Presenters::Form::ID_LABEL, form_id)

    # Set the form binding.
    #
    form.object.label(:form)[:binding] = form.object.label(:channeled_binding)

    # Setup field names.
    #
    form.object.children.each_significant_node(:binding) do |binding_node|
      if Pakyow::Presenter::Views::Form::FIELD_TAGS.include?(binding_node.tagname)
        if binding_node.attributes[:name].to_s.empty?
          binding_node.attributes[:name] = "#{form.object.label(:binding)}[#{binding_node.label(:binding)}]"
        end

        if binding_node.tagname == "select" && binding_node.attributes[:multiple]
          Presenters::Form.pluralize_field_name(binding_node)
        end
      end
    end

    # Connect labels.
    #
    form.object.children.each_significant_node(:label) do |label_node|
      if label_node.attributes[:for] && input = form.find(*label_node.attributes[:for].to_s.split("."))
        Presenters::Form.connect_input_to_label(input, label_node)
      end
    end

    form.prepend(
      Support::SafeStringHelpers.html_safe(
        "<input type=\"hidden\" name=\"pw-http-method\">"
      )
    )

    form.prepend(
      Support::SafeStringHelpers.html_safe(
        "<input type=\"hidden\" name=\"pw-form\">"
      )
    )

    if app.config.presenter.embed_authenticity_token
      form.prepend(
        Support::SafeStringHelpers.html_safe(
          "<input type=\"hidden\" name=\"#{app.config.security.csrf.param}\">"
        )
      )
    end
  end
end