hungryform-rails 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/.travis.yml +16 -0
- data/Gemfile +4 -0
- data/README.md +37 -1
- data/Rakefile +3 -0
- data/app/assets/javascripts/hungryform.js +145 -0
- data/app/assets/stylesheets/hungryform.css +8 -0
- data/app/views/hungryform/_checkbox_field.html.erb +12 -0
- data/app/views/hungryform/_form.html.erb +11 -0
- data/app/views/hungryform/_group.html.erb +7 -0
- data/app/views/hungryform/_html.html.erb +5 -0
- data/app/views/hungryform/_radio_group.html.erb +11 -0
- data/app/views/hungryform/_select_field.html.erb +9 -0
- data/app/views/hungryform/_text_area.html.erb +9 -0
- data/app/views/hungryform/_text_field.html.erb +9 -0
- data/gemfiles/rails3.gemfile +5 -0
- data/gemfiles/rails4.gemfile +5 -0
- data/gemfiles/rails41.gemfile +5 -0
- data/gemfiles/rails42.gemfile +5 -0
- data/hungryform-rails.gemspec +31 -0
- data/lib/hungryform/rails/action_view.rb +90 -0
- data/lib/hungryform/rails/engine.rb +6 -0
- data/lib/hungryform/rails/railtie.rb +24 -0
- data/lib/hungryform/rails/renderable.rb +13 -0
- data/lib/hungryform/rails/version.rb +5 -0
- data/lib/hungryform/rails.rb +11 -0
- data/lib/hungryform-rails.rb +1 -0
- data/spec/action_view_spec.rb +106 -0
- data/spec/dummy/app.rb +96 -0
- data/spec/dummy/vendor/assets/javascripts/jquery-2.1.3.min.js +4 -0
- data/spec/features/field_dependencies_spec.rb +51 -0
- data/spec/features/form_walk_spec.rb +92 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/views/checkbox_field_spec.rb +28 -0
- data/spec/views/form_spec.rb +42 -0
- data/spec/views/group_spec.rb +35 -0
- data/spec/views/html_spec.rb +22 -0
- data/spec/views/select_field_spec.rb +35 -0
- data/spec/views/shared_examples/rendered_active_element.rb +34 -0
- data/spec/views/shared_examples/wrapped.rb +28 -0
- data/spec/views/text_area_spec.rb +28 -0
- data/spec/views/text_field_spec.rb +28 -0
- metadata +69 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e1dbc3db77663b5d70ffed6dc331c8567ddb438
|
4
|
+
data.tar.gz: 68cb11ae8193f7047e1a4cd74b6c2ac0fe481f26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61346d2de43d07701d7375cb85f0982e789e90d752060ae205fadfc8a37b84fb947a898d5935bfdb83fd10148d0e2eb950372212222403b86d90c02df6c19337
|
7
|
+
data.tar.gz: 3b4da5e9334f8d65bf48a78fee4aa2fe873256fb245d1630ed5febe67a9d9709960dc56098e8d136f154fdc9bd47b0d5f1122de2b1ef61520a61553f063144cd
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.5
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -1 +1,37 @@
|
|
1
|
-
# hungryform-rails
|
1
|
+
#Hungryform Rails [![Build Status](https://travis-ci.org/andrba/hungryform-rails.svg?branch=master)](https://travis-ci.org/andrba/hungryform-rails)
|
2
|
+
|
3
|
+
This gem is an adaptor between the HungryForm gem and Rails.
|
4
|
+
|
5
|
+
##Installation:
|
6
|
+
|
7
|
+
Add the hungryform gem to your Gemfile:
|
8
|
+
```ruby
|
9
|
+
gem "hungryform-rails"
|
10
|
+
```
|
11
|
+
|
12
|
+
Add the Hungryform require to your application.js:
|
13
|
+
```
|
14
|
+
//= require hungryform
|
15
|
+
```
|
16
|
+
|
17
|
+
Add the Hungryform require to your application.css:
|
18
|
+
```
|
19
|
+
//= require hungryform
|
20
|
+
```
|
21
|
+
|
22
|
+
Use the following helper to generate the form in your views:
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
<%= hungry_form_for(@form) %>
|
26
|
+
```
|
27
|
+
|
28
|
+
##Configuration
|
29
|
+
|
30
|
+
This gem extends the configuration options provided by Hungryform. Create initializer in ```config/initializers/hungryform.rb``` and place the configuration code inside:
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
Hungryform.configure do |config|
|
34
|
+
config.rails.elements_templates = 'hungryform'
|
35
|
+
end
|
36
|
+
```
|
37
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
// Module to handle form interactions such as
|
2
|
+
// prev, next links and dependency resolution
|
3
|
+
(function($) {
|
4
|
+
|
5
|
+
function HungryForm(form) {
|
6
|
+
this.form = form;
|
7
|
+
this.$form = $(form);
|
8
|
+
|
9
|
+
this.init();
|
10
|
+
}
|
11
|
+
|
12
|
+
HungryForm.prototype = {
|
13
|
+
init: function() {
|
14
|
+
this.bindEvents();
|
15
|
+
},
|
16
|
+
|
17
|
+
bindEvents: function() {
|
18
|
+
var form_action = this.$form.find("input[name='form_action']"),
|
19
|
+
that = this;
|
20
|
+
|
21
|
+
this.$form.find(':input').on('change select', function() {
|
22
|
+
that.updateVisibility();
|
23
|
+
});
|
24
|
+
|
25
|
+
this.$form.find('input, select').keypress(function(event) {
|
26
|
+
return event.keyCode !== 13;
|
27
|
+
});
|
28
|
+
|
29
|
+
$("a[data-rel='" + this.$form.data('rel') + "'][data-form-action]").on('click', function(event) {
|
30
|
+
if ($(this).data('form-method') === 'get') {
|
31
|
+
return true;
|
32
|
+
}
|
33
|
+
|
34
|
+
event.preventDefault();
|
35
|
+
|
36
|
+
var action = $(this).data('form-action');
|
37
|
+
form_action.val(action);
|
38
|
+
that.$form.attr('action', $(this).attr('href'));
|
39
|
+
|
40
|
+
that.$form.submit();
|
41
|
+
});
|
42
|
+
},
|
43
|
+
|
44
|
+
updateVisibility: function() {
|
45
|
+
var that = this;
|
46
|
+
this.$form.find('div[data-dependency], fieldset[data-dependency]').each(function() {
|
47
|
+
var obj = $(this);
|
48
|
+
var dependency = obj.data('dependency');
|
49
|
+
|
50
|
+
if (that.resolveDependency(dependency)) {
|
51
|
+
that._setObjectVisibility(obj, true);
|
52
|
+
} else {
|
53
|
+
that._setObjectVisibility(obj, false);
|
54
|
+
}
|
55
|
+
});
|
56
|
+
},
|
57
|
+
|
58
|
+
resolveDependency: function(dependency) {
|
59
|
+
var isDependent = false;
|
60
|
+
var that = this;
|
61
|
+
|
62
|
+
$.each(dependency, function(operator, args) {
|
63
|
+
if (operator === 'eq') {
|
64
|
+
isDependent = that._isEqual(args);
|
65
|
+
return false;
|
66
|
+
} else if (operator === 'lt') {
|
67
|
+
isDependent = that._isLessThan(args);
|
68
|
+
return false;
|
69
|
+
} else if (operator === 'gt') {
|
70
|
+
isDependent = that._isGreaterThan(args);
|
71
|
+
return false;
|
72
|
+
} else if (operator === 'not') {
|
73
|
+
isDependent = !that.resolveDependency(args);
|
74
|
+
return false;
|
75
|
+
} else if (operator === 'is') {
|
76
|
+
isDependent = that._isSet(args);
|
77
|
+
return false;
|
78
|
+
} else if (operator === 'and') {
|
79
|
+
isDependent = true;
|
80
|
+
$.each(args, function(index, argument) {
|
81
|
+
isDependent = that.resolveDependency(argument) && isDependent;
|
82
|
+
if (isDependent === false) {
|
83
|
+
//No need to check the rest of the dependencies
|
84
|
+
return false;
|
85
|
+
}
|
86
|
+
});
|
87
|
+
return false;
|
88
|
+
} else if (operator === 'or') {
|
89
|
+
$.each(args, function(index, argument) {
|
90
|
+
isDependent = that.resolveDependency(argument) || isDependent;
|
91
|
+
if (isDependent === true) {
|
92
|
+
//No need to check the rest of the dependencies
|
93
|
+
return false;
|
94
|
+
}
|
95
|
+
});
|
96
|
+
return false;
|
97
|
+
}
|
98
|
+
});
|
99
|
+
|
100
|
+
return isDependent;
|
101
|
+
},
|
102
|
+
_isEqual: function(args) {
|
103
|
+
return args.length > 1 && this._getArgument(args[0]).toString() === this._getArgument(args[1]).toString();
|
104
|
+
},
|
105
|
+
_isLessThan: function(args) {
|
106
|
+
return args.length > 1 && parseFloat(this._getArgument(args[0])) < parseFloat(this._getArgument(args[1]));
|
107
|
+
},
|
108
|
+
_isGreaterThan: function(args) {
|
109
|
+
return args.length > 1 && parseFloat(this._getArgument(args[0])) > parseFloat(this._getArgument(args[1]));
|
110
|
+
},
|
111
|
+
_isSet: function(args) {
|
112
|
+
return typeof(args[0]) !== 'undefined' && this._getArgument(args[0]).length > 0;
|
113
|
+
},
|
114
|
+
_getArgument: function(argument) {
|
115
|
+
var input = this.$form.find("input[name='" + argument + "'], textarea[name='" + argument + "'], select[name='" + argument + "']");
|
116
|
+
|
117
|
+
if (input.length > 0) {
|
118
|
+
if (input.filter(':radio').length > 0) {
|
119
|
+
return input.filter(':radio:checked').length > 0? input.filter(':radio:checked').val() : '';
|
120
|
+
} else if (input.filter(':checkbox').length > 0) {
|
121
|
+
return input.filter(':checkbox:checked').length > 0? input.filter(':checkbox:checked').val() : '';
|
122
|
+
} else {
|
123
|
+
return input.val();
|
124
|
+
}
|
125
|
+
}
|
126
|
+
else {
|
127
|
+
return argument;
|
128
|
+
}
|
129
|
+
},
|
130
|
+
_setObjectVisibility: function(obj, visible) {
|
131
|
+
if (visible) {
|
132
|
+
obj.removeClass('hidden');
|
133
|
+
}
|
134
|
+
else {
|
135
|
+
obj.addClass('hidden');
|
136
|
+
}
|
137
|
+
}
|
138
|
+
};
|
139
|
+
|
140
|
+
$(function() {
|
141
|
+
$('form.hungryform').each(function() {
|
142
|
+
new HungryForm(this);
|
143
|
+
});
|
144
|
+
});
|
145
|
+
}(jQuery));
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
|
2
|
+
|
3
|
+
concat label_tag field.name, field.label << ("*" if field.required?).to_s
|
4
|
+
concat hidden_field_tag field.name, 0
|
5
|
+
concat check_box_tag field.name, 1, field.checked?, field.attributes.except(:class, :checked)
|
6
|
+
unless field.error.empty?
|
7
|
+
concat content_tag :span, field.error, class: 'error'
|
8
|
+
end
|
9
|
+
|
10
|
+
end %>
|
11
|
+
|
12
|
+
<%= field.attributes.inspect %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%= hidden_field_tag :form_action %>
|
2
|
+
|
3
|
+
<h1><%= form.current_page.label %></h1>
|
4
|
+
|
5
|
+
<% form.current_page.elements.each do |el| %>
|
6
|
+
<%= render partial: "#{views_prefix}/#{el.class.name.demodulize.underscore}", locals: { field: el, views_prefix: views_prefix } %>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<%= hungry_link_to_prev_page(form, "Prev", method: :post) if form.prev_page %>
|
10
|
+
<%= hungry_link_to_next_page(form, "Next", method: :post) if form.next_page %>
|
11
|
+
<%= hungry_link_to_submit(form, "Submit") if form.current_page == form.pages.last %>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
|
2
|
+
|
3
|
+
field.elements.each do |el|
|
4
|
+
concat render partial: "#{views_prefix}/#{el.class.name.demodulize.underscore}", locals: { field: el, views_prefix: views_prefix }
|
5
|
+
end
|
6
|
+
|
7
|
+
end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
|
2
|
+
|
3
|
+
concat label_tag field.name, field.label << ("*" if field.required?).to_s
|
4
|
+
field.options.each do |key, value|
|
5
|
+
concat radio_button_tag key, value, field.value == value, field.attributes.except(:class)
|
6
|
+
end
|
7
|
+
unless field.error.empty?
|
8
|
+
concat content_tag :span, field.error, class: 'error'
|
9
|
+
end
|
10
|
+
|
11
|
+
end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
|
2
|
+
|
3
|
+
concat label_tag field.name, field.label << ("*" if field.required?).to_s
|
4
|
+
concat select_tag field.name, options_for_select(field.options.invert, field.value), field.attributes.except(:class)
|
5
|
+
unless field.error.empty?
|
6
|
+
concat content_tag :span, field.error, class: 'error'
|
7
|
+
end
|
8
|
+
|
9
|
+
end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
|
2
|
+
|
3
|
+
concat label_tag field.name, field.label << ("*" if field.required?).to_s
|
4
|
+
concat text_area_tag field.name, field.value, field.attributes.except(:class)
|
5
|
+
unless field.error.empty?
|
6
|
+
concat content_tag :span, field.error, class: 'error'
|
7
|
+
end
|
8
|
+
|
9
|
+
end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
|
2
|
+
|
3
|
+
concat label_tag field.name, field.label << ("*" if field.required?).to_s
|
4
|
+
concat text_field_tag field.name, field.value, field.attributes.except(:class)
|
5
|
+
unless field.error.empty?
|
6
|
+
concat content_tag :span, field.error, class: 'error'
|
7
|
+
end
|
8
|
+
|
9
|
+
end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'hungryform/rails/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "hungryform-rails"
|
8
|
+
spec.version = HungryForm::Rails::VERSION
|
9
|
+
spec.platform = Gem::Platform::RUBY
|
10
|
+
spec.authors = ["Andrey Bazhutkin"]
|
11
|
+
spec.email = ["andrey.bazhutkin@gmail.com"]
|
12
|
+
spec.summary = "Use HungryForm with Rails"
|
13
|
+
spec.description = "A gem to automate using HungryForm with Rails"
|
14
|
+
spec.homepage = "https://github.com/andrba/hungryform-rails"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0")
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.required_ruby_version = '>= 2.0.0'
|
23
|
+
|
24
|
+
spec.add_dependency 'hungryform', '~> 0.0', '>= 0.0.9'
|
25
|
+
spec.add_dependency 'rails', '>= 3.2.1'
|
26
|
+
|
27
|
+
spec.add_development_dependency "rspec", '~> 3.0'
|
28
|
+
spec.add_development_dependency "rspec-rails", '~> 3.0'
|
29
|
+
spec.add_development_dependency "capybara", '~> 2.4'
|
30
|
+
spec.add_development_dependency "poltergeist", '~> 1.6'
|
31
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module HungryForm
|
2
|
+
module Rails
|
3
|
+
module ActionView
|
4
|
+
# Render a form
|
5
|
+
def hungry_form_for(form, options = {})
|
6
|
+
options[:data] ||= {}
|
7
|
+
options[:data][:rel] ||= form_rel(form)
|
8
|
+
options[:class] = [options[:class], "hungryform"].compact.join(' ')
|
9
|
+
|
10
|
+
views_prefix = options.delete(:views_prefix) || HungryForm.configuration.rails.elements_templates
|
11
|
+
|
12
|
+
form_tag('', options) do
|
13
|
+
render partial: "#{views_prefix}/form", locals: {
|
14
|
+
form: form,
|
15
|
+
views_prefix: views_prefix
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Render a link to the next page
|
21
|
+
def hungry_link_to_next_page(form, name, options = {}, &block)
|
22
|
+
link_to name, *link_params(form, options, action: :next), &block
|
23
|
+
end
|
24
|
+
|
25
|
+
# Render a link to the previous page
|
26
|
+
def hungry_link_to_prev_page(form, name, options = {}, &block)
|
27
|
+
link_to name, *link_params(form, options, action: :prev), &block
|
28
|
+
end
|
29
|
+
|
30
|
+
# Render a link to a provided page
|
31
|
+
def hungry_link_to_page(form, page, options = {}, &block)
|
32
|
+
link_to page.label, *link_params(form, options, action: :page, page: page), &block
|
33
|
+
end
|
34
|
+
|
35
|
+
# Render a link that submits the form
|
36
|
+
def hungry_link_to_submit(form, name, options = {}, &block)
|
37
|
+
params = clean_params(form, options.delete(:params))
|
38
|
+
|
39
|
+
link_to name, url_for(params), options.reverse_merge(
|
40
|
+
data: { form_method: :post, form_action: :submit, rel: form_rel(form) }
|
41
|
+
), &block
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
# Form ralation attribute is used to streamline js selection of a form
|
47
|
+
# and its navigational elements like next/prev buttons and pages lists
|
48
|
+
def form_rel(form)
|
49
|
+
"hungry-form-#{form.__id__}"
|
50
|
+
end
|
51
|
+
|
52
|
+
# Builds link_to params except for the link's name
|
53
|
+
def link_params(form, options, action_options = {})
|
54
|
+
method = options.delete(:method) || 'get'
|
55
|
+
params = clean_params(form, options.delete(:params))
|
56
|
+
|
57
|
+
params[:page] = method.to_s == 'get' ? get_page(form, action_options) : form.current_page.name
|
58
|
+
|
59
|
+
options.reverse_merge!(
|
60
|
+
data: {
|
61
|
+
form_method: method,
|
62
|
+
form_action: action_options[:action],
|
63
|
+
rel: form_rel(form)
|
64
|
+
}
|
65
|
+
)
|
66
|
+
|
67
|
+
[url_for(params), options]
|
68
|
+
end
|
69
|
+
|
70
|
+
# Find the name of the page to go to when the 'get' method is used in a
|
71
|
+
# form navigation
|
72
|
+
def get_page(form, action_options)
|
73
|
+
case action_options[:action]
|
74
|
+
when :page
|
75
|
+
action_options[:page].name
|
76
|
+
when :next, :prev
|
77
|
+
form.send("#{action_options[:action]}_page").try(:name) || ''
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Remove Rails specific params from the params hash as well as
|
82
|
+
# all the form params
|
83
|
+
def clean_params(form, params)
|
84
|
+
rails_params = [:authenticity_token, :commit, :utf8, :_method]
|
85
|
+
form_params = form.elements.keys + [:form_action, :errors]
|
86
|
+
self.params.except(*(rails_params + form_params)).merge(params || {})
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module HungryForm
|
2
|
+
module Rails
|
3
|
+
class Railtie < ::Rails::Railtie
|
4
|
+
|
5
|
+
module Configuration
|
6
|
+
attr_accessor :rails
|
7
|
+
end
|
8
|
+
|
9
|
+
initializer 'hungryform', before: :load_config_initializers do
|
10
|
+
HungryForm::Elements::Base::Element.send :include, Renderable
|
11
|
+
|
12
|
+
HungryForm.configuration.extend Configuration
|
13
|
+
HungryForm.configuration.rails = ActiveSupport::OrderedOptions.new
|
14
|
+
HungryForm.configuration.rails.elements_templates = 'hungryform'
|
15
|
+
end
|
16
|
+
|
17
|
+
initializer 'active_support' do
|
18
|
+
ActiveSupport.on_load(:action_view) do
|
19
|
+
::ActionView::Base.send :include, ActionView
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module HungryForm
|
2
|
+
module Rails
|
3
|
+
module Renderable
|
4
|
+
def html_class
|
5
|
+
classes = []
|
6
|
+
classes << attributes[:class] if attributes[:class]
|
7
|
+
classes << 'hidden' unless visible?
|
8
|
+
classes << 'invalid' if self.is_a?(HungryForm::Elements::Base::ActiveElement) && self.error.present?
|
9
|
+
classes.join(' ') if classes.any?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module HungryForm
|
2
|
+
module Rails
|
3
|
+
end
|
4
|
+
end
|
5
|
+
|
6
|
+
require 'hungryform'
|
7
|
+
require 'hungryform/rails/version'
|
8
|
+
require 'hungryform/rails/railtie'
|
9
|
+
require 'hungryform/rails/engine'
|
10
|
+
require 'hungryform/rails/action_view'
|
11
|
+
require 'hungryform/rails/renderable'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'hungryform/rails'
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe HungryForm::Rails::ActionView, :type => :helper do
|
4
|
+
let(:form_params) { {} }
|
5
|
+
let(:form) do
|
6
|
+
HungryForm::Form.new params: form_params do
|
7
|
+
page :first do
|
8
|
+
text_field :first_name
|
9
|
+
text_field :last_name
|
10
|
+
end
|
11
|
+
|
12
|
+
page :second do
|
13
|
+
text_field :email
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
before { helper.params.merge!(controller: 'hungry_form', action: 'show') }
|
19
|
+
|
20
|
+
describe '#hungry_link_to_next_page' do
|
21
|
+
let(:params) { {} }
|
22
|
+
subject { helper.hungry_link_to_next_page(form, "Next", params) }
|
23
|
+
|
24
|
+
it { is_expected.to include("data-rel=\"hungry-form-#{form.__id__}\"") }
|
25
|
+
it { is_expected.to include('data-form-action="next"') }
|
26
|
+
|
27
|
+
context 'when method is GET' do
|
28
|
+
it { is_expected.to include('/hungryform/second') }
|
29
|
+
it { is_expected.to include('data-form-method="get"') }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when method is POST' do
|
33
|
+
before { params[:method] = :post }
|
34
|
+
|
35
|
+
it { is_expected.to include('/hungryform/first') }
|
36
|
+
it { is_expected.to include('data-form-method="post"') }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#hungry_link_to_prev_page' do
|
41
|
+
let(:form_params) { { page: 'second' } }
|
42
|
+
let(:params) { {} }
|
43
|
+
subject { helper.hungry_link_to_prev_page(form, "Prev", params) }
|
44
|
+
|
45
|
+
it { is_expected.to include("data-rel=\"hungry-form-#{form.__id__}\"") }
|
46
|
+
it { is_expected.to include('data-form-action="prev"') }
|
47
|
+
|
48
|
+
context 'when method is GET' do
|
49
|
+
it { is_expected.to include('/hungryform/first') }
|
50
|
+
it { is_expected.to include('data-form-method="get"') }
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'when method is POST' do
|
54
|
+
before { params[:method] = :post }
|
55
|
+
|
56
|
+
it { is_expected.to include('/hungryform/second') }
|
57
|
+
it { is_expected.to include('data-form-method="post"') }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#hungry_link_to_page' do
|
62
|
+
let(:params) { {} }
|
63
|
+
subject { helper.hungry_link_to_page(form, form.pages.last, params) }
|
64
|
+
|
65
|
+
it { is_expected.to include("data-rel=\"hungry-form-#{form.__id__}\"") }
|
66
|
+
it { is_expected.to include('data-form-action="page"') }
|
67
|
+
|
68
|
+
context 'when method is GET' do
|
69
|
+
it { is_expected.to include('/hungryform/second') }
|
70
|
+
it { is_expected.to include('data-form-method="get"') }
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'when method is POST' do
|
74
|
+
before { params[:method] = :post }
|
75
|
+
|
76
|
+
it { is_expected.to include('/hungryform/first') }
|
77
|
+
it { is_expected.to include('data-form-method="post"') }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#hungry_form_for' do
|
82
|
+
subject { helper.hungry_form_for(form) }
|
83
|
+
|
84
|
+
it 'renders a form' do
|
85
|
+
expect(subject).to include('<form')
|
86
|
+
expect(subject).to include("data-rel=\"hungry-form-#{form.__id__}\"")
|
87
|
+
expect(subject).to match /<input(?=.*name="form_action")(?=.*id="form_action")/ #Mandatory hidden action field
|
88
|
+
expect(subject).to include('First name')
|
89
|
+
expect(subject).to include('Last name')
|
90
|
+
expect(subject).to include('Next')
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'renders only a current page' do
|
94
|
+
expect(subject).to include('<h1>First</h1>')
|
95
|
+
expect(subject).not_to include('<h1>Second</h1>')
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#hungry_link_to_submit' do
|
100
|
+
let(:params) { {} }
|
101
|
+
subject { helper.hungry_link_to_submit(form, "Submit", params) }
|
102
|
+
|
103
|
+
it { is_expected.to include("data-rel=\"hungry-form-#{form.__id__}\"") }
|
104
|
+
it { is_expected.to include('data-form-action="submit"') }
|
105
|
+
end
|
106
|
+
end
|