ProMotion-XLForm 0.0.11 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4953d1198db5beb180fb0a772c4ed0f4974ffff
4
- data.tar.gz: 15c71318fed226e75954bf103ab07671142fbc17
3
+ metadata.gz: 6ccbbd4523b880c96a97d116954a4a2f489d25ee
4
+ data.tar.gz: a3205db9af2f36746e5b8fc9c586f78c9448abcf
5
5
  SHA512:
6
- metadata.gz: b19ad4e1ba5c0017ac3955ebae76adf3f733c87289b2a1b59a4aaf948886e95635cb6e0092510d1962f6cd71811f1e27cc61e54b5a2460ad61a5c7287a158486
7
- data.tar.gz: 8fe4483864350bf7a1866bb099710475d763e6ee10e41de5e82d72e75555fbc132a220a1feaabd67e3e4fafe48ec5293855c009b8202e804399783b9412a8537
6
+ metadata.gz: 92da0d7781a60fa052347d026a3b1e0fc885a0f391d7264131543b62d1f75f5c9049a1c78f2202b060bbaab0a7f8683de7a17cc575f2971da6144b3ed11ddaf2
7
+ data.tar.gz: 28b2e846427d54be79d82e209121a00c5190996cb38daf589431241217c3a56991ba7729dddb7117256c9d5ced9e0736697f2889e7eb9e2f3d14390e6f725234
data/README.md CHANGED
@@ -113,7 +113,8 @@ class TestFormScreen < PM::XLFormScreen
113
113
 
114
114
  form_options required: :asterisks, # add an asterisk to required fields
115
115
  on_save: :'save_form:', # will be called when you touch save
116
- on_cancel: :cancel_form # will be called when you touch cancel
116
+ on_cancel: :cancel_form, # will be called when you touch cancel
117
+ auto_focus: true # the form will focus on the first focusable field
117
118
 
118
119
  def save_form(values)
119
120
  dismiss_keyboard
@@ -170,10 +171,17 @@ You can also get a specific value with `value_for_cell(:my_cell)`.
170
171
  female: 'Female',
171
172
  other: 'Other'
172
173
  },
174
+ # An optional row paramater may be passed |old_value, new_value|
173
175
  on_change: lambda do |old_value, new_value|
174
176
  puts "Changed from #{old_value} to #{new_value}"
175
177
  end
176
178
  }
179
+ # An optional row paramater may be passed to on_change:
180
+ # on_change: lambda do |old_value, new_value, row|
181
+ # puts "Changed from #{old_value} to #{new_value}"
182
+ # row.setTitle(new_value)
183
+ # self.reloadFormRow(row) if old_value != new_value
184
+ # end
177
185
  ```
178
186
 
179
187
  ### Multivalued Sections (Insert, Delete, Reorder rows)
@@ -384,6 +392,14 @@ You can change the appearance of the cell using the `appearance` hash
384
392
  "value_3" => "Value 3",
385
393
  "value_4" => "Value 4",
386
394
  }
395
+ },
396
+ {
397
+ title: 'Alignment',
398
+ name: :align,
399
+ type: :text,
400
+ appearance: {
401
+ alignment: :right # or NSTextAlignmentRight
402
+ }
387
403
  }
388
404
  ```
389
405
 
@@ -397,6 +413,21 @@ You can also pass any key-value to configure your cell. Take a look at [this](ht
397
413
  }
398
414
  ```
399
415
 
416
+ ### Keyboard
417
+ For the text based cells (like `:text`, `:password`, `:number`, `:integer`, `:decimal`), you can specify a `keyboard_type`. The following keyboard types are available :
418
+ - :default
419
+ - :ascii
420
+ - :numbers_punctuation
421
+ - :url
422
+ - :number_pad
423
+ - :phone_pad
424
+ - :name_phone_pad
425
+ - :email
426
+ - :decimal_pad
427
+ - :twitter
428
+ - :web_search
429
+ - :alphabet
430
+
400
431
  ## Contributing
401
432
 
402
433
  1. Fork it
@@ -18,7 +18,6 @@ Motion::Project::App.setup do |app|
18
18
  app.files << File.join(lib_dir_path, "ProMotion/XLForm/xl_form_cell_builder.rb")
19
19
  app.files << File.join(lib_dir_path, "ProMotion/XLForm/xl_form_section_builder.rb")
20
20
  app.files << File.join(lib_dir_path, "ProMotion/XLForm/cells/xl_form_cell.rb")
21
- app.files << File.join(lib_dir_path, "ProMotion/XLForm/cells/xl_form_image_selector_cell.rb")
22
21
  app.files << File.join(lib_dir_path, "ProMotion/XLForm/cells/xl_form_color_selector_cell.rb")
23
22
  app.files << File.join(lib_dir_path, "ProMotion/XLForm/value_transformer.rb")
24
23
  app.files << File.join(lib_dir_path, "ProMotion/XLForm/validators/validator.rb")
@@ -11,12 +11,19 @@ module ProMotion
11
11
  @form_data = form_data
12
12
  @title = opts[:title] || ''
13
13
  @required = opts[:required]
14
+ @auto_focus = opts[:auto_focus]
14
15
  end
15
16
 
16
17
  def build
17
18
  form = XLFormDescriptor.formDescriptorWithTitle(@title)
18
19
  form.addAsteriskToRequiredRowsTitle = (@required == :asterisks)
19
20
 
21
+
22
+ # focus on this cell
23
+ if @auto_focus
24
+ form.assignFirstResponderOnShow = true
25
+ end
26
+
20
27
  form_data.each do |section_data|
21
28
  section = create_section(section_data)
22
29
  form.addFormSection(section)
@@ -79,9 +86,9 @@ module ProMotion
79
86
  button: XLFormRowDescriptorTypeButton,
80
87
  info: XLFormRowDescriptorTypeInfo,
81
88
  step_counter: XLFormRowDescriptorTypeStepCounter,
82
- image: 'XLFormRowDescriptorTypeImage',
89
+ image: XLFormRowDescriptorTypeImage,
83
90
  color: 'XLFormRowDescriptorTypeColor',
84
- }[symbol] || symbol
91
+ }[symbol]
85
92
  end
86
93
 
87
94
  end
@@ -13,6 +13,8 @@ module ProMotion
13
13
  type = :selector_push
14
14
  end
15
15
 
16
+ mp("Can't find the type #{type}, maybe a typo ?", force_color: :red) if row_type(type).nil? && !cell_data[:cell_class]
17
+
16
18
  cell = XLFormRowDescriptor.formRowDescriptorWithTag(tag, rowType: row_type(type), title: title)
17
19
 
18
20
  cell.required = cell_data[:required]
@@ -60,11 +62,7 @@ module ProMotion
60
62
 
61
63
  cell_class = cell_data[:cell_class]
62
64
 
63
- # image
64
- if cell_data[:type] == :image
65
- cell_class = XLFormImageSelectorCell if cell_class.nil?
66
- cell_data[:height] ||= 100
67
- elsif cell_data[:type] == :color
65
+ if cell_data[:type] == :color
68
66
  cell_class = XLFormColorSelectorCell if cell_class.nil?
69
67
  end
70
68
 
@@ -159,6 +157,7 @@ module ProMotion
159
157
  cell.cellConfig["detailTextLabel.font"] = appearance[:detail_font] if appearance[:detail_font]
160
158
  cell.cellConfig["detailTextLabel.textColor"] = appearance[:detail_color] if appearance[:detail_color]
161
159
  cell.cellConfig["backgroundColor"] = appearance[:background_color] if appearance[:background_color]
160
+ cell.cellConfig["textField.textAlignment"] = text_alignment(appearance[:alignment]) if appearance[:alignment]
162
161
 
163
162
  appearance.delete_if { |k, v| k.is_a?(Symbol) }.each do |k, v|
164
163
  cell.cellConfig[k] = v
@@ -187,5 +186,16 @@ module ProMotion
187
186
  cell
188
187
  end
189
188
 
189
+ def text_alignment(symbol)
190
+ {
191
+ left: NSTextAlignmentLeft,
192
+ center: NSTextAlignmentCenter,
193
+ centered: NSTextAlignmentCenter,
194
+ right: NSTextAlignmentRight,
195
+ justified: NSTextAlignmentJustified,
196
+ natural: NSTextAlignmentNatural
197
+ }[symbol] || symbol || NSTextAlignmentLeft
198
+ end
199
+
190
200
  end
191
201
  end
@@ -62,11 +62,35 @@ class XLFormRowDescriptor
62
62
  if self.cell && self.cell.respond_to?(:setup)
63
63
  self.cell.setup(cell_data, form_controller)
64
64
  end
65
+ if self.cell.respond_to?(:accessibilityLabel) && cell_data && cell_data[:title]
66
+ self.cell.accessibilityLabel = cell_data[:title]
67
+ end
68
+ if self.cell.respond_to?(:keyboard_type) && cell_data[:keyboard_type]
69
+ self.cell.keyboard_type = keyboard_type(cell_data[:keyboard_type])
70
+ end
71
+
65
72
  self.configureCellAtCreationTime
66
73
  end
67
74
 
68
75
  self.cell
69
76
  end
77
+
78
+ def keyboard_type(symbol)
79
+ {
80
+ default: UIKeyboardTypeDefault,
81
+ ascii: UIKeyboardTypeASCIICapable,
82
+ numbers_punctuation: UIKeyboardTypeNumbersAndPunctuation,
83
+ url: UIKeyboardTypeURL,
84
+ number_pad: UIKeyboardTypeNumberPad,
85
+ phone_pad: UIKeyboardTypePhonePad,
86
+ name_phone_pad: UIKeyboardTypeNamePhonePad,
87
+ email: UIKeyboardTypeEmailAddress,
88
+ decimal_pad: UIKeyboardTypeDecimalPad,
89
+ twitter: UIKeyboardTypeTwitter,
90
+ web_search: UIKeyboardTypeWebSearch,
91
+ alphabet: UIKeyboardTypeASCIICapable
92
+ }[symbol] || symbol || UIKeyboardTypeDefault
93
+ end
70
94
  end
71
95
 
72
96
  class XLFormSectionDescriptor
@@ -100,6 +124,7 @@ class XLFormSectionDescriptor
100
124
  def sectionOptions
101
125
  @section_options || originalSectionOptions
102
126
  end
127
+
103
128
  alias_method :options, :sectionOptions
104
129
 
105
130
  def self.parse_section_options(options)
@@ -132,3 +157,16 @@ class XLFormSectionDescriptor
132
157
  }[symbol] || symbol || XLFormSectionOptionNone
133
158
  end
134
159
  end
160
+
161
+ class XLFormTextFieldCell
162
+
163
+ attr_accessor :keyboard_type
164
+
165
+ alias :old_update :update
166
+
167
+ def update
168
+ old_update
169
+
170
+ self.textField.keyboardType = self.keyboard_type if self.keyboard_type
171
+ end
172
+ end
@@ -21,10 +21,10 @@ module ProMotion
21
21
  end
22
22
 
23
23
  set_nav_bar_button :left, {
24
- system_item: item,
25
- title: title,
26
- action: 'on_cancel:'
27
- }
24
+ system_item: item,
25
+ title: title,
26
+ action: 'on_cancel:'
27
+ }
28
28
  end
29
29
 
30
30
  if form_options[:on_save]
@@ -37,10 +37,10 @@ module ProMotion
37
37
  end
38
38
 
39
39
  set_nav_bar_button :right, {
40
- system_item: item,
41
- title: title,
42
- action: 'on_save:'
43
- }
40
+ system_item: item,
41
+ title: title,
42
+ action: 'on_save:'
43
+ }
44
44
  end
45
45
 
46
46
  self.form_added if self.respond_to?(:form_added)
@@ -55,12 +55,13 @@ module ProMotion
55
55
  form_options = self.class.get_form_options
56
56
  title = self.class.title
57
57
  required = form_options[:required]
58
+ auto_focus = form_options[:auto_focus]
58
59
 
59
60
  @form_builder = PM::XLForm.new(self.form_data,
60
- {
61
- title: title,
62
- required: required
63
- })
61
+ title: title,
62
+ required: required,
63
+ auto_focus: auto_focus
64
+ )
64
65
  @form_object = @form_builder.build
65
66
  self.form = @form_object
66
67
  end
@@ -262,7 +263,17 @@ module ProMotion
262
263
  if new_value.is_a? XLFormOptionsObject
263
264
  new_value = new_value.formValue
264
265
  end
265
- callback.call(old_value, new_value)
266
+
267
+ case arity = callback.arity
268
+ when 0 then
269
+ callback.call
270
+ when 2 then
271
+ callback.call(old_value, new_value)
272
+ when 3 then
273
+ callback.call(old_value, new_value, row)
274
+ else
275
+ mp("Callback requires 0, 2, or 3 paramters", force_color: :red)
276
+ end
266
277
  end
267
278
  end
268
279
 
@@ -1,5 +1,10 @@
1
1
  module ProMotion
2
2
  class XlFormViewController < XLFormViewController
3
+
4
+ def class_handles_delegates?
5
+ true
6
+ end
7
+
3
8
  def self.new(args = {})
4
9
  s = self.alloc.init
5
10
  s.screen_init(args) if s.respond_to?(:screen_init)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ProMotion-XLForm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Michotte
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-20 00:00:00.000000000 Z
11
+ date: 2016-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ProMotion
@@ -91,7 +91,6 @@ files:
91
91
  - lib/ProMotion-XLForm.rb
92
92
  - lib/ProMotion/XLForm/cells/xl_form_cell.rb
93
93
  - lib/ProMotion/XLForm/cells/xl_form_color_selector_cell.rb
94
- - lib/ProMotion/XLForm/cells/xl_form_image_selector_cell.rb
95
94
  - lib/ProMotion/XLForm/ui_alert_controller.rb
96
95
  - lib/ProMotion/XLForm/validators/regex_validator.rb
97
96
  - lib/ProMotion/XLForm/validators/url_validator.rb
@@ -127,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
126
  version: '0'
128
127
  requirements: []
129
128
  rubyforge_project:
130
- rubygems_version: 2.2.3
129
+ rubygems_version: 2.4.5.1
131
130
  signing_key:
132
131
  specification_version: 4
133
132
  summary: Adds PM::XLFormScreen support to ProMotion, similar to ProMotion-form.
@@ -1,162 +0,0 @@
1
- module ProMotion
2
- class XLFormImageSelectorCell < XLFormCell
3
-
4
- def self.formDescriptorCellHeightForRowDescriptor(_)
5
- 100
6
- end
7
-
8
- def setup(data_cell, screen)
9
- super
10
-
11
- size = (data_cell[:height] || 100) - 20
12
-
13
- @imageview = UIImageView.alloc.initWithFrame([[0, 0], [size, size]])
14
- self.accessoryView = @imageview
15
-
16
- self.selectionStyle = UITableViewCellSelectionStyleNone
17
- self.backgroundColor = UIColor.whiteColor
18
- self.separatorInset = UIEdgeInsetsZero
19
- self.editingAccessoryView = self.accessoryView
20
- end
21
-
22
- def update
23
- @imageview.image = value
24
- end
25
-
26
- def formDescriptorCellDidSelectedWithFormController(controller)
27
- if Kernel.const_defined?("UIAlertController") && UIAlertController.respond_to?(:'alertControllerWithTitle:message:preferredStyle:')
28
- alert = UIAlertController.alertControllerWithTitle(self.rowDescriptor.selectorTitle,
29
- message: nil,
30
- preferredStyle: UIAlertControllerStyleActionSheet)
31
-
32
- alert.addAction(UIAlertAction.actionWithTitle(NSLocalizedString("Choose From Library", nil),
33
- style: UIAlertActionStyleDefault,
34
- handler: lambda { |_|
35
- open_from_alert(UIImagePickerControllerSourceTypePhotoLibrary)
36
- }))
37
-
38
- if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceTypeCamera)
39
- alert.addAction(UIAlertAction.actionWithTitle(NSLocalizedString("Take Photo", nil),
40
- style: UIAlertActionStyleDefault,
41
- handler: lambda { |_|
42
- open_from_alert(UIImagePickerControllerSourceTypeCamera)
43
- }))
44
- end
45
-
46
- if UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad
47
- alert.modalPresentationStyle = UIModalPresentationPopover
48
- alert.popoverPresentationController.sourceView = self.contentView
49
- alert.popoverPresentationController.sourceRect = self.contentView.bounds
50
- end
51
-
52
- present = -> {
53
- Dispatch::Queue.main.async do
54
- self.formViewController.presentViewController(alert, animated: true, completion: nil)
55
- end
56
- }
57
- if self.formViewController.presentedViewController
58
- self.formViewController.dismissViewControllerAnimated(true, completion: present)
59
- else
60
- present.call
61
- end
62
-
63
- else
64
- if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceTypeCamera)
65
- action_sheet = UIActionSheet.alloc.initWithTitle(self.rowDescriptor.selectorTitle,
66
- delegate: self,
67
- cancelButtonTitle: NSLocalizedString("Cancel", nil),
68
- destructiveButtonTitle: nil,
69
- otherButtonTitles: NSLocalizedString("Choose From Library", nil), NSLocalizedString("Take Photo", nil), nil)
70
- else
71
- action_sheet = UIActionSheet.alloc.initWithTitle(self.rowDescriptor.selectorTitle,
72
- delegate: self,
73
- cancelButtonTitle: NSLocalizedString("Cancel", nil),
74
- destructiveButtonTitle: nil,
75
- otherButtonTitles: NSLocalizedString("Choose From Library", nil), nil)
76
- end
77
- action_sheet.tag = self.tag
78
- action_sheet.showInView(self.formViewController.view)
79
- end
80
- end
81
-
82
- # trick to force the status bar to be hidden when presenting the UIImagePickerViewController
83
- def navigationController(_, willShowViewController: _, animated: _)
84
- UIApplication.sharedApplication.setStatusBarHidden true
85
- end
86
-
87
- # UIActionSheetDelegate
88
- def actionSheet(action_sheet, clickedButtonAtIndex: button_index)
89
- return if button_index == action_sheet.cancelButtonIndex
90
-
91
- title = action_sheet.buttonTitleAtIndex(button_index)
92
-
93
- case title
94
- when NSLocalizedString("Choose From Library", nil)
95
- open_from_alert(UIImagePickerControllerSourceTypePhotoLibrary)
96
- when NSLocalizedString("Take Photo", nil)
97
- open_from_alert(UIImagePickerControllerSourceTypeCamera)
98
- else
99
- return
100
- end
101
- end
102
-
103
- def open_from_alert(source)
104
- open = -> {
105
- open_picker(source)
106
- }
107
-
108
- if @popover_controller && @popover_controller.isPopoverVisible
109
- @popover_controller.dismissPopoverAnimated(true)
110
- open.call
111
- elsif self.formViewController.presentedViewController
112
- self.formViewController.dismissViewControllerAnimated(true, completion: open)
113
- else
114
- open.call
115
- end
116
- end
117
-
118
- def open_picker(source)
119
- @image_picker = UIImagePickerController.alloc.init
120
- @image_picker.delegate = self
121
- @image_picker.allowsEditing = true
122
- @image_picker.sourceType = source
123
-
124
- if UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad
125
- @popover_controller = UIPopoverController.alloc.initWithContentViewController(@image_picker)
126
- Dispatch::Queue.main.async do
127
- @popover_controller.presentPopoverFromRect(self.contentView.frame,
128
- inView: self.formViewController.view,
129
- permittedArrowDirections: UIPopoverArrowDirectionAny,
130
- animated: true)
131
- end
132
- else
133
- self.formViewController.presentViewController(@image_picker,
134
- animated: true,
135
- completion: nil)
136
- end
137
- end
138
-
139
- # UIImagePickerControllerDelegate
140
- def imagePickerController(_, didFinishPickingMediaWithInfo: info)
141
- editedImage = info[UIImagePickerControllerEditedImage]
142
- originalImage = info[UIImagePickerControllerOriginalImage]
143
- if editedImage
144
- imageToUse = editedImage
145
- else
146
- imageToUse = originalImage
147
- end
148
-
149
- self.value = imageToUse
150
- @imageview.image = imageToUse
151
-
152
- if UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad
153
- if @popover_controller && @popover_controller.isPopoverVisible
154
- @popover_controller.dismissPopoverAnimated(true)
155
- end
156
- else
157
- self.formViewController.dismissViewControllerAnimated(true, completion: nil)
158
- end
159
- end
160
-
161
- end
162
- end