Class: Glib::JsonUi::ViewBuilder::Panels::Form
- Inherits:
-
View
show all
- Defined in:
- app/helpers/glib/json_ui/view_builder/panels.rb
Instance Attribute Summary collapse
#json, #page
Class Method Summary
collapse
-
.field_assert_respond_to(model, prop) ⇒ Object
-
.field_label(model, model_name, prop, args) ⇒ Object
-
.field_name(model, prop, multiple, page) ⇒ Object
-
.field_validation(model, prop) ⇒ Object
-
.field_value(model, prop, collect_ids:) ⇒ Object
-
.hint_label(model_name, prop, args) ⇒ Object
-
.is_array_association?(model, prop) ⇒ Boolean
TODO: Enable this when we know it won’t break existing apps.
-
.is_single_association?(model, prop) ⇒ Boolean
-
.placeholder_label(model_name, prop, args) ⇒ Object
Instance Method Summary
collapse
Methods inherited from View
component_name
#initialize, #props
Instance Attribute Details
#current_dynamic_group ⇒ Object
Returns the value of attribute current_dynamic_group.
5
6
7
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 5
def current_dynamic_group
@current_dynamic_group
end
|
#model_name ⇒ Object
See Panels::Form.field_name
4
5
6
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 4
def model_name
@model_name
end
|
Class Method Details
.field_assert_respond_to(model, prop) ⇒ Object
41
42
43
44
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 41
def self.field_assert_respond_to(model, prop)
raise "Invalid property `#{prop}` on '#{model.class}'" unless model.respond_to?(prop)
end
|
.field_label(model, model_name, prop, args) ⇒ Object
93
94
95
96
97
98
99
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 93
def self.field_label(model, model_name, prop, args)
name = prop.to_s
if name.ends_with?('_id') && is_single_association?(model, name.chomp('_id'))
name = name.chomp('_id')
end
I18n.t("dt_models.#{model_name}.#{name}.label", **args.merge(default: nil)) || I18n.t("activerecord.attributes.#{model_name}.#{name}", **args)
end
|
.field_name(model, prop, multiple, page) ⇒ Object
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
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 50
def self.field_name(model, prop, multiple, page)
form = page.current_form
include_form_model = true
reversed_model_panels = []
form.nested_associations.reverse.each do |panel|
if panel.is_a?(Fields::DynamicGroup)
include_form_model = false
break
end
reversed_model_panels << panel
end
name = include_form_model ? form.model_name : ''
reversed_model_panels.reverse.each do |panel|
index_exists = !panel.assoc_order_index.nil?
field_name = index_exists ? panel.model_name.pluralize : panel.model_name
name += "[#{field_name}_attributes]"
if index_exists
index = panel.assoc_order_index == :auto ? '' : panel.assoc_order_index
name += "[#{index}]"
end
end
suffix = is_array_association?(model, prop) || multiple ? '[]' : ''
"#{name}[#{prop}]#{suffix}"
end
|
.field_validation(model, prop) ⇒ Object
121
122
123
124
125
126
127
128
129
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 121
def self.field_validation(model, prop)
validations = {}
model.class.validators_on(prop).each do |validator|
if validator.kind == :presence
validations[:required] = { message: 'Required' }
end
end
validations
end
|
.field_value(model, prop, collect_ids:) ⇒ Object
81
82
83
84
85
86
87
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 81
def self.field_value(model, prop, collect_ids:)
if is_array_association?(model, prop) && collect_ids
model.send(prop)&.map { |record| record.id }
else
model.send(prop)
end
end
|
.hint_label(model_name, prop, args) ⇒ Object
105
106
107
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 105
def self.hint_label(model_name, prop, args)
I18n.t("dt_models.#{model_name}.#{prop}.hint", **args.merge(default: nil))
end
|
.is_array_association?(model, prop) ⇒ Boolean
TODO: Enable this when we know it won’t break existing apps. Even for pure client-side apps, this is required because form.validate() requires a URL to construct form data. required :url
21
22
23
24
25
26
27
28
29
30
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 21
def self.is_array_association?(model, prop)
model.class.try(:reflect_on_association, prop)&.macro == :has_many || model.class.try(:reflect_on_attachment, prop)&.macro == :has_many_attached
end
|
.is_single_association?(model, prop) ⇒ Boolean
32
33
34
35
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 32
def self.is_single_association?(model, prop)
model.class.try(:reflect_on_association, prop)&.macro == :belongs_to
end
|
.placeholder_label(model_name, prop, args) ⇒ Object
113
114
115
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 113
def self.placeholder_label(model_name, prop, args)
I18n.t("dt_models.#{model_name}.#{prop}.placeholder", **args.merge(default: nil))
end
|
Instance Method Details
#as(model_name) ⇒ Object
139
140
141
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 139
def as(model_name)
@model_name = model_name
end
|
#childViews(block) ⇒ Object
185
186
187
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 185
def childViews(block)
@childViewsBlock = block
end
|
#created ⇒ Object
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
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 148
def created
if @models
@model = @models.is_a?(Array) ? @models.last : @models
@model_name ||= @model.class.model_name.singular
@url ||= page.context.polymorphic_url(@models)
@method ||= if @model.persisted?
:patch
else
:post
end
end
@method = @method&.to_sym || :get
json.url @url
json.method @method
json.childViews do
if @method != :get
json.child! do
json.view 'fields/hidden'
json.name 'authenticity_token'
json.value page.context.form_authenticity_token
end
end
if page.current_form
raise 'Nested form is not allowed'
end
page.current_form = self
@childViewsBlock.call(page.view_builder)
page.current_form = nil
end
end
|
#field_assert_respond_to(prop) ⇒ Object
37
38
39
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 37
def field_assert_respond_to(prop)
self.class.field_assert_respond_to(@model, prop)
end
|
#field_label(prop, args) ⇒ Object
89
90
91
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 89
def field_label(prop, args)
self.class.field_label(@model, @model_name, prop, args)
end
|
#field_name(prop, multiple) ⇒ Object
46
47
48
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 46
def field_name(prop, multiple)
self.class.field_name(@model, prop, multiple, page)
end
|
#field_validation(prop) ⇒ Object
117
118
119
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 117
def field_validation(prop)
self.class.field_validation(@model, prop)
end
|
#field_value(prop, collect_ids: true) ⇒ Object
77
78
79
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 77
def field_value(prop, collect_ids: true)
self.class.field_value(@model, prop, collect_ids: collect_ids)
end
|
#hint_label(prop, args) ⇒ Object
101
102
103
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 101
def hint_label(prop, args)
self.class.hint_label(@model_name, prop, args)
end
|
#method(method) ⇒ Object
135
136
137
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 135
def method(method)
@method = method
end
|
#model(models) ⇒ Object
143
144
145
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 143
def model(models)
@models = models
end
|
#nested_associations ⇒ Object
13
14
15
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 13
def nested_associations
@nested_associations ||= []
end
|
#placeholder_label(prop, args) ⇒ Object
109
110
111
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 109
def placeholder_label(prop, args)
self.class.placeholder_label(@model_name, prop, args)
end
|
#url(url) ⇒ Object
131
132
133
|
# File 'app/helpers/glib/json_ui/view_builder/panels.rb', line 131
def url(url)
@url = url
end
|