dynamic_fieldsets 0.0.16 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/.rdebugrc +3 -0
  2. data/.rspec +1 -0
  3. data/CHANGELOG +7 -0
  4. data/Gemfile +17 -8
  5. data/Gemfile.lock +77 -60
  6. data/README.rdoc +1 -1
  7. data/VERSION +1 -1
  8. data/app/controllers/dynamic_fieldsets/fields_controller.rb +5 -4
  9. data/app/helpers/dynamic_fieldsets_helper.rb +48 -131
  10. data/app/models/dynamic_fieldsets.rb +2 -0
  11. data/app/models/dynamic_fieldsets/checkbox_field.rb +29 -0
  12. data/app/models/dynamic_fieldsets/date_field.rb +37 -0
  13. data/app/models/dynamic_fieldsets/datetime_field.rb +36 -0
  14. data/app/models/dynamic_fieldsets/dependency.rb +1 -1
  15. data/app/models/dynamic_fieldsets/dependency_clause.rb +1 -1
  16. data/app/models/dynamic_fieldsets/dependency_group.rb +1 -1
  17. data/app/models/dynamic_fieldsets/field.rb +170 -42
  18. data/app/models/dynamic_fieldsets/field_default.rb +3 -3
  19. data/app/models/dynamic_fieldsets/field_html_attribute.rb +1 -1
  20. data/app/models/dynamic_fieldsets/field_option.rb +1 -1
  21. data/app/models/dynamic_fieldsets/field_record.rb +1 -1
  22. data/app/models/dynamic_fieldsets/fieldset.rb +36 -1
  23. data/app/models/dynamic_fieldsets/fieldset_associator.rb +9 -34
  24. data/app/models/dynamic_fieldsets/fieldset_child.rb +43 -24
  25. data/app/models/dynamic_fieldsets/instruction_field.rb +35 -0
  26. data/app/models/dynamic_fieldsets/multiple_select_field.rb +43 -0
  27. data/app/models/dynamic_fieldsets/radio_field.rb +27 -0
  28. data/app/models/dynamic_fieldsets/select_field.rb +16 -0
  29. data/app/models/dynamic_fieldsets/text_field.rb +14 -0
  30. data/app/models/dynamic_fieldsets/textarea_field.rb +40 -0
  31. data/app/views/dynamic_fieldsets/fields/_form.html.erb +50 -52
  32. data/app/views/dynamic_fieldsets/fields/edit.html.erb +5 -2
  33. data/app/views/dynamic_fieldsets/fields/index.html.erb +1 -1
  34. data/app/views/dynamic_fieldsets/fields/new.html.erb +3 -1
  35. data/app/views/dynamic_fieldsets/fields/show.html.erb +1 -1
  36. data/app/views/dynamic_fieldsets/fieldsets/_child.html.erb +1 -1
  37. data/app/views/dynamic_fieldsets/form_partials/_checkbox_field.html.erb +8 -0
  38. data/app/views/dynamic_fieldsets/form_partials/_date_field.html.erb +1 -0
  39. data/app/views/dynamic_fieldsets/form_partials/_datetime_field.html.erb +1 -0
  40. data/app/views/dynamic_fieldsets/form_partials/_input_footer.html.erb +1 -0
  41. data/app/views/dynamic_fieldsets/form_partials/_input_header.html.erb +7 -0
  42. data/app/views/dynamic_fieldsets/form_partials/_instruction_field.html.erb +1 -0
  43. data/app/views/dynamic_fieldsets/form_partials/_multiple_select_field.html.erb +1 -0
  44. data/app/views/dynamic_fieldsets/form_partials/_radio_field.html.erb +8 -0
  45. data/app/views/dynamic_fieldsets/form_partials/_select_field.html.erb +1 -0
  46. data/app/views/dynamic_fieldsets/form_partials/_text_field.html.erb +1 -0
  47. data/app/views/dynamic_fieldsets/form_partials/_textarea_field.html.erb +1 -0
  48. data/app/views/dynamic_fieldsets/shared/_javascript_watcher.html.erb +8 -8
  49. data/app/views/dynamic_fieldsets/show_partials/_show_incomplete.html.erb +1 -0
  50. data/app/views/dynamic_fieldsets/show_partials/_show_incomplete_footer.html.erb +2 -0
  51. data/app/views/dynamic_fieldsets/show_partials/_show_incomplete_header.html.erb +1 -0
  52. data/app/views/dynamic_fieldsets/show_partials/_show_instruction.html.erb +1 -0
  53. data/app/views/dynamic_fieldsets/show_partials/_show_multiple_answers.html.erb +13 -0
  54. data/app/views/dynamic_fieldsets/show_partials/_show_single_answer.html.erb +8 -0
  55. data/autotest/discover.rb +2 -0
  56. data/dynamic_fieldsets.gemspec +74 -20
  57. data/lib/dynamic_fieldsets/config.rb +45 -0
  58. data/lib/dynamic_fieldsets/dynamic_fieldsets_in_model.rb +38 -63
  59. data/lib/dynamic_fieldsets/field_with_field_options.rb +58 -0
  60. data/lib/dynamic_fieldsets/field_with_multiple_answers.rb +89 -0
  61. data/lib/dynamic_fieldsets/field_with_single_answer.rb +84 -0
  62. data/lib/dynamic_fieldsets/railtie.rb +6 -1
  63. data/lib/generators/dynamic_fieldsets/install_generator.rb +3 -3
  64. data/lib/generators/dynamic_fieldsets/templates/config.rb +15 -0
  65. data/lib/generators/dynamic_fieldsets/templates/migrations/install_migration.rb +1 -1
  66. data/spec/dummy/config/initializers/dynamic_fieldsets.rb +15 -0
  67. data/spec/dummy/db/migrate/20120213211033_create_dynamic_fieldsets_tables.rb +1 -1
  68. data/spec/dummy/db/schema.rb +1 -1
  69. data/spec/dummy/features/step_definitions/field_steps.rb +4 -4
  70. data/spec/dummy/features/step_definitions/fieldset_children_steps.rb +2 -2
  71. data/spec/dummy/features/step_definitions/javascript_steps.rb +7 -7
  72. data/spec/dynamic_fieldsets_helper_spec.rb +278 -312
  73. data/spec/dynamic_fieldsets_in_model_spec.rb +2 -2
  74. data/spec/field_with_field_options_spec.rb +49 -0
  75. data/spec/field_with_multiple_answers_spec.rb +50 -0
  76. data/spec/field_with_single_answer_spec.rb +51 -0
  77. data/spec/models/checkbox_field_spec.rb +19 -0
  78. data/spec/models/date_field_spec.rb +24 -0
  79. data/spec/models/datetime_field_spec.rb +24 -0
  80. data/spec/models/dependency_clause_spec.rb +7 -8
  81. data/spec/models/dependency_group_spec.rb +27 -30
  82. data/spec/models/dependency_spec.rb +8 -9
  83. data/spec/models/field_default_spec.rb +19 -14
  84. data/spec/models/field_html_attribute_spec.rb +3 -4
  85. data/spec/models/field_option_spec.rb +8 -9
  86. data/spec/models/field_record_spec.rb +8 -9
  87. data/spec/models/field_spec.rb +195 -94
  88. data/spec/models/fieldset_associator_spec.rb +39 -41
  89. data/spec/models/fieldset_child_spec.rb +99 -47
  90. data/spec/models/fieldset_spec.rb +25 -29
  91. data/spec/models/instruction_field_spec.rb +38 -0
  92. data/spec/models/multiple_select_field_spec.rb +31 -0
  93. data/spec/models/radio_field_spec.rb +21 -0
  94. data/spec/models/text_field_spec.rb +19 -0
  95. data/spec/models/textarea_field_spec.rb +39 -0
  96. data/spec/support/field_helper.rb +1 -1
  97. metadata +106 -28
@@ -0,0 +1,3 @@
1
+ set autolist
2
+ set autoeval
3
+ set autoreload
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ == 0.1.0
2
+
3
+ * Major change to the structure of the code. Fields now use single table inheritance to determine different functionality
4
+ * Added views for each field
5
+ * Added a config file and generator
6
+ * Broke a huge number of tests, pended them, then didn't have enough time to rewrite them
7
+
1
8
  == 0.0.16
2
9
 
3
10
  * Updated the migration generator with indices.
data/Gemfile CHANGED
@@ -1,22 +1,31 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem "rails", ">=3.0.7"
3
+ gem "rails", "~> 3.0.7"
4
4
 
5
- group :development do
5
+ group :development, :test do
6
6
  gem "capybara", ">= 0.4.0"
7
7
  gem "sqlite3"
8
8
  gem 'ruby-debug19'
9
+ gem "bundler", "~> 1.0.0"
10
+ gem "jeweler", "~> 1.6.3"
11
+ gem "json"
12
+
13
+ # rspec
9
14
  gem "rspec", "~> 2.6.0"
10
15
  gem "rspec-rails", "~>2.6.1"
11
- gem "yard", "~> 0.6.0"
16
+ gem "shoulda", "~> 3.0.0"
17
+ gem "ruby_parser", "~> 2.3.1" # outputs parsetrees
18
+ gem "ZenTest"
19
+ gem "autotest-rails"
20
+
21
+ # cucumber
12
22
  gem "cucumber", ">= 0"
13
23
  gem "cucumber-rails"
14
24
  gem "database_cleaner"
15
- gem "bundler", "~> 1.0.0"
16
- gem "jeweler", "~> 1.6.3"
17
- gem "rcov", ">= 0"
18
- gem "json"
19
25
 
20
- # hudson ci
26
+ # documentation
27
+ gem "yard", "~> 0.6.0"
28
+
29
+ # jenkins/hudson ci
21
30
  gem "ci_reporter"
22
31
  end
@@ -1,13 +1,14 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ ZenTest (4.6.2)
4
5
  abstract (1.0.0)
5
- actionmailer (3.0.7)
6
- actionpack (= 3.0.7)
7
- mail (~> 2.2.15)
8
- actionpack (3.0.7)
9
- activemodel (= 3.0.7)
10
- activesupport (= 3.0.7)
6
+ actionmailer (3.0.11)
7
+ actionpack (= 3.0.11)
8
+ mail (~> 2.2.19)
9
+ actionpack (3.0.11)
10
+ activemodel (= 3.0.11)
11
+ activesupport (= 3.0.11)
11
12
  builder (~> 2.1.2)
12
13
  erubis (~> 2.6.6)
13
14
  i18n (~> 0.5.0)
@@ -15,50 +16,52 @@ GEM
15
16
  rack-mount (~> 0.6.14)
16
17
  rack-test (~> 0.5.7)
17
18
  tzinfo (~> 0.3.23)
18
- activemodel (3.0.7)
19
- activesupport (= 3.0.7)
19
+ activemodel (3.0.11)
20
+ activesupport (= 3.0.11)
20
21
  builder (~> 2.1.2)
21
22
  i18n (~> 0.5.0)
22
- activerecord (3.0.7)
23
- activemodel (= 3.0.7)
24
- activesupport (= 3.0.7)
25
- arel (~> 2.0.2)
23
+ activerecord (3.0.11)
24
+ activemodel (= 3.0.11)
25
+ activesupport (= 3.0.11)
26
+ arel (~> 2.0.10)
26
27
  tzinfo (~> 0.3.23)
27
- activeresource (3.0.7)
28
- activemodel (= 3.0.7)
29
- activesupport (= 3.0.7)
30
- activesupport (3.0.7)
28
+ activeresource (3.0.11)
29
+ activemodel (= 3.0.11)
30
+ activesupport (= 3.0.11)
31
+ activesupport (3.0.11)
31
32
  archive-tar-minitar (0.5.2)
32
33
  arel (2.0.10)
34
+ autotest-rails (4.1.2)
35
+ ZenTest (~> 4.5)
33
36
  builder (2.1.2)
34
- capybara (1.0.0)
37
+ capybara (1.1.2)
35
38
  mime-types (>= 1.16)
36
39
  nokogiri (>= 1.3.3)
37
40
  rack (>= 1.0.0)
38
41
  rack-test (>= 0.5.4)
39
- selenium-webdriver (~> 0.2.0)
42
+ selenium-webdriver (~> 2.0)
40
43
  xpath (~> 0.1.4)
41
- childprocess (0.1.9)
44
+ childprocess (0.3.1)
42
45
  ffi (~> 1.0.6)
43
- ci_reporter (1.6.5)
46
+ ci_reporter (1.7.0)
44
47
  builder (>= 2.1.2)
45
- columnize (0.3.4)
46
- cucumber (1.0.1)
48
+ columnize (0.3.6)
49
+ cucumber (1.1.9)
47
50
  builder (>= 2.1.2)
48
51
  diff-lcs (>= 1.1.2)
49
- gherkin (~> 2.4.5)
52
+ gherkin (~> 2.9.0)
50
53
  json (>= 1.4.6)
51
- term-ansicolor (>= 1.0.5)
52
- cucumber-rails (1.0.2)
53
- capybara (>= 1.0.0)
54
- cucumber (~> 1.0.0)
55
- nokogiri (>= 1.4.6)
56
- database_cleaner (0.6.7)
57
- diff-lcs (1.1.2)
54
+ term-ansicolor (>= 1.0.6)
55
+ cucumber-rails (1.3.0)
56
+ capybara (>= 1.1.2)
57
+ cucumber (>= 1.1.8)
58
+ nokogiri (>= 1.5.0)
59
+ database_cleaner (0.7.1)
60
+ diff-lcs (1.1.3)
58
61
  erubis (2.6.6)
59
62
  abstract (>= 1.0.0)
60
- ffi (1.0.9)
61
- gherkin (2.4.5)
63
+ ffi (1.0.11)
64
+ gherkin (2.9.0)
62
65
  json (>= 1.4.6)
63
66
  git (1.2.5)
64
67
  i18n (0.5.0)
@@ -66,8 +69,7 @@ GEM
66
69
  bundler (~> 1.0)
67
70
  git (>= 1.2.5)
68
71
  rake
69
- json (1.5.3)
70
- json_pure (1.5.3)
72
+ json (1.6.5)
71
73
  linecache19 (0.5.12)
72
74
  ruby_core_source (>= 0.1.4)
73
75
  mail (2.2.19)
@@ -75,29 +77,32 @@ GEM
75
77
  i18n (>= 0.4.0)
76
78
  mime-types (~> 1.16)
77
79
  treetop (~> 1.4.8)
78
- mime-types (1.16)
80
+ mime-types (1.17.2)
81
+ multi_json (1.0.4)
79
82
  nokogiri (1.5.0)
80
- polyglot (0.3.1)
81
- rack (1.2.3)
83
+ polyglot (0.3.3)
84
+ rack (1.2.5)
82
85
  rack-mount (0.6.14)
83
86
  rack (>= 1.0.0)
84
87
  rack-test (0.5.7)
85
88
  rack (>= 1.0)
86
- rails (3.0.7)
87
- actionmailer (= 3.0.7)
88
- actionpack (= 3.0.7)
89
- activerecord (= 3.0.7)
90
- activeresource (= 3.0.7)
91
- activesupport (= 3.0.7)
89
+ rails (3.0.11)
90
+ actionmailer (= 3.0.11)
91
+ actionpack (= 3.0.11)
92
+ activerecord (= 3.0.11)
93
+ activeresource (= 3.0.11)
94
+ activesupport (= 3.0.11)
92
95
  bundler (~> 1.0)
93
- railties (= 3.0.7)
94
- railties (3.0.7)
95
- actionpack (= 3.0.7)
96
- activesupport (= 3.0.7)
96
+ railties (= 3.0.11)
97
+ railties (3.0.11)
98
+ actionpack (= 3.0.11)
99
+ activesupport (= 3.0.11)
97
100
  rake (>= 0.8.7)
101
+ rdoc (~> 3.4)
98
102
  thor (~> 0.14.4)
99
- rake (0.9.2)
100
- rcov (0.9.9)
103
+ rake (0.9.2.2)
104
+ rdoc (3.12)
105
+ json (~> 1.4)
101
106
  rspec (2.6.0)
102
107
  rspec-core (~> 2.6.0)
103
108
  rspec-expectations (~> 2.6.0)
@@ -121,18 +126,27 @@ GEM
121
126
  ruby-debug-base19 (>= 0.11.19)
122
127
  ruby_core_source (0.1.5)
123
128
  archive-tar-minitar (>= 0.5.2)
124
- rubyzip (0.9.4)
125
- selenium-webdriver (0.2.2)
126
- childprocess (>= 0.1.9)
127
- ffi (>= 1.0.7)
128
- json_pure
129
+ ruby_parser (2.3.1)
130
+ sexp_processor (~> 3.0)
131
+ rubyzip (0.9.6.1)
132
+ selenium-webdriver (2.19.0)
133
+ childprocess (>= 0.2.5)
134
+ ffi (~> 1.0.9)
135
+ multi_json (~> 1.0.4)
129
136
  rubyzip
130
- sqlite3 (1.3.3)
131
- term-ansicolor (1.0.5)
137
+ sexp_processor (3.0.10)
138
+ shoulda (3.0.0)
139
+ shoulda-context (~> 1.0.0)
140
+ shoulda-matchers (~> 1.0.0)
141
+ shoulda-context (1.0.0)
142
+ shoulda-matchers (1.0.0)
143
+ sqlite3 (1.3.5)
144
+ term-ansicolor (1.0.7)
132
145
  thor (0.14.6)
133
- treetop (1.4.9)
146
+ treetop (1.4.10)
147
+ polyglot
134
148
  polyglot (>= 0.3.1)
135
- tzinfo (0.3.29)
149
+ tzinfo (0.3.31)
136
150
  xpath (0.1.4)
137
151
  nokogiri (~> 1.3)
138
152
  yard (0.6.8)
@@ -141,6 +155,8 @@ PLATFORMS
141
155
  ruby
142
156
 
143
157
  DEPENDENCIES
158
+ ZenTest
159
+ autotest-rails
144
160
  bundler (~> 1.0.0)
145
161
  capybara (>= 0.4.0)
146
162
  ci_reporter
@@ -149,10 +165,11 @@ DEPENDENCIES
149
165
  database_cleaner
150
166
  jeweler (~> 1.6.3)
151
167
  json
152
- rails (>= 3.0.7)
153
- rcov
168
+ rails (~> 3.0.7)
154
169
  rspec (~> 2.6.0)
155
170
  rspec-rails (~> 2.6.1)
156
171
  ruby-debug19
172
+ ruby_parser (~> 2.3.1)
173
+ shoulda (~> 3.0.0)
157
174
  sqlite3
158
175
  yard (~> 0.6.0)
@@ -2,7 +2,7 @@
2
2
 
3
3
  User defined fieldsets for dynamic questions in forms.
4
4
 
5
- I recommend not using this until a 0.1 release.
5
+ I recommend not using this until a 1.0 release.
6
6
 
7
7
  = how to use
8
8
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.16
1
+ 0.1.0
@@ -55,9 +55,10 @@ module DynamicFieldsets
55
55
  # POST /dynamic_fieldsets/fields
56
56
  def create
57
57
  parent_id = params[:parent]
58
- @field = DynamicFieldsets::Field.new(params[:dynamic_fieldsets_field])
58
+ @field = params[:dynamic_fieldsets_field][:type].constantize.new(params[:dynamic_fieldsets_field])
59
59
 
60
60
  respond_to do |format|
61
+
61
62
  if @field.save
62
63
  if !parent_id.empty?
63
64
  parent = DynamicFieldsets::Fieldset.find_by_id(parent_id)
@@ -66,7 +67,7 @@ module DynamicFieldsets
66
67
  #relation.child = @field
67
68
  #relation.save
68
69
  end
69
- format.html { redirect_to(@field, :notice => 'Successfully created a new field.') }
70
+ format.html { redirect_to(dynamic_fieldsets_field_path(@field), :notice => 'Successfully created a new field.') }
70
71
  else
71
72
  format.html { render :action => "new" }
72
73
  end
@@ -75,11 +76,11 @@ module DynamicFieldsets
75
76
 
76
77
  # PUT /dynamic_fieldsets/fields/1
77
78
  def update
78
- @field = DynamicFieldsets::Field.find(params[:id])
79
+ @field = params[:dynamic_fieldsets_field][:type].constantize.find(params[:id])
79
80
 
80
81
  respond_to do |format|
81
82
  if @field.update_attributes(params[:dynamic_fieldsets_field])
82
- format.html { redirect_to(@field, :notice => 'Successfully updated a field.') }
83
+ format.html { redirect_to(dynamic_fieldsets_field_path(@field), :notice => 'Successfully updated a field.') }
83
84
  else
84
85
  format.html { render :action => "edit" }
85
86
  end
@@ -27,30 +27,24 @@ module DynamicFieldsetsHelper
27
27
  def field_show_renderer(fsa, fieldset_child, values = [])
28
28
  field = fieldset_child.child
29
29
  lines = []
30
- lines.push "<div class='dynamic_fieldsets field'>"
31
- lines.push "<span class='label'>#{field.label}</span>"
32
- lines.push "<span class='value'>"
33
- if values
34
- if field.field_type == "multiple_select" || field.field_type == "checkbox"
35
- values.each do |value|
36
- lines.push field.options.select { |opt| opt.id == value }.first.name + "<br />"
37
- end
38
- elsif field.field_type == "select" || field.field_type == "radio"
39
- lines.push field.options.select { |opt| opt.id == values }.first.name
40
- # this might be easier on the db
41
- # lines.push DynamicFieldsets::FieldOption.find(values).name
42
- else
43
- lines.push values
44
- end
45
- else
46
- lines.push "<em class='empty'>No answer given</em>"
30
+
31
+ if field.use_show_header_partial?
32
+ lines.push render(:partial => field.show_header_partial )
47
33
  end
48
- lines.push "</span>"
49
- lines.push "</div>"
34
+
35
+ args = {
36
+ :value => values,
37
+ :values => values
38
+ }
39
+ lines.push render(:partial => field.show_partial, :locals => field.show_partial_locals(args) )
40
+
41
+ if field.use_show_footer_partial?
42
+ lines.push render(:partial => field.show_footer_partial )
43
+ end
44
+
50
45
  return lines
51
46
  end
52
47
 
53
-
54
48
  # Builds HTML for the provided field for a form.
55
49
  # @param [FieldsetAssociator] fsa parent FieldsetAssociator
56
50
  # @param [FieldsetChild] fieldset_child The FieldsetChild to render
@@ -58,96 +52,34 @@ module DynamicFieldsetsHelper
58
52
  # @return [Array] The HTML elements for the field
59
53
  def field_form_renderer(fsa, fieldset_child, values = [])
60
54
  field = fieldset_child.child
61
- classes = "#{field.field_type} "
55
+ # maybe turn this into an instance method
56
+ classes = "#{field.type.gsub("DynamicFieldsets::", "").underscore.downcase} "
62
57
  classes += ( field.required ? 'required' : 'optional' )
63
58
 
64
- field_markup = ["<li class='#{classes}' id='input-field-#{field.id}-child-#{fieldset_child.id}'>"]
65
-
66
- if !field.field_type.eql?('instruction')
67
- field_markup.push "<label for='field-#{field.id}'>"
68
- field_markup.push "#{field.label}: "
69
- field_markup.push "<abbr title='required'>*</abbr>" if field.required?
70
- field_markup.push "</label>"
59
+ field_markup = []
60
+ if field.use_form_header_partial?
61
+ field_markup.push render(:partial => field.form_header_partial, :locals => {
62
+ :classes => classes,
63
+ :field => field,
64
+ :fieldset_child => fieldset_child
65
+ })
71
66
  end
72
-
73
- attrs = { :id => "field-#{field.id}-child-#{fieldset_child.id}" }
74
- field.field_html_attributes.each{ |a| attrs.merge! a.attribute_name.to_sym => a.value } if !field.field_html_attributes.empty?
75
-
76
- case field.field_type.to_sym
77
- when :select
78
- selected = populate(field,values).to_i # should return the ID of the saved or default option
79
- field_markup.push select_tag "fsa-#{fsa.id}[field-#{fieldset_child.id}]", options_from_collection_for_select( field.options, :id, :name, selected ), attrs
80
-
81
- when :multiple_select
82
- attrs.merge! multiple: true
83
- opts = populate( field, values )
84
- opts = [opts] if !opts.is_a? Array
85
- selected = opts.map( &:to_i ) if !opts.empty? # array of option IDs, saved > default
86
- field_markup.push select_tag "fsa-#{fsa.id}[field-#{fieldset_child.id}]", options_from_collection_for_select( field.options, :id, :name, selected ), attrs
87
-
88
- when :radio
89
- field_markup.push "<div id='field-#{field.id}-child-#{fieldset_child.id}'>"
90
- field.options.each do |option|
91
- attrs[:id] = "field-#{field.id}-#{option.name.parameterize}"
92
- these_attrs = attrs
93
- these_attrs = attrs.merge checked: true if populate(field,values).to_i.eql? option.id
94
- field_markup.push "<label for='#{these_attrs[:id]}'>"
95
- field_markup.push radio_button "fsa-#{fsa.id}", "field-#{fieldset_child.id}", option.id, these_attrs
96
- field_markup.push "#{option.name}"
97
- field_markup.push "</label>"
98
- end
99
- field_markup.push "</div>"
100
-
101
- when :checkbox
102
- field_markup.push "<div id='field-#{field.id}-child-#{fieldset_child.id}'>"
103
- attrs[:name] = "fsa-#{fsa.id}[field-#{fieldset_child.id}][]"
104
- opts = populate( field, values )
105
- checked = []
106
- checked = opts.map( &:to_i ) if !opts.empty? # array of option IDs, saved > default
107
- field.options.each do |option|
108
- attrs[:id] = "field-#{field.id}-#{option.name.underscore}"
109
- field_markup.push "<label for='#{attrs[:id]}'>"
110
- field_markup.push check_box_tag "#{attrs[:name]}", "#{option.id}", checked.include?(option.id), attrs
111
- field_markup.push "#{option.name}"
112
- field_markup.push "</label>"
113
- end
114
- field_markup.push "</div>"
115
-
116
- when :textfield
117
- attrs.merge!( {:value => populate( field, values )} )
118
- field_markup.push text_field "fsa-#{fsa.id}", "field-#{fieldset_child.id}", attrs
119
67
 
120
- when :textarea
121
- attrs.merge! cols: '40' if !attrs.include? :cols
122
- attrs.merge! rows: '6' if !attrs.include? :rows
123
- attrs.merge! name: "fsa-#{fsa.id}[field-#{fieldset_child.id}]"
124
- tag = "<textarea"
125
- attrs.each{ |att,val| tag += " #{att}=\"#{val}\"" }
126
- tag += ">"
127
- tag += populate( field, values )
128
- tag += "</textarea>"
129
- field_markup.push tag
130
-
131
- when :date
132
- date_options = { start_year: Time.now.year - 70 }
133
- setdate = populate( field, values ) # date string if saved or default
134
- date_options.merge! default: Time.parse( setdate ) if !setdate.empty?
135
- # attrs.reject!{ |k| k.eql? :id }
136
- field_markup.push date_select "fsa-#{fsa.id}", "field-#{fieldset_child.id}", date_options, attrs
137
-
138
- when :datetime
139
- date_options = { start_year: Time.now.year - 70 }
140
- setdate = populate( field, values ) # datetime string if saved or default
141
- date_options.merge! default: Time.parse( setdate ) if !setdate.empty?
142
- # attrs.reject!{ |k| k.eql? :id }
143
- field_markup.push datetime_select "fsa-#{fsa.id}", "field-#{fieldset_child.id}", date_options, attrs
144
-
145
- when :instruction
146
- field_markup.push "<p>#{field.label}</p>"
147
-
148
- end # case field.field_type
68
+ attrs = field.html_attribute_hash
149
69
 
150
- field_markup.push "</li>"
70
+ attributes = {
71
+ :fsa => fsa,
72
+ :fieldset_child => fieldset_child,
73
+ :values => values,
74
+ :value => values
75
+ }
76
+
77
+ field_markup.push render(:partial => field.form_partial, :locals => field.form_partial_locals(attributes))
78
+
79
+ if field.use_form_footer_partial?
80
+ field_markup.push render(:partial => field.form_footer_partial)
81
+ end
82
+
151
83
  return field_markup
152
84
  end
153
85
 
@@ -160,14 +92,18 @@ module DynamicFieldsetsHelper
160
92
  lines = ["<div id='fieldset-#{fieldset.id}' class='inputs'>"]
161
93
  lines.push "<h3 class='name'>#{fieldset.name}</h3>"
162
94
  lines.push "<ol>"
95
+
96
+ # this returns field/fieldset objects rather than fieldset children
97
+ # that is why this code looks like it is accessing odd objects
163
98
  fieldset.children.each do |child|
164
- if child.is_a? DynamicFieldsets::Field then
165
- fieldset_child = DynamicFieldsets::FieldsetChild.where( :child_id => child.id, :fieldset_id => fieldset.id, :child_type => child.class.name ).first
166
- lines += field_renderer( fsa, fieldset_child, values[fieldset_child.id], form_type )
167
- else # child.is_a? Fieldset
99
+ if child.is_a? DynamicFieldsets::Fieldset
168
100
  lines += fieldset_renderer( fsa, child, values, form_type )
101
+ else # one of many possible types of child
102
+ fieldset_child = DynamicFieldsets::FieldsetChild.where( :child_id => child.id, :fieldset_id => fieldset.id, :child_type => "DynamicFieldsets::Field" ).first
103
+ lines += field_renderer( fsa, fieldset_child, values[fieldset_child.id], form_type )
169
104
  end
170
105
  end
106
+
171
107
  lines.push "</ol>"
172
108
  lines.push "</div>"
173
109
 
@@ -192,9 +128,9 @@ module DynamicFieldsetsHelper
192
128
  # @param [FieldsetAssociator] The fieldset associator for the dynamic fieldset to render
193
129
  # @return [String] The HTML for the entire dynamic fieldset
194
130
  def dynamic_fieldset_renderer(fsa, form_type)
195
- rendered_dynamic_fieldset = "<div id='fsa-#{fsa.id}'>\n"
196
- rendered_dynamic_fieldset += "<input type='hidden' name='fsa-#{fsa.id}[fieldset_id]' value='#{fsa.fieldset_id}' />\n"
197
- rendered_dynamic_fieldset += "<input type='hidden' name='fsa-#{fsa.id}[fieldset_model_name]' value='#{fsa.fieldset_model_name}' />\n"
131
+ rendered_dynamic_fieldset = "<div id='#{DynamicFieldsets.config.form_fieldset_associator_prefix}#{fsa.id}'>\n"
132
+ rendered_dynamic_fieldset += "<input type='hidden' name='#{DynamicFieldsets.config.form_fieldset_associator_prefix}#{fsa.id}[fieldset_id]' value='#{fsa.fieldset_id}' />\n"
133
+ rendered_dynamic_fieldset += "<input type='hidden' name='#{DynamicFieldsets.config.form_fieldset_associator_prefix}#{fsa.id}[fieldset_model_name]' value='#{fsa.fieldset_model_name}' />\n"
198
134
  fieldset_renderer( fsa, fsa.fieldset, fsa.field_values, form_type ).each do |line|
199
135
  rendered_dynamic_fieldset += line + "\n"
200
136
  end
@@ -202,25 +138,6 @@ module DynamicFieldsetsHelper
202
138
 
203
139
  return rendered_dynamic_fieldset.html_safe
204
140
  end
205
-
206
- # Gives precedence to saved values; returns default values if empty
207
- # @param [Field] field Field to populate
208
- # @param [String] value Possibly saved values
209
- # @return The saved or default value(s)
210
- # I know this is messy; this is what happens when we are past deadline.
211
- def populate(field, value)
212
- if value.nil? || (value.is_a?(Array) && value.empty?)
213
- if field.field_defaults.length == 0
214
- return ""
215
- elsif field.field_defaults.length > 1
216
- return field.field_defaults.collect{ |d| d[:value] }
217
- else
218
- return field.field_defaults.first.value
219
- end
220
- else
221
- return value
222
- end
223
- end
224
141
 
225
142
  # Method that returns the javascript in string format to be pushed on with the rest of the
226
143
  # generated form