formbuilder-rb 0.0.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -0
  3. data/.rspec +2 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +14 -0
  7. data/Gemfile.lock +219 -0
  8. data/Guardfile +17 -0
  9. data/{MIT-LICENSE → LICENSE.md} +1 -1
  10. data/README.md +86 -0
  11. data/app/controllers/formbuilder/concerns/forms_controller.rb +59 -0
  12. data/app/models/formbuilder/entry_attachment.rb +2 -8
  13. data/app/models/formbuilder/form.rb +53 -0
  14. data/app/models/formbuilder/response_field.rb +23 -10
  15. data/app/models/formbuilder/response_field_address.rb +12 -1
  16. data/app/models/formbuilder/response_field_checkboxes.rb +38 -0
  17. data/app/models/formbuilder/response_field_date.rb +7 -1
  18. data/app/models/formbuilder/response_field_dropdown.rb +2 -1
  19. data/app/models/formbuilder/response_field_email.rb +14 -2
  20. data/app/models/formbuilder/response_field_file.rb +75 -20
  21. data/app/models/formbuilder/response_field_number.rb +9 -2
  22. data/app/models/formbuilder/response_field_page_break.rb +13 -0
  23. data/app/models/formbuilder/response_field_paragraph.rb +19 -3
  24. data/app/models/formbuilder/response_field_price.rb +10 -6
  25. data/app/models/formbuilder/response_field_radio.rb +11 -2
  26. data/app/models/formbuilder/response_field_section_break.rb +12 -2
  27. data/app/models/formbuilder/response_field_table.rb +222 -0
  28. data/app/models/formbuilder/response_field_text.rb +9 -2
  29. data/app/models/formbuilder/response_field_time.rb +8 -1
  30. data/app/models/formbuilder/response_field_website.rb +26 -2
  31. data/app/uploaders/formbuilder/entry_attachment_uploader.rb +11 -1
  32. data/bin/rails +8 -0
  33. data/circle.yml +9 -0
  34. data/config/spring.rb +1 -0
  35. data/db/migrate/20130924185815_create_formbuilder_entry_attachments.rb +1 -0
  36. data/formbuilder-rb.gemspec +41 -0
  37. data/formbuilder-rb.sublime-project +20 -0
  38. data/lib/formbuilder.rb +8 -3
  39. data/lib/formbuilder/entry.rb +102 -159
  40. data/lib/formbuilder/entry_validator.rb +13 -6
  41. data/lib/formbuilder/version.rb +1 -1
  42. data/lib/formbuilder/views/entry_dl.rb +56 -0
  43. data/lib/formbuilder/views/form.rb +81 -0
  44. data/lib/formbuilder/views/form_field.rb +45 -0
  45. data/spec/controllers/formbuilder/forms_controller_spec.rb +40 -0
  46. data/spec/dummy/.ruby-gemset +1 -0
  47. data/spec/dummy/.ruby-version +1 -0
  48. data/spec/dummy/README.rdoc +28 -0
  49. data/spec/dummy/Rakefile +6 -0
  50. data/spec/dummy/app/assets/images/.keep +0 -0
  51. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  52. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  53. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  54. data/spec/dummy/app/controllers/forms_controller.rb +3 -0
  55. data/spec/dummy/app/controllers/test_controller.rb +57 -0
  56. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  57. data/spec/dummy/app/mailers/.keep +0 -0
  58. data/spec/dummy/app/models/concerns/.keep +0 -0
  59. data/spec/dummy/app/models/entry.rb +7 -0
  60. data/spec/dummy/app/models/entry_with_alternate_column_name.rb +11 -0
  61. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  62. data/spec/dummy/app/views/test/_form.rb +2 -0
  63. data/spec/dummy/app/views/test/render_entry.html.erb +1 -0
  64. data/spec/dummy/app/views/test/show_form.html.erb +1 -0
  65. data/spec/dummy/bin/bundle +3 -0
  66. data/spec/dummy/bin/rails +4 -0
  67. data/spec/dummy/bin/rake +4 -0
  68. data/spec/dummy/config.ru +4 -0
  69. data/spec/dummy/config/application.rb +25 -0
  70. data/spec/dummy/config/boot.rb +5 -0
  71. data/spec/dummy/config/database.yml.ci +15 -0
  72. data/spec/dummy/config/database.yml.example +15 -0
  73. data/spec/dummy/config/environment.rb +5 -0
  74. data/spec/dummy/config/environments/development.rb +29 -0
  75. data/spec/dummy/config/environments/production.rb +80 -0
  76. data/spec/dummy/config/environments/test.rb +52 -0
  77. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  78. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  79. data/spec/dummy/config/initializers/inflections.rb +16 -0
  80. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  81. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  82. data/spec/dummy/config/initializers/session_store.rb +3 -0
  83. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  84. data/spec/dummy/config/locales/en.yml +23 -0
  85. data/spec/dummy/config/routes.rb +12 -0
  86. data/spec/dummy/db/migrate/20130924182939_create_entries.rb +13 -0
  87. data/spec/dummy/db/migrate/20130924192151_create_formbuilder_forms.formbuilder.rb +11 -0
  88. data/spec/dummy/db/migrate/20130924192152_create_formbuilder_response_fields.formbuilder.rb +17 -0
  89. data/spec/dummy/db/migrate/20130926205845_create_formbuilder_entry_attachments.formbuilder.rb +12 -0
  90. data/spec/dummy/db/migrate/20140128000000_create_entry_with_alternate_column_names.rb +13 -0
  91. data/spec/dummy/db/schema.rb +64 -0
  92. data/spec/dummy/lib/assets/.keep +0 -0
  93. data/spec/dummy/log/.keep +0 -0
  94. data/spec/dummy/public/404.html +58 -0
  95. data/spec/dummy/public/422.html +58 -0
  96. data/spec/dummy/public/500.html +57 -0
  97. data/spec/dummy/public/favicon.ico +0 -0
  98. data/spec/dummy/test/fixtures/entries.yml +9 -0
  99. data/spec/dummy/test/fixtures/response_fields.yml +19 -0
  100. data/spec/dummy/test/models/entry_test.rb +7 -0
  101. data/spec/dummy/test/models/response_field_test.rb +7 -0
  102. data/spec/factories/formbuilder_forms.rb +45 -0
  103. data/spec/features/form_renderer_spec.rb +30 -0
  104. data/spec/features/submitting_an_entry_spec.rb +79 -0
  105. data/spec/fixtures/test_files/text.txt +1 -0
  106. data/spec/fixtures/test_files/text2.txt +1 -0
  107. data/spec/lib/formbuilder/entry_spec.rb +199 -0
  108. data/spec/lib/formbuilder/entry_validator_spec.rb +215 -0
  109. data/spec/lib/formbuilder/entry_with_alternate_column_name_spec.rb +37 -0
  110. data/spec/lib/formbuilder/views/entry_dl_spec.rb +38 -0
  111. data/spec/models/formbuilder/entry_attachment_spec.rb +17 -0
  112. data/spec/models/formbuilder/form_spec.rb +100 -0
  113. data/spec/models/formbuilder/response_field_address_spec.rb +25 -0
  114. data/spec/models/formbuilder/response_field_checkboxes_spec.rb +57 -0
  115. data/spec/models/formbuilder/response_field_file_spec.rb +80 -0
  116. data/spec/models/formbuilder/response_field_paragraph_spec.rb +22 -0
  117. data/spec/models/formbuilder/response_field_radio_spec.rb +30 -0
  118. data/spec/models/formbuilder/response_field_spec.rb +21 -0
  119. data/spec/models/formbuilder/response_field_table_spec.rb +124 -0
  120. data/spec/spec_helper.rb +25 -0
  121. data/spec/support/database_cleaner.rb +21 -0
  122. data/spec/support/submitting_an_entry_spec_helper.rb +151 -0
  123. metadata +286 -44
  124. data/app/controllers/formbuilder/forms_controller.rb +0 -53
  125. data/lib/formbuilder/entry_renderer.rb +0 -47
  126. data/lib/formbuilder/entry_table_renderer.rb +0 -58
  127. data/lib/formbuilder/form_renderer.rb +0 -102
@@ -4,6 +4,8 @@ module Formbuilder
4
4
  has_many :response_fields, dependent: :destroy
5
5
  belongs_to :formable, polymorphic: true
6
6
 
7
+ attr_accessor :show_blind, :show_admin_only
8
+
7
9
  def input_fields
8
10
  response_fields.reject { |rf| !rf.input_field }
9
11
  end
@@ -12,5 +14,56 @@ module Formbuilder
12
14
  self.response_fields.to_json(methods: [:field_type, :cid])
13
15
  end
14
16
 
17
+ def copy_response_fields!(other_form)
18
+ other_form.response_fields.each_with_index do |response_field, i|
19
+ self.response_fields.create(
20
+ label: response_field.label,
21
+ type: response_field.type,
22
+ field_options: response_field.field_options,
23
+ sort_order: response_field.sort_order,
24
+ required: response_field.required,
25
+ blind: response_field.blind,
26
+ admin_only: response_field.admin_only
27
+ )
28
+ end
29
+ end
30
+
31
+ def multi_page?
32
+ num_pages > 1
33
+ end
34
+
35
+ def num_pages
36
+ response_fields_by_page.length
37
+ end
38
+
39
+ def filtered_response_fields
40
+ query = response_fields
41
+ query = query.reject { |rf| rf.blind? } unless show_blind
42
+ query = query.reject { |rf| rf.admin_only? } unless show_admin_only
43
+ query
44
+ end
45
+
46
+ def response_fields_by_page
47
+ [].tap do |a|
48
+ a.push []
49
+
50
+ page_index = 0
51
+ filtered_response_fields.each do |response_field|
52
+ if response_field.field_type == 'page_break'
53
+ a << []
54
+ else
55
+ a.last << response_field
56
+ end
57
+ end
58
+
59
+ a.delete_if { |page| page.empty? }
60
+ a.push([]) if a.empty?
61
+ end
62
+ end
63
+
64
+ def response_fields_for_page(x)
65
+ response_fields_by_page[x - 1] # 0-indexed
66
+ end
67
+
15
68
  end
16
69
  end
@@ -22,6 +22,9 @@ module Formbuilder
22
22
  # Underscored name of this field
23
23
  attr_accessor :field_type
24
24
 
25
+ # Search type for this field
26
+ attr_accessor :search_type
27
+
25
28
  after_initialize -> {
26
29
  @input_field = true
27
30
  }
@@ -59,14 +62,6 @@ module Formbuilder
59
62
  return_hash.select { |k, v| v.present? }
60
63
  end
61
64
 
62
- def render_entry_for_table(value, opts = {})
63
- """
64
- <td data-column-id='#{self.id}'>
65
- #{render_entry(value, opts)}
66
- </td>
67
- """
68
- end
69
-
70
65
  def render_input(value, opts = {})
71
66
  raise 'Not implemented'
72
67
  end
@@ -75,10 +70,28 @@ module Formbuilder
75
70
  value
76
71
  end
77
72
 
78
- def audit_response(value, all_responses)
73
+ def render_entry_text(value, opts = {})
74
+ render_entry(value, opts)
75
+ end
76
+
77
+ def audit_response(value, all_responses); end;
78
+
79
+ def normalize_response(value, all_responses); end;
80
+
81
+ def validate_response(value); end;
82
+
83
+ def before_response_destroyed(entry); end;
84
+
85
+ def transform_raw_value(raw_value, entry, opts = {})
86
+ raw_value
87
+ end
88
+
89
+ def options_array
90
+ Array(self.field_options['options']).map { |o| o['label'] }
79
91
  end
80
92
 
81
- def validate_response(value)
93
+ def sortable_value(value)
94
+ value[0..10] # do we really need to sort more than the first 10 characters of a string?
82
95
  end
83
96
 
84
97
  end
@@ -4,6 +4,7 @@ module Formbuilder
4
4
  after_initialize -> {
5
5
  @serialized = true
6
6
  @field_type = 'address'
7
+ @search_type = 'address'
7
8
  }
8
9
 
9
10
  def render_input(value, opts = {})
@@ -12,7 +13,7 @@ module Formbuilder
12
13
  """
13
14
  <div class='input-line'>
14
15
  <span class='street'>
15
- <input type'text' name='response_fields[#{self[:id]}][street]' value='#{value['street']}' />
16
+ <input type'text' name='response_fields[#{self[:id]}][street]' id='response_fields_#{self[:id]}' value='#{value['street']}' />
16
17
  <label>Address</label>
17
18
  </span>
18
19
  </div>
@@ -53,6 +54,12 @@ module Formbuilder
53
54
  """
54
55
  end
55
56
 
57
+ def render_entry_text(value, opts = {})
58
+ "#{value['street']}\n" +
59
+ "#{value['city']} #{value['state']} #{value['zipcode']}\n" +
60
+ "#{value['country']}"
61
+ end
62
+
56
63
  def audit_response(value, all_responses)
57
64
  begin
58
65
  coords = Geocoder.coordinates("#{value['street']} #{value['city']} " +
@@ -66,6 +73,10 @@ module Formbuilder
66
73
  end
67
74
  end
68
75
 
76
+ def sortable_value(value)
77
+ "#{value['street']} #{value['city']} #{value['state']} #{value['zipcode']} #{value['country']}"
78
+ end
79
+
69
80
  private
70
81
  def country_options(selected_country)
71
82
  all_countries.map do |k, v|
@@ -5,6 +5,7 @@ module Formbuilder
5
5
  @serialized = true
6
6
  @options_field = true
7
7
  @field_type = 'checkboxes'
8
+ @search_type = 'multiple_options'
8
9
  }
9
10
 
10
11
  def render_input(value, opts = {})
@@ -64,5 +65,42 @@ module Formbuilder
64
65
  """
65
66
  end
66
67
 
68
+ def render_entry_text(value, opts = {})
69
+ (value || {}).map do |k, v|
70
+ "#{k}: #{v ? (k == 'Other' ? v : 'y') : 'n'}"
71
+ end.join("\n")
72
+ end
73
+
74
+ def sortable_value(value)
75
+ nil # see :normalize_response for override
76
+ end
77
+
78
+ def normalize_response(value, all_responses)
79
+ options_array.each do |option_label|
80
+ all_responses["#{self.id}_sortable_values_#{option_label}"] = value[option_label]
81
+ end
82
+ end
83
+
84
+ def transform_raw_value(raw_value, entry, opts = {})
85
+ raw_value ||= {}
86
+
87
+ {}.tap do |h|
88
+ options_array.each_with_index do |label, index|
89
+ h[label] = raw_value[index.to_s] == "on"
90
+ end
91
+
92
+ if raw_value['other_checkbox'] == 'on'
93
+ entry.get_responses["#{self.id}_other"] = true
94
+ h['Other'] = raw_value['other']
95
+ end
96
+
97
+ if h.find { |_, v| v }.present?
98
+ entry.get_responses["#{self.id}_present"] = true
99
+ else
100
+ entry.get_responses.delete("#{self.id}_present")
101
+ end
102
+ end
103
+ end
104
+
67
105
  end
68
106
  end
@@ -5,13 +5,14 @@ module Formbuilder
5
5
  @serialized = true
6
6
  @sort_as_numeric = true
7
7
  @field_type = 'date'
8
+ @search_type = 'date'
8
9
  }
9
10
 
10
11
  def render_input(value, opts = {})
11
12
  """
12
13
  <div class='input-line'>
13
14
  <span class='month'>
14
- <input type='text' name='response_fields[#{self[:id]}][month]' value='#{value['month']}' maxlength='2' />
15
+ <input type='text' name='response_fields[#{self[:id]}][month]' value='#{value['month']}' id='response_fields_#{self[:id]}' maxlength='2' />
15
16
  <label>MM</label>
16
17
  </span>
17
18
 
@@ -42,5 +43,10 @@ module Formbuilder
42
43
  end
43
44
  end
44
45
 
46
+ def sortable_value(value)
47
+ ['year', 'month', 'day'].each { |x| return 0 unless value[x].try(:present?) }
48
+ DateTime.new(value['year'].to_i, value['month'].to_i, value['day'].to_i).to_i rescue 0
49
+ end
50
+
45
51
  end
46
52
  end
@@ -4,6 +4,7 @@ module Formbuilder
4
4
  after_initialize -> {
5
5
  @options_field = true
6
6
  @field_type = 'dropdown'
7
+ @search_type = 'one_option'
7
8
  }
8
9
 
9
10
  def render_input(value, opts = {})
@@ -16,7 +17,7 @@ module Formbuilder
16
17
  end
17
18
 
18
19
  """
19
- <select name='response_fields[#{self[:id]}]'>
20
+ <select name='response_fields[#{self[:id]}]' id='response_fields_#{self[:id]}'>
20
21
  #{options}
21
22
  </select>
22
23
  """
@@ -5,17 +5,29 @@ module Formbuilder
5
5
 
6
6
  after_initialize -> {
7
7
  @field_type = 'email'
8
+ @search_type = 'text'
8
9
  }
9
10
 
10
11
  def render_input(value, opts = {})
11
- tag(:input, type: 'text', name: "response_fields[#{self.id}]", class: "rf-size-#{self[:field_options]['size']}",
12
- data: self.length_validations, value: value)
12
+ tag(
13
+ :input,
14
+ type: 'text',
15
+ name: "response_fields[#{self.id}]",
16
+ id: "response_fields_#{self[:id]}",
17
+ class: "rf-size-#{self[:field_options]['size']}",
18
+ data: self.length_validations,
19
+ value: value
20
+ )
13
21
  end
14
22
 
15
23
  def render_entry(value, opts = {})
16
24
  "<a href='mailto:#{value}'>#{value}</a>"
17
25
  end
18
26
 
27
+ def render_entry_text(value, opts = {})
28
+ value
29
+ end
30
+
19
31
  def validate_response(value)
20
32
  unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
21
33
  "isn't a valid email address."
@@ -1,43 +1,98 @@
1
1
  module Formbuilder
2
2
  class ResponseFieldFile < ResponseField
3
3
 
4
+ # Notes:
5
+ # I'm modifying this class to accept multiple attachments,
6
+ # even though the frontend will only accept one (for now).
7
+
4
8
  after_initialize -> {
5
9
  @field_type = 'file'
10
+ @search_type = 'file'
6
11
  }
7
12
 
8
- # @todo dropzone?
9
- def render_input(value, opts = {})
10
- attachment = value && EntryAttachment.find(value)
13
+ def get_attachments(value)
14
+ if value.blank?
15
+ []
16
+ else
17
+ EntryAttachment.where('id IN (?)', value.split(','))
18
+ end
19
+ end
11
20
 
21
+ def render_input(value, opts = {})
12
22
  """
13
- <span class='existing-filename'>#{attachment.try(:upload).try(:file).try(:filename).try(:gsub, /\?.*$/, '')}</span>
14
- <input type='file' name='response_fields[#{self[:id]}]' />
23
+ <span class='existing-filename'>#{get_attachments(value).first.try(:upload).try(:raw_filename)}</span>
24
+ <input type='file' name='response_fields[#{self[:id]}][]' id='response_fields_#{self[:id]}' />
15
25
  """
16
26
  end
17
27
 
18
28
  def render_entry(value, opts = {})
19
- attachment = value && EntryAttachment.where(id: value).first
29
+ return_str = ""
20
30
 
21
- return unless attachment
31
+ return_str << get_attachments(value).map do |attachment|
32
+ String.new.tap do |str|
33
+ str << """
34
+ <a href='#{attachment.upload.url}' target='_blank'>
35
+ """
22
36
 
23
- str = ""
37
+ if attachment.upload.send(:active_versions).include?(:thumb)
38
+ str << """
39
+ <img src='#{attachment.upload.thumb.url}' /><br />
40
+ """
41
+ end
24
42
 
25
- str += """
26
- <a href='#{attachment.upload.url}' target='_blank'>
27
- """
43
+ str << """
44
+ #{attachment.upload.try(:raw_filename)}
45
+ </a>
46
+ """
47
+ end
48
+ end.join('<br /><br />').squish
28
49
 
29
- if attachment.upload.send(:active_versions).include?(:thumb)
30
- str += """
31
- <img src='#{attachment.upload.thumb.url}' /><br />
32
- """
50
+ return_str
51
+ end
52
+
53
+ def render_entry_text(value, opts = {})
54
+ get_attachments(value).map { |attachment|
55
+ attachment.upload.url
56
+ }.join(', ')
57
+ end
58
+
59
+ def audit_response(value, all_responses)
60
+ return unless value
61
+ all_responses["#{self.id}_filename"] = get_attachments(value).try(:first).try(:upload).try(:raw_filename)
62
+ end
63
+
64
+ def sortable_value(value)
65
+ value.present? ? 1 : 0
66
+ end
67
+
68
+ def before_response_destroyed(entry)
69
+ remove_entry_attachments(entry.get_responses[self.id.to_s])
70
+ end
71
+
72
+ def transform_raw_value(raw_value, entry, opts = {})
73
+ raw_value = [raw_value] unless raw_value.is_a?(Array)
74
+ raw_value = raw_value.reject { |x| x.blank? }
75
+
76
+ # if the file is already uploaded and we're not uploading another, be sure to keep it
77
+ # @todo currently no way of removing a file
78
+ if raw_value.empty?
79
+ entry.responses_column_was.try(:[], self.id.to_s)
80
+ else
81
+ remove_entry_attachments(entry.get_responses.try(:[], self.id.to_s)) # remove old attachments
82
+ remove_entry_attachments(entry.responses_column_was.try(:[], self.id.to_s)) # remove old attachments
83
+
84
+ raw_value.map do |file|
85
+ EntryAttachment.create(upload: file).id
86
+ end.join(',')
33
87
  end
88
+ end
34
89
 
35
- str +="""
36
- #{attachment.upload.try(:file).try(:filename).try(:gsub, /\?.*$/, '')}
37
- </a>
38
- """
90
+ def remove_entry_attachments(entry_attachment_ids)
91
+ return unless entry_attachment_ids.present?
39
92
 
40
- str
93
+ entry_attachment_ids.to_s.split(',').each do |x|
94
+ EntryAttachment.find_by(id: x).try(:destroy)
95
+ end
41
96
  end
42
97
 
43
98
  end
@@ -6,11 +6,18 @@ module Formbuilder
6
6
  after_initialize -> {
7
7
  @sort_as_numeric = true
8
8
  @field_type = 'number'
9
+ @search_type = 'number'
9
10
  }
10
11
 
11
12
  def render_input(value, opts = {})
12
- str = tag(:input, type: 'text', name: "response_fields[#{self.id}]",
13
- class: "rf-size-#{self[:field_options]['size']}", value: value)
13
+ str = tag(
14
+ :input,
15
+ type: 'text',
16
+ name: "response_fields[#{self.id}]",
17
+ id: "response_fields_#{self.id}",
18
+ class: "rf-size-#{self[:field_options]['size']}",
19
+ value: value
20
+ )
14
21
 
15
22
  if (units = self[:field_options]['units'].presence)
16
23
  str += "<span class='units'>#{units}</span>".html_safe
@@ -0,0 +1,13 @@
1
+ module Formbuilder
2
+ class ResponseFieldPageBreak < ResponseField
3
+
4
+ after_initialize -> {
5
+ @input_field = false
6
+ @field_type = 'page_break'
7
+ }
8
+
9
+ def render_input(value, opts = {})
10
+ end
11
+
12
+ end
13
+ end
@@ -1,3 +1,5 @@
1
+ require 'rinku'
2
+
1
3
  module Formbuilder
2
4
  class ResponseFieldParagraph < ResponseField
3
5
 
@@ -6,15 +8,29 @@ module Formbuilder
6
8
 
7
9
  after_initialize -> {
8
10
  @field_type = 'paragraph'
11
+ @search_type = 'text'
9
12
  }
10
13
 
11
14
  def render_input(value, opts = {})
12
- content_tag(:textarea, name: "response_fields[#{self.id}]", class: "rf-size-#{self[:field_options]['size']}",
13
- data: self.length_validations) { value }
15
+ content_tag(
16
+ :textarea,
17
+ name: "response_fields[#{self.id}]",
18
+ id: "response_fields_#{self.id}",
19
+ class: "rf-size-#{self[:field_options]['size']}",
20
+ data: self.length_validations
21
+ ) { value }
14
22
  end
15
23
 
16
24
  def render_entry(value, opts = {})
17
- ActionController::Base.helpers.simple_format(value)
25
+ if value.present?
26
+ ActionController::Base.helpers.simple_format(Rinku.auto_link(value))
27
+ else
28
+ ''
29
+ end
30
+ end
31
+
32
+ def render_entry_text(value, opts = {})
33
+ value
18
34
  end
19
35
 
20
36
  end