Class: MotionPrime::BaseFieldSection
Constant Summary
Constants inherited
from Section
Section::DEFAULT_CONTENT_HEIGHT, Section::KEYBOARD_HEIGHT_LANDSCAPE, Section::KEYBOARD_HEIGHT_PORTRAIT
Instance Attribute Summary collapse
#collection_section, #pending_display
Attributes inherited from Section
#elements, #model, #name, #options, #screen, #section_styles
#cached_draw_image, #container_element, #container_gesture_recognizers
Instance Method Summary
collapse
#cell, #cell_section_name, #cell_type, #container_bounds, #display, #init_container_element, #pending_display!, #render_container, #section_styles, #table
Methods inherited from Section
#add_element, after_element_render, #after_element_render, after_initialize, after_render, before_initialize, before_render, bind_keyboard_close, #bind_keyboard_events, #bring_to_front, container, #container_bounds, #container_options, #create_elements, #current_input_view_height, #default_name, element, #element, #elements_options, #elements_to_draw, #elements_to_render, #hard_reload_section, #has_container_bounds?, #hide, #hide_keyboard, inherited, #initialize, #keyboard_will_hide, #keyboard_will_show, #on_keyboard_hide, #on_keyboard_show, #reload, #render, #render!, #render_container, #screen?, #show, #strong_references, #view
#clear_delegated, #delegated_by
#after_element_render, #before_element_render, #bind_gesture_on_container_for, #clear_gesture_for_receiver, #draw_in, #prerender_elements_for_state, #prerender_enabled?
#container_view, #init_container_element, #load_container_with_elements
#calculate_frame_for
Methods included from HasStyles
#prepare_gradient
#camelize_factory, #class_factory, #low_camelize_factory, #underscore_factory
#debug_info, #element?, #normalize_object, #normalize_options, #normalize_value
#api_client, #current_user, #reset_current_user, #user_signed_in?
Instance Attribute Details
Returns the value of attribute form.
6
7
8
|
# File 'motion-prime/sections/form/base_field_section.rb', line 6
def form
@form
end
|
Instance Method Details
#all_errors ⇒ Object
153
154
155
156
157
|
# File 'motion-prime/sections/form/base_field_section.rb', line 153
def all_errors
return [] unless observing_errors?
observing_errors_for.errors.info.slice(*errors_observer_fields).values.flatten
end
|
#bind_text_input ⇒ Object
117
118
119
120
121
122
|
# File 'motion-prime/sections/form/base_field_section.rb', line 117
def bind_text_input
view(:input).on :change do |view|
focus if options[:auto_focus]
form.on_input_change(view(:input))
end
end
|
#blur ⇒ Object
97
98
99
100
101
102
103
104
105
106
|
# File 'motion-prime/sections/form/base_field_section.rb', line 97
def blur
elements.values.each do |element|
if element.view.is_a?(UITextField)
element.view.resignFirstResponder && return
end
end
self
rescue
NSLog("can't blur on element #{self.class_name_without_kvo}")
end
|
#clear_observers ⇒ Object
172
173
174
175
176
|
# File 'motion-prime/sections/form/base_field_section.rb', line 172
def clear_observers
return unless observing_errors?
unobserve observing_errors_for.errors, :info
end
|
#container_height ⇒ Object
178
179
180
181
182
183
|
# File 'motion-prime/sections/form/base_field_section.rb', line 178
def container_height
return 0 if container_options[:hidden]
element = element(:error_message)
error_height = element ? element.cached_content_height + 5 : 0
super + error_height
end
|
#dealloc ⇒ Object
57
58
59
60
|
# File 'motion-prime/sections/form/base_field_section.rb', line 57
def dealloc
clear_observers
super
end
|
#default_label_options ⇒ Object
108
109
110
111
112
113
114
115
|
# File 'motion-prime/sections/form/base_field_section.rb', line 108
def default_label_options
label_options = options[:label] || {}
if label_options.has_key?(:text)
label_options
else
{text: options[:name].to_s.titleize}.merge(label_options)
end
end
|
#errors_observer_fields ⇒ Object
141
142
143
144
145
146
147
|
# File 'motion-prime/sections/form/base_field_section.rb', line 141
def errors_observer_fields
@errors_observer_fields ||= begin
fields = Array.wrap(@errors_observer_options[:fields])
fields << name if fields.empty?
fields.uniq
end
end
|
#focus(begin_editing = false) ⇒ Object
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
|
# File 'motion-prime/sections/form/base_field_section.rb', line 66
def focus(begin_editing = false)
elements.values.detect do |element|
if element.view.is_a?(UITextField) || element.view.is_a?(UITextView)
element.view.becomeFirstResponder
end
end if begin_editing
return self unless input_view = element(:input).try(:view)
origin = input_view.frame.origin
point = container_view.convertPoint(origin, toView: form.collection_view)
nav_bar_height = screen.navigationController ? screen.navigationController.navigationBar.frame.size.height : 0
nav_bar_height += 20
offset = form.collection_view.contentOffset
new_top_offset = point.y - nav_bar_height
unless new_top_offset == offset.y
offset.y = new_top_offset
form.collection_view.setContentOffset(offset, animated: true)
end
self
rescue
NSLog("can't focus on element #{self.class_name_without_kvo}")
end
|
62
63
64
|
# File 'motion-prime/sections/form/base_field_section.rb', line 62
def form_name
form.name
end
|
#has_errors? ⇒ Boolean
136
137
138
139
|
# File 'motion-prime/sections/form/base_field_section.rb', line 136
def has_errors?
return false unless observing_errors?
observing_errors_for.errors.info.slice(*errors_observer_fields).values.any?(&:present?)
end
|
128
129
130
|
# File 'motion-prime/sections/form/base_field_section.rb', line 128
def input?
false
end
|
#observe_model_errors ⇒ Object
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# File 'motion-prime/sections/form/base_field_section.rb', line 38
def observe_model_errors
prepare_table_data
return unless observing_errors?
on_error_change = proc { |old_value, new_value|
changes = observing_errors_for.errors.changes
errors_observer_fields.each do |field|
next unless changes.has_key?(field)
if @status_for_updated == :rendered
reload_section
else
create_elements!
form.reload_collection_data
end
end
}.weak!
observe observing_errors_for.errors, :info, &on_error_change
end
|
#observing_errors? ⇒ Boolean
132
133
134
|
# File 'motion-prime/sections/form/base_field_section.rb', line 132
def observing_errors?
@errors_observer_options.present?
end
|
#observing_errors_for ⇒ Object
149
150
151
|
# File 'motion-prime/sections/form/base_field_section.rb', line 149
def observing_errors_for
@errors_observer_options[:resource]
end
|
#on_section_render ⇒ Object
33
34
35
36
|
# File 'motion-prime/sections/form/base_field_section.rb', line 33
def on_section_render
@status_for_updated = :rendered
form.register_elements_from_section(self)
end
|
#prepare_table_data ⇒ Object
11
12
13
14
15
16
17
|
# File 'motion-prime/sections/form/base_field_section.rb', line 11
def prepare_table_data
@form = @options[:collection_section]
if options[:observe_errors]
@errors_observer_options = normalize_options(options.delete(:observe_errors).clone, elements_eval_object)
end
end
|
#reload_section ⇒ Object
167
168
169
170
|
# File 'motion-prime/sections/form/base_field_section.rb', line 167
def reload_section
clear_observers
form.hard_reload_cell_section(self)
end
|
#render_element?(element_name) ⇒ Boolean
Returns true if we should render element in current state
23
24
25
26
27
28
29
30
31
|
# File 'motion-prime/sections/form/base_field_section.rb', line 23
def render_element?(element_name)
case element_name.to_sym
when :error_message
has_errors?
when :label
not @options[:label] === false
else true
end
end
|
#style_suffixes ⇒ Object
159
160
161
162
163
164
165
|
# File 'motion-prime/sections/form/base_field_section.rb', line 159
def style_suffixes
suffixes = @options[:style_suffixes]
suffixes = normalize_value(suffixes, collection_section) if suffixes.is_a?(Proc)
suffixes = Array.wrap(suffixes).clone
suffixes << 'with_errors' if has_errors?
suffixes
end
|
#value ⇒ Object
124
125
126
|
# File 'motion-prime/sections/form/base_field_section.rb', line 124
def value
raise "should be defined"
end
|