formbuilder-rb 0.0.4 → 0.2.0
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 +4 -4
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +219 -0
- data/Guardfile +17 -0
- data/{MIT-LICENSE → LICENSE.md} +1 -1
- data/README.md +86 -0
- data/app/controllers/formbuilder/concerns/forms_controller.rb +59 -0
- data/app/models/formbuilder/entry_attachment.rb +2 -8
- data/app/models/formbuilder/form.rb +53 -0
- data/app/models/formbuilder/response_field.rb +23 -10
- data/app/models/formbuilder/response_field_address.rb +12 -1
- data/app/models/formbuilder/response_field_checkboxes.rb +38 -0
- data/app/models/formbuilder/response_field_date.rb +7 -1
- data/app/models/formbuilder/response_field_dropdown.rb +2 -1
- data/app/models/formbuilder/response_field_email.rb +14 -2
- data/app/models/formbuilder/response_field_file.rb +75 -20
- data/app/models/formbuilder/response_field_number.rb +9 -2
- data/app/models/formbuilder/response_field_page_break.rb +13 -0
- data/app/models/formbuilder/response_field_paragraph.rb +19 -3
- data/app/models/formbuilder/response_field_price.rb +10 -6
- data/app/models/formbuilder/response_field_radio.rb +11 -2
- data/app/models/formbuilder/response_field_section_break.rb +12 -2
- data/app/models/formbuilder/response_field_table.rb +222 -0
- data/app/models/formbuilder/response_field_text.rb +9 -2
- data/app/models/formbuilder/response_field_time.rb +8 -1
- data/app/models/formbuilder/response_field_website.rb +26 -2
- data/app/uploaders/formbuilder/entry_attachment_uploader.rb +11 -1
- data/bin/rails +8 -0
- data/circle.yml +9 -0
- data/config/spring.rb +1 -0
- data/db/migrate/20130924185815_create_formbuilder_entry_attachments.rb +1 -0
- data/formbuilder-rb.gemspec +41 -0
- data/formbuilder-rb.sublime-project +20 -0
- data/lib/formbuilder.rb +8 -3
- data/lib/formbuilder/entry.rb +102 -159
- data/lib/formbuilder/entry_validator.rb +13 -6
- data/lib/formbuilder/version.rb +1 -1
- data/lib/formbuilder/views/entry_dl.rb +56 -0
- data/lib/formbuilder/views/form.rb +81 -0
- data/lib/formbuilder/views/form_field.rb +45 -0
- data/spec/controllers/formbuilder/forms_controller_spec.rb +40 -0
- data/spec/dummy/.ruby-gemset +1 -0
- data/spec/dummy/.ruby-version +1 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/forms_controller.rb +3 -0
- data/spec/dummy/app/controllers/test_controller.rb +57 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/models/entry.rb +7 -0
- data/spec/dummy/app/models/entry_with_alternate_column_name.rb +11 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/test/_form.rb +2 -0
- data/spec/dummy/app/views/test/render_entry.html.erb +1 -0
- data/spec/dummy/app/views/test/show_form.html.erb +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +25 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml.ci +15 -0
- data/spec/dummy/config/database.yml.example +15 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +52 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +12 -0
- data/spec/dummy/db/migrate/20130924182939_create_entries.rb +13 -0
- data/spec/dummy/db/migrate/20130924192151_create_formbuilder_forms.formbuilder.rb +11 -0
- data/spec/dummy/db/migrate/20130924192152_create_formbuilder_response_fields.formbuilder.rb +17 -0
- data/spec/dummy/db/migrate/20130926205845_create_formbuilder_entry_attachments.formbuilder.rb +12 -0
- data/spec/dummy/db/migrate/20140128000000_create_entry_with_alternate_column_names.rb +13 -0
- data/spec/dummy/db/schema.rb +64 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/test/fixtures/entries.yml +9 -0
- data/spec/dummy/test/fixtures/response_fields.yml +19 -0
- data/spec/dummy/test/models/entry_test.rb +7 -0
- data/spec/dummy/test/models/response_field_test.rb +7 -0
- data/spec/factories/formbuilder_forms.rb +45 -0
- data/spec/features/form_renderer_spec.rb +30 -0
- data/spec/features/submitting_an_entry_spec.rb +79 -0
- data/spec/fixtures/test_files/text.txt +1 -0
- data/spec/fixtures/test_files/text2.txt +1 -0
- data/spec/lib/formbuilder/entry_spec.rb +199 -0
- data/spec/lib/formbuilder/entry_validator_spec.rb +215 -0
- data/spec/lib/formbuilder/entry_with_alternate_column_name_spec.rb +37 -0
- data/spec/lib/formbuilder/views/entry_dl_spec.rb +38 -0
- data/spec/models/formbuilder/entry_attachment_spec.rb +17 -0
- data/spec/models/formbuilder/form_spec.rb +100 -0
- data/spec/models/formbuilder/response_field_address_spec.rb +25 -0
- data/spec/models/formbuilder/response_field_checkboxes_spec.rb +57 -0
- data/spec/models/formbuilder/response_field_file_spec.rb +80 -0
- data/spec/models/formbuilder/response_field_paragraph_spec.rb +22 -0
- data/spec/models/formbuilder/response_field_radio_spec.rb +30 -0
- data/spec/models/formbuilder/response_field_spec.rb +21 -0
- data/spec/models/formbuilder/response_field_table_spec.rb +124 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/support/database_cleaner.rb +21 -0
- data/spec/support/submitting_an_entry_spec_helper.rb +151 -0
- metadata +286 -44
- data/app/controllers/formbuilder/forms_controller.rb +0 -53
- data/lib/formbuilder/entry_renderer.rb +0 -47
- data/lib/formbuilder/entry_table_renderer.rb +0 -58
- data/lib/formbuilder/form_renderer.rb +0 -102
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# A controller to integrate with the Formbuilder.js frontend (https://github.com/dobtco/formbuilder)
|
|
2
|
-
|
|
3
|
-
module Formbuilder
|
|
4
|
-
class FormsController < ApplicationController
|
|
5
|
-
|
|
6
|
-
before_filter :load_form
|
|
7
|
-
|
|
8
|
-
protect_from_forgery except: :update
|
|
9
|
-
|
|
10
|
-
def update
|
|
11
|
-
existing_response_field_ids = []
|
|
12
|
-
cids = {}
|
|
13
|
-
|
|
14
|
-
(params[:fields] || []).each_with_index do |field_params, i|
|
|
15
|
-
response_field = field_params[:id].present? ?
|
|
16
|
-
@form.response_fields.find { |rf| rf.id == field_params[:id].to_i } :
|
|
17
|
-
@form.response_fields.build
|
|
18
|
-
|
|
19
|
-
response_field.update_attributes(transformed_field_params(field_params, i))
|
|
20
|
-
cids[response_field.id] = field_params[:cid]
|
|
21
|
-
existing_response_field_ids.push response_field.id
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# destroy fields that no longer exist
|
|
25
|
-
@form.response_fields.each do |response_field|
|
|
26
|
-
response_field.destroy unless response_field.id.in?(existing_response_field_ids)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
@form.response_fields.reload
|
|
30
|
-
|
|
31
|
-
@form.response_fields.each do |rf|
|
|
32
|
-
rf.cid = cids[rf.id]
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
render json: @form.response_fields_json
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
private
|
|
39
|
-
def load_form
|
|
40
|
-
@form = Formbuilder::Form.find(params[:id])
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def transformed_field_params(field_params, i)
|
|
44
|
-
filtered_params = field_params.select { |k, _|
|
|
45
|
-
k.to_sym.in?(Formbuilder::ResponseField::ALLOWED_PARAMS)
|
|
46
|
-
}.merge(
|
|
47
|
-
sort_order: i,
|
|
48
|
-
type: "Formbuilder::ResponseField#{field_params[:field_type].camelize}"
|
|
49
|
-
)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
end
|
|
53
|
-
end
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
module Formbuilder
|
|
2
|
-
class EntryRenderer
|
|
3
|
-
include ActionView::Context
|
|
4
|
-
include ActionView::Helpers::TagHelper
|
|
5
|
-
|
|
6
|
-
def initialize(entry, form, opts = {})
|
|
7
|
-
@entry, @form = entry, form
|
|
8
|
-
@options = opts # merge defaults?
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def fields
|
|
12
|
-
return_fields = @form.response_fields.reject { |rf| !rf.input_field }
|
|
13
|
-
return_fields.reject! { |rf| rf.blind? } unless @options[:show_blind]
|
|
14
|
-
return_fields
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def to_html
|
|
18
|
-
content_tag 'dl', class: 'entry-dl' do
|
|
19
|
-
fields.map do |rf|
|
|
20
|
-
"""
|
|
21
|
-
<dt>#{field_labels(rf)}</dt>
|
|
22
|
-
<dd>
|
|
23
|
-
#{field_value(rf) || no_value}
|
|
24
|
-
</dd>
|
|
25
|
-
"""
|
|
26
|
-
end.join('').html_safe
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def field_labels(rf)
|
|
31
|
-
"""
|
|
32
|
-
#{rf.label}
|
|
33
|
-
#{rf.blind? ? '<span class="label">Blind</span>' : ''}
|
|
34
|
-
#{rf.admin_only? ? '<span class="label">Admin Only</span>' : ''}
|
|
35
|
-
"""
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def no_value
|
|
39
|
-
"<span class='no-response'>No response</span>"
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def field_value(rf)
|
|
43
|
-
value = @entry.response_value(rf)
|
|
44
|
-
rf.render_entry(value, entry: @entry)
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
module Formbuilder
|
|
2
|
-
class EntryTableRenderer < EntryRenderer
|
|
3
|
-
# include ActionView::Context
|
|
4
|
-
# include ActionView::Helpers::TagHelper
|
|
5
|
-
|
|
6
|
-
# def initialize(entry, form, opts = {})
|
|
7
|
-
# @entry, @form = entry, form
|
|
8
|
-
# @options = opts # merge defaults?
|
|
9
|
-
# end
|
|
10
|
-
|
|
11
|
-
# def fields
|
|
12
|
-
# return_fields = @form.response_fields.reject { |rf| rf.non_input_field? }
|
|
13
|
-
# return_fields.reject! { |rf| rf.blind? } unless @options[:show_blind]
|
|
14
|
-
# return_fields
|
|
15
|
-
# end
|
|
16
|
-
|
|
17
|
-
def to_html
|
|
18
|
-
content_tag 'dl', class: 'entry-dl' do
|
|
19
|
-
fields.map do |rf|
|
|
20
|
-
field_value(rf)
|
|
21
|
-
end.join('').html_safe
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def field_value(rf)
|
|
26
|
-
value = @entry.response_value(rf)
|
|
27
|
-
rf.field_class.render_entry_for_table(rf, value, entry: @entry)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# def field_labels(rf)
|
|
31
|
-
# """
|
|
32
|
-
# #{rf.label}
|
|
33
|
-
# #{rf.blind? ? '<span class="label">Blind</span>' : ''}
|
|
34
|
-
# #{rf.admin_only? ? '<span class="label">Admin Only</span>' : ''}
|
|
35
|
-
# """
|
|
36
|
-
# end
|
|
37
|
-
|
|
38
|
-
# def no_value
|
|
39
|
-
# "<span class='no-response'>No response</span>"
|
|
40
|
-
# end
|
|
41
|
-
|
|
42
|
-
# def field_value(rf)
|
|
43
|
-
# value = @entry.response_value(rf)
|
|
44
|
-
# Formbuilder::Fields.const_get(rf.field_type.camelize + 'Field').render_entry(rf, value, entry: @entry)
|
|
45
|
-
# end
|
|
46
|
-
|
|
47
|
-
# def checkboxes_for_table
|
|
48
|
-
# (@response_field.field_options['options'] || []).map do |option|
|
|
49
|
-
# """
|
|
50
|
-
# <td data-column-id='#{@response_field.id}_sortable_values_#{option['label']}'>
|
|
51
|
-
# <i class='#{@value && @value[option['label']] ? 'icon-ok' : 'icon-remove'}'></i>
|
|
52
|
-
# </td>
|
|
53
|
-
# """
|
|
54
|
-
# end.join('')
|
|
55
|
-
# end
|
|
56
|
-
|
|
57
|
-
end
|
|
58
|
-
end
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
module Formbuilder
|
|
2
|
-
class FormRenderer
|
|
3
|
-
|
|
4
|
-
include ActionView::Helpers::UrlHelper
|
|
5
|
-
include ActionView::Helpers::FormTagHelper
|
|
6
|
-
include ActionView::Context
|
|
7
|
-
|
|
8
|
-
def protect_against_forgery?; false; end;
|
|
9
|
-
|
|
10
|
-
DEFAULT_OPTIONS = {
|
|
11
|
-
action: '',
|
|
12
|
-
method: 'POST'
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
def initialize(form, entry, options = {})
|
|
16
|
-
@form, @entry = form, entry
|
|
17
|
-
@options = self.class::DEFAULT_OPTIONS.merge(options)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def to_html
|
|
21
|
-
form_tag @options[:action], method: @options[:method], class: 'formbuilder-form', multipart: true do
|
|
22
|
-
hidden_fields +
|
|
23
|
-
render_fields +
|
|
24
|
-
render_actions
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def hidden_fields
|
|
29
|
-
"""
|
|
30
|
-
<input type='hidden' name='draft_only' />
|
|
31
|
-
""".html_safe
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def render_fields
|
|
35
|
-
@form.response_fields.map do |field|
|
|
36
|
-
@field = field
|
|
37
|
-
render_field
|
|
38
|
-
end.join('').html_safe
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def render_field
|
|
42
|
-
value = @entry.try(:response_value, @field)
|
|
43
|
-
|
|
44
|
-
"""
|
|
45
|
-
<div class='fb-field-wrapper response-field-#{@field.field_type} #{@entry.try(:error_for, @field) && 'error'}'>
|
|
46
|
-
#{render_label}
|
|
47
|
-
#{@field.render_input(value, entry: @entry)}
|
|
48
|
-
<div class='cf'></div>
|
|
49
|
-
#{render_error}
|
|
50
|
-
#{render_description}
|
|
51
|
-
#{render_length_validations}
|
|
52
|
-
#{render_min_max_validations}
|
|
53
|
-
</div>
|
|
54
|
-
"""
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def render_label
|
|
58
|
-
return unless @field.input_field
|
|
59
|
-
|
|
60
|
-
"""
|
|
61
|
-
<label>
|
|
62
|
-
#{@field[:label]}
|
|
63
|
-
#{render_label_required if @field.required?}
|
|
64
|
-
</label>
|
|
65
|
-
"""
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def render_label_required
|
|
69
|
-
"<abbr title='required'>*</abbr>"
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def render_error
|
|
73
|
-
return unless @field.input_field
|
|
74
|
-
return unless @entry.error_for(@field)
|
|
75
|
-
"<span class='help-block validation-message-wrapper'>#{@entry.error_for(@field)}</span>"
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def render_description
|
|
79
|
-
return unless @field.input_field
|
|
80
|
-
return if @field[:field_options]["description"].blank?
|
|
81
|
-
"<span class='help-block'>#{simple_format(@field[:field_options]["description"])}</span>"
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def render_length_validations
|
|
85
|
-
return unless @field.input_field
|
|
86
|
-
return unless !@field.has_length_validations?
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def render_min_max_validations
|
|
90
|
-
return unless @field.input_field
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def render_actions
|
|
94
|
-
"""
|
|
95
|
-
<div class='form-actions'>
|
|
96
|
-
<button class='button primary'>Submit</button>
|
|
97
|
-
<a class='button save-draft-button' data-loading-text='All changes saved'>Save draft</a>
|
|
98
|
-
</div>
|
|
99
|
-
""".html_safe
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
end
|