RedAlert 1.1 → 1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +23 -3
- data/lib/project/action_sheet_provider.rb +2 -2
- data/lib/project/alert_controller_provider.rb +18 -3
- data/lib/project/alert_field.rb +18 -0
- data/lib/project/alert_view_provider.rb +16 -2
- data/lib/project/field_templates.rb +48 -0
- data/lib/project/red_alert.rb +57 -5
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a17fdee3c942135d661b71f10e02a3fa7c897945
|
4
|
+
data.tar.gz: 3b1d14668db687b50e4f7f0005246f93dc08b52f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9e215e14fa0911d4c5f5e10226ddf7867457637f255635f4f767faa80604afd86964c9d1dede48e5f0a7e1ea87cac7c281f3174f3eb3ad427e5c31c6b25ad5f
|
7
|
+
data.tar.gz: 3129e78629f9b47b6ef29dba0cc6e983dfda0cd322885b9a72b96e26325bf84b6e46759c37a9cca57a95dd8723c98db72f58251f3b7a1d20bfc4fa6afa5882d5
|
data/README.md
CHANGED
@@ -50,6 +50,18 @@ Add the **RedAlert** gem to your Gemfile.
|
|
50
50
|
puts "You clicked #{action_type}"
|
51
51
|
end
|
52
52
|
|
53
|
+
# Add input fields by setting the style
|
54
|
+
rmq.app.alert(title: "Text Field", message: "My style is :login", style: :login) do |action_type, fields|
|
55
|
+
puts "you entered '#{fields[:login].text}' as the login and '#{fields[:password].text}' as the password"
|
56
|
+
end
|
57
|
+
|
58
|
+
# Add input fields with settings for placeholder text, whether the field is secure, and the keyboard type by setting the style to :custom
|
59
|
+
rmq.app.alert(title: "Text Field", message: "My style is :custom", style: :custom, fields:
|
60
|
+
{phone: {placeholder: 'Phone', keyboard_type: :phone_pad},
|
61
|
+
email: {placeholder: 'Email', secure: false, keyboard_type: :email_address}}) do |action_type, fields|
|
62
|
+
puts "you entered '#{fields[:phone].text}' and '#{fields[:email].text}'"
|
63
|
+
end
|
64
|
+
|
53
65
|
# Utilize common templates
|
54
66
|
rmq.app.alert(message: "Would you like a sandwich?", actions: :yes_no_cancel, style: :sheet) do |action_type|
|
55
67
|
case action_type
|
@@ -74,7 +86,7 @@ end
|
|
74
86
|
```
|
75
87
|
|
76
88
|
|
77
|
-
You can even use the `make_button` helper to create custom
|
89
|
+
You can even use the `make_button` helper to create custom buttons to add:
|
78
90
|
```ruby
|
79
91
|
# Use custom UIAction buttons and add them
|
80
92
|
taco = rmq.app.make_button("Taco") {
|
@@ -89,12 +101,18 @@ You can even use the `make_button` helper to create custom UIAction buttons to a
|
|
89
101
|
|
90
102
|
## Available Templates
|
91
103
|
|
92
|
-
|
104
|
+
Button templates are provided [HERE](https://github.com/GantMan/RedAlert/blob/master/lib/project/button_templates.rb)
|
93
105
|
* `:yes_no` = Simple yes and no buttons.
|
94
106
|
* `:yes_no_cancel` = Yes/no buttons with a separated cancel button.
|
95
107
|
* `:ok_cancel` = OK button with a separated cancel button.
|
96
108
|
* `:delete_cancel` = Delete button (red) with a separated cancel button.
|
97
109
|
|
110
|
+
Field templates are provided [HERE](https://github.com/GantMan/RedAlert/blob/master/lib/project/field_templates.rb)
|
111
|
+
* `:input` = One plaintext input field.
|
112
|
+
* `:secure` = One secure input field.
|
113
|
+
* `:login` = Two fields, one plaintext with placeholder text 'Login' and the other secure with placeholder text 'Password'.
|
114
|
+
* `:change_password` = Two fields, one secure with placeholder text 'Current Password' and the other secure with placeholder text 'New Password'.
|
115
|
+
|
98
116
|
:heartbeat: _More to come:_ be sure to submit a pull-request with your button template needs.
|
99
117
|
|
100
118
|
|
@@ -113,7 +131,7 @@ Because capabilities of iOS 7 & 8 alert-components are different, just a few edg
|
|
113
131
|
* `UIAlertView` cares about the order of your `:cancel` actions, so `[:ok, :cancel]` is shown different than `[:cancel, :ok]`.
|
114
132
|
* `UIActionSheet` also cares about the order. It's possible to put a `:cancel` first, which looks slightly awkward when shown. Try to put `:cancel` last.
|
115
133
|
* `UIAlertView`'s `alertViewStyles` are not available through RedAlert as they aren't compatible with iOS 8. You'll have to call that directly.
|
116
|
-
|
134
|
+
* `UIAlertView only supports up to 2 input fields.`
|
117
135
|
|
118
136
|
## Credits and Info
|
119
137
|
|
@@ -123,6 +141,8 @@ Because capabilities of iOS 7 & 8 alert-components are different, just a few edg
|
|
123
141
|
|
124
142
|
**Automatic button building by [Jamon Holmgren](https://github.com/GantMan/RedAlert/pull/7)**
|
125
143
|
|
144
|
+
**Ability to add textfields to alerts (Like Username/Password) by [Derek Greenberg](https://github.com/GantMan/RedAlert/pull/10) and notable work by [Jon Silverman](https://github.com/GantMan/RedAlert/pull/9)**
|
145
|
+
|
126
146
|
Feel free to read up on UIAlertController to see what all is wrapped up in this gem.
|
127
147
|
* [Hayageek](http://hayageek.com/uialertcontroller-example-ios/)
|
128
148
|
* [NSHipster](http://nshipster.com/uialertcontroller/)
|
@@ -5,7 +5,7 @@ module RubyMotionQuery
|
|
5
5
|
|
6
6
|
attr_reader :action_sheet
|
7
7
|
|
8
|
-
def build(actions, opts={})
|
8
|
+
def build(actions, fieldset=nil, opts={})
|
9
9
|
raise ArgumentError.new "At least 1 action is required." unless actions && actions.length > 0
|
10
10
|
@actions = actions
|
11
11
|
@opts = opts
|
@@ -53,7 +53,7 @@ module RubyMotionQuery
|
|
53
53
|
# pull from the view controller instance
|
54
54
|
@view_controller.dismissViewControllerAnimated @opts[:animated], completion: nil
|
55
55
|
action = @actions_in_display_order[buttonIndex]
|
56
|
-
action.handler.call(action.tag) if action.handler
|
56
|
+
action.handler.call(action.tag, nil) if action.handler
|
57
57
|
@view_controller = nil # forget the reference
|
58
58
|
end
|
59
59
|
|
@@ -5,7 +5,7 @@ module RubyMotionQuery
|
|
5
5
|
|
6
6
|
attr_reader :alert_controller
|
7
7
|
|
8
|
-
def build(actions, opts={})
|
8
|
+
def build(actions, fieldset = nil, opts={})
|
9
9
|
raise ArgumentError.new("At least 1 action is required.") unless actions && actions.length > 0
|
10
10
|
@actions = actions
|
11
11
|
@opts = opts
|
@@ -14,6 +14,21 @@ module RubyMotionQuery
|
|
14
14
|
style = RubyMotionQuery::AlertConstants::ALERT_TYPES[@opts[:style]]
|
15
15
|
@alert_controller = UIAlertController.alertControllerWithTitle @opts[:title], message:@opts[:message], preferredStyle: style
|
16
16
|
|
17
|
+
# add our text fields and build up the callback hash
|
18
|
+
@text_fields = {}
|
19
|
+
if fieldset
|
20
|
+
fieldset[:fields].each_with_index do |field, index|
|
21
|
+
handler = lambda do |text_field|
|
22
|
+
text_field.placeholder = field.placeholder
|
23
|
+
text_field.secureTextEntry = field.secure_text_entry
|
24
|
+
text_field.keyboardType = RubyMotionQuery::Stylers::KEYBOARD_TYPES[field.keyboard_type]
|
25
|
+
end
|
26
|
+
@alert_controller.addTextFieldWithConfigurationHandler(handler)
|
27
|
+
@text_fields[field.name] = @alert_controller.textFields[index]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
17
32
|
# load up the UIAlertController's actions
|
18
33
|
@actions.each do |alert_action|
|
19
34
|
|
@@ -22,10 +37,10 @@ module RubyMotionQuery
|
|
22
37
|
|
23
38
|
# convert the callback
|
24
39
|
handler = lambda do |action|
|
25
|
-
alert_action.handler.call(alert_action.tag) unless alert_action.handler.nil?
|
40
|
+
alert_action.handler.call(alert_action.tag, @text_fields) unless alert_action.handler.nil?
|
26
41
|
end if alert_action.handler
|
27
42
|
|
28
|
-
# create
|
43
|
+
# create the action
|
29
44
|
action = UIAlertAction.actionWithTitle alert_action.title, style: ios_style, handler: handler
|
30
45
|
|
31
46
|
# add it to the UIAlertController
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RubyMotionQuery
|
2
|
+
class AlertField
|
3
|
+
|
4
|
+
attr_accessor :keyboard_type
|
5
|
+
attr_accessor :placeholder
|
6
|
+
attr_accessor :secure_text_entry
|
7
|
+
attr_accessor :name
|
8
|
+
|
9
|
+
def initialize(name, opts = {})
|
10
|
+
raise ArgumentError.new "A name parameter must be provided" unless name && name.length > 0
|
11
|
+
opts = {placeholder: opts, keyboard_type: :default} if opts.is_a? String
|
12
|
+
@name = name.is_a?(Symbol) ? name : name.strip.gsub(/\s+/,'_').to_sym
|
13
|
+
@keyboard_type = RubyMotionQuery::Stylers::KEYBOARD_TYPES.has_key?(opts[:keyboard_type]) ? opts[:keyboard_type] : :default
|
14
|
+
@placeholder = opts[:placeholder] || ''
|
15
|
+
@secure_text_entry = opts[:secure_text_entry] || false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -5,7 +5,7 @@ module RubyMotionQuery
|
|
5
5
|
|
6
6
|
attr_accessor :alert_view
|
7
7
|
|
8
|
-
def build(actions, opts={})
|
8
|
+
def build(actions, fieldset=nil, opts={})
|
9
9
|
raise ArgumentError.new("At least 1 action is required.") unless actions && actions.length > 0
|
10
10
|
@actions = actions
|
11
11
|
@opts = opts
|
@@ -26,6 +26,20 @@ module RubyMotionQuery
|
|
26
26
|
# mark where our special buttons are
|
27
27
|
@alert_view.cancelButtonIndex = @actions_in_display_order.length-1 if cancel_action
|
28
28
|
|
29
|
+
# add our text fields and build up the callback hash
|
30
|
+
@text_fields = {}
|
31
|
+
|
32
|
+
if fieldset
|
33
|
+
@alert_view.alertViewStyle = fieldset[:alert_view_style]
|
34
|
+
fieldset[:fields].each_with_index do |field, index|
|
35
|
+
text_field = @alert_view.textFieldAtIndex index
|
36
|
+
text_field.placeholder = field.placeholder
|
37
|
+
text_field.secureTextEntry = field.secure_text_entry
|
38
|
+
text_field.keyboardType = RubyMotionQuery::Stylers::KEYBOARD_TYPES[field.keyboard_type]
|
39
|
+
@text_fields[field.name] = text_field
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
29
43
|
self
|
30
44
|
end
|
31
45
|
|
@@ -41,7 +55,7 @@ module RubyMotionQuery
|
|
41
55
|
def alertView(alertView, didDismissWithButtonIndex:buttonIndex)
|
42
56
|
@view_controller.dismissViewControllerAnimated @opts[:animated], completion: nil
|
43
57
|
action = @actions_in_display_order[buttonIndex]
|
44
|
-
action.handler.call(action.tag) if action.handler
|
58
|
+
action.handler.call(action.tag, @text_fields) if action.handler
|
45
59
|
@view_controller = nil # forget the reference
|
46
60
|
end
|
47
61
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module RubyMotionQuery
|
2
|
+
class App
|
3
|
+
|
4
|
+
# When adding a new template do the following:
|
5
|
+
# 1 - Add it here
|
6
|
+
# 2 - Add the test
|
7
|
+
# 3 - Add symbol to the README.md list
|
8
|
+
|
9
|
+
def self.add_template_fieldset(template)
|
10
|
+
|
11
|
+
login = NSLocalizedString("Login", nil)
|
12
|
+
password = NSLocalizedString("Password", nil)
|
13
|
+
current_password = NSLocalizedString("Current Password", nil)
|
14
|
+
new_password = NSLocalizedString("New Password", nil)
|
15
|
+
|
16
|
+
fieldset = {alert_view_style: UIAlertViewStyleDefault, fields: [] }
|
17
|
+
case template
|
18
|
+
when :input
|
19
|
+
fieldset[:alert_view_style] = UIAlertViewStylePlainTextInput
|
20
|
+
fieldset[:fields] =
|
21
|
+
[
|
22
|
+
rmq.app.make_field(:text, keyboard_type: :default, secure_text_entry: false, placeholder: '')
|
23
|
+
]
|
24
|
+
when :secure
|
25
|
+
fieldset[:alert_view_style] = UIAlertViewStyleSecureTextInput
|
26
|
+
fieldset[:fields] =
|
27
|
+
[
|
28
|
+
rmq.app.make_field(:text, keyboard_type: :default, secure_text_entry: true, placeholder: '')
|
29
|
+
]
|
30
|
+
when :login
|
31
|
+
fieldset[:alert_view_style] = UIAlertViewStyleLoginAndPasswordInput
|
32
|
+
fieldset[:fields] =
|
33
|
+
[
|
34
|
+
rmq.app.make_field(:login, keyboard_type: :email_address, secure_text_entry: false, placeholder: login),
|
35
|
+
rmq.app.make_field(:password, keyboard_type: :default, secure_text_entry: true, placeholder: password)
|
36
|
+
]
|
37
|
+
when :change_password
|
38
|
+
fieldset[:alert_view_style] = UIAlertViewStyleLoginAndPasswordInput
|
39
|
+
fieldset[:fields] =
|
40
|
+
[
|
41
|
+
rmq.app.make_field(:current_password, keyboard_type: :default, secure_text_entry: true, placeholder: current_password),
|
42
|
+
rmq.app.make_field(:new_password, keyboard_type: :default, secure_text_entry: true, placeholder: new_password)
|
43
|
+
]
|
44
|
+
end
|
45
|
+
fieldset
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/project/red_alert.rb
CHANGED
@@ -2,6 +2,11 @@ module RubyMotionQuery
|
|
2
2
|
class App
|
3
3
|
class << self
|
4
4
|
|
5
|
+
TEMPLATE_FIELD_STYLES = [:input, :secure, :change_password, :login]
|
6
|
+
ALL_FIELD_STYLES = TEMPLATE_FIELD_STYLES + [:custom]
|
7
|
+
ALERT_STYLES = ALL_FIELD_STYLES + [:alert]
|
8
|
+
VALID_STYLES = ALERT_STYLES + [:sheet]
|
9
|
+
|
5
10
|
# Creates and shows the UIAlertController (iOS 8) or UIAlertView/UIActionSheet (iOS 7).
|
6
11
|
# Usage Example:
|
7
12
|
# rmq.app.alert(message: "This is a test")
|
@@ -15,7 +20,8 @@ module RubyMotionQuery
|
|
15
20
|
opts = {message: opts} if opts.is_a? String
|
16
21
|
opts = {style: :alert, animated: true, show_now: true}.merge(opts)
|
17
22
|
opts[:message] = opts[:message] ? opts[:message].to_s : NSLocalizedString("Alert!", nil)
|
18
|
-
opts[:style] = :
|
23
|
+
opts[:style] = VALID_STYLES.include?(opts[:style]) ? opts[:style] : :alert
|
24
|
+
opts[:fields] = opts[:style] == :custom && opts[:fields] ? opts[:fields] : {text: {placeholder: ''}}
|
19
25
|
api = rmq.device.ios_at_least?(8) ? :modern : :deprecated
|
20
26
|
api = :deprecated if rmq.device.ios_at_least?(8) && opts[:api] == :deprecated
|
21
27
|
opts[:api] = api
|
@@ -23,16 +29,31 @@ module RubyMotionQuery
|
|
23
29
|
# -----------------------------------------
|
24
30
|
# -- Who provides the alerts? -------------
|
25
31
|
# -----------------------------------------
|
32
|
+
|
26
33
|
if opts[:api] == :modern
|
27
34
|
provider = AlertControllerProvider.new
|
28
35
|
else
|
29
|
-
if opts[:style]
|
36
|
+
if ALERT_STYLES.include?(opts[:style])
|
30
37
|
provider = AlertViewProvider.new
|
31
38
|
else
|
32
39
|
provider = ActionSheetProvider.new
|
33
40
|
end
|
34
41
|
end
|
35
42
|
|
43
|
+
# -------------------------------------------------
|
44
|
+
# -- Configure the input fields --------------
|
45
|
+
# -------------------------------------------------
|
46
|
+
|
47
|
+
fieldset = {alert_view_style: UIAlertViewStyleDefault, fields: []}
|
48
|
+
|
49
|
+
if TEMPLATE_FIELD_STYLES.include?(opts[:style])
|
50
|
+
fieldset = add_template_fieldset(opts[:style])
|
51
|
+
elsif opts[:style] == :custom
|
52
|
+
fieldset = custom_fieldset(opts[:api], opts[:fields])
|
53
|
+
end
|
54
|
+
|
55
|
+
opts[:style] = :alert if ALL_FIELD_STYLES.include?(opts[:style])
|
56
|
+
|
36
57
|
# -------------------------------------------------
|
37
58
|
# -- Configure the actions (choices) --------------
|
38
59
|
# -------------------------------------------------
|
@@ -50,7 +71,7 @@ module RubyMotionQuery
|
|
50
71
|
# no actions & no block makes alerts a dull boy
|
51
72
|
actions << [AlertAction.new(NSLocalizedString("OK", nil))]
|
52
73
|
end
|
53
|
-
provider.build(actions.flatten.compact, opts)
|
74
|
+
provider.build(actions.flatten.compact, fieldset, opts)
|
54
75
|
|
55
76
|
# --------------------------------------------
|
56
77
|
# -- Show the modal right away? --------------
|
@@ -66,13 +87,44 @@ module RubyMotionQuery
|
|
66
87
|
provider
|
67
88
|
end # alert
|
68
89
|
|
69
|
-
|
90
|
+
def custom_fieldset(api_version = :modern, fields)
|
91
|
+
raise ArgumentError.new "At least one field must be provided for a custom style" unless fields && fields.count > 0
|
92
|
+
fieldset = {alert_view_style: UIAlertViewStyleDefault, fields: [] }
|
93
|
+
if api_version == :deprecated
|
94
|
+
case fields.count
|
95
|
+
when 1
|
96
|
+
fieldset[:alert_view_style] = UIAlertViewStylePlainTextInput
|
97
|
+
when 2
|
98
|
+
fieldset[:alert_view_style] = UIAlertViewStyleLoginAndPasswordInput
|
99
|
+
else
|
100
|
+
raise ArgumentError.new "When running iOS < 8, up to two fields can be provided for a custom style"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
alert_fields = []
|
104
|
+
fields.each do |k, v|
|
105
|
+
alert_fields << AlertField.new(k, v)
|
106
|
+
end
|
107
|
+
fieldset[:fields] = alert_fields
|
108
|
+
fieldset
|
109
|
+
end
|
110
|
+
|
111
|
+
# Returns an AlertField from given parameters
|
112
|
+
# Usage Example:
|
113
|
+
# login = rmq.make_field("Login")
|
114
|
+
# password = rmq.make_field(:password, secure: true, placeholder: 'Password')
|
115
|
+
# @return [AlertField]
|
116
|
+
|
117
|
+
def make_field(name, opts={})
|
118
|
+
AlertField.new(name, opts)
|
119
|
+
end
|
120
|
+
|
121
|
+
# Returns an AlertAction from given parameters
|
70
122
|
# Usage Example:
|
71
123
|
# yes = rmq.make_button("Yes")
|
72
124
|
# cancel = rmq.make_button(title: "Cancel", style: :cancel) {
|
73
125
|
# puts "Cancel pressed"
|
74
126
|
# }
|
75
|
-
# @return [
|
127
|
+
# @return [AlertAction]
|
76
128
|
def make_button(opts={}, &block)
|
77
129
|
AlertAction.new(opts, &block)
|
78
130
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: RedAlert
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gant Laborde
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby_motion_query
|
@@ -38,8 +38,8 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
description: RMQ Plugin adds efficient and dynamic alerts/sheets for RubyMotion
|
42
|
-
iOS 7 & 8
|
41
|
+
description: RMQ Plugin adds efficient and dynamic alerts/sheets for RubyMotion Apps
|
42
|
+
on iOS 7 & 8
|
43
43
|
email:
|
44
44
|
- GantMan@gmail.com
|
45
45
|
executables: []
|
@@ -52,8 +52,10 @@ files:
|
|
52
52
|
- lib/project/alert_action.rb
|
53
53
|
- lib/project/alert_constants.rb
|
54
54
|
- lib/project/alert_controller_provider.rb
|
55
|
+
- lib/project/alert_field.rb
|
55
56
|
- lib/project/alert_view_provider.rb
|
56
57
|
- lib/project/button_templates.rb
|
58
|
+
- lib/project/field_templates.rb
|
57
59
|
- lib/project/red_alert.rb
|
58
60
|
- lib/red_alert.rb
|
59
61
|
homepage: https://github.com/GantMan/RedAlert
|
@@ -79,6 +81,6 @@ rubyforge_project:
|
|
79
81
|
rubygems_version: 2.4.5
|
80
82
|
signing_key:
|
81
83
|
specification_version: 4
|
82
|
-
summary: RMQ Plugin adds efficient and dynamic alerts/sheets for RubyMotion
|
83
|
-
7 & 8.
|
84
|
+
summary: RMQ Plugin adds efficient and dynamic alerts/sheets for RubyMotion Apps on
|
85
|
+
iOS 7 & 8.
|
84
86
|
test_files: []
|