dynamic_fieldsets 0.0.16 → 0.1.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.
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
@@ -1,6 +1,9 @@
1
1
  <h1>Editing field</h1>
2
2
 
3
- <%= render 'form' %>
3
+ <%= form_for(@field, :as => :dynamic_fieldsets_field, :url => dynamic_fieldsets_field_path, :method => :put) do |f| %>
4
+ <%= render :partial => 'form', :locals => { :f => f } %>
5
+ <% end %>
4
6
 
5
- <%= link_to 'Show', @field %> |
7
+
8
+ <%= link_to 'Show', dynamic_fieldsets_field_path(@field) %> |
6
9
  <%= link_to 'Back', dynamic_fieldsets_fields_path %>
@@ -12,7 +12,7 @@
12
12
  <% @fields.each do |field| %>
13
13
  <tr>
14
14
  <td><%= field.name %></td>
15
- <td><%= field.field_type %></td>
15
+ <td><%= field.type %></td>
16
16
  <td><%= link_to 'Show', dynamic_fieldsets_field_path(field) %></td>
17
17
  <td><%= link_to 'Edit', edit_dynamic_fieldsets_field_path(field) %></td>
18
18
  <td><%= render :partial => "disable_field_form", :locals => { :field => field } %></td>
@@ -1,6 +1,8 @@
1
1
  <h1>New field</h1>
2
2
 
3
- <%= render 'form' %>
3
+ <%= form_for(@field) do |f| %>
4
+ <%= render :partial => 'form', :locals => { :f => f } %>
5
+ <% end %>
4
6
 
5
7
  <% if params[:parent].nil? %>
6
8
  <%= link_to 'Back', dynamic_fieldsets_fields_path %>
@@ -10,7 +10,7 @@
10
10
 
11
11
  <p>
12
12
  <b>Type:</b>
13
- <%= @field.field_type %>
13
+ <%= @field.type %>
14
14
  </p>
15
15
 
16
16
  <% if @field.field_options.length > 0 %>
@@ -27,7 +27,7 @@
27
27
  <% fieldset_child = DynamicFieldsets::FieldsetChild.where( fieldset_id: fieldset.id, child_id: child.id, child_type: "DynamicFieldsets::Field" ).first %>
28
28
  <li id="child-<%= fieldset_child.id %>" class="field<%= ' required' if child.required? %>">
29
29
  <div>
30
- <span class="fieldtype"><%= child.field_type %>:</span>
30
+ <span class="fieldtype"><%= child.type %>:</span>
31
31
  <span class="name"><%= child.label %></span>
32
32
  <span class="admin">
33
33
  <span class="show"><%= link_to 'Show', dynamic_fieldsets_field_path(child) %></span>
@@ -0,0 +1,8 @@
1
+ <div id='<%= id %>' name='<%= name %>'>
2
+ <% options.each do |option| %>
3
+ <label for='<%= option[:name] %>'>
4
+ <%= check_box_tag(option[:name], option[:value], option[:checked], option[:html_attributes]) %>
5
+ <%= option[:label] %>
6
+ </label>
7
+ <% end %>
8
+ </div>
@@ -0,0 +1 @@
1
+ <%= date_select(object, method, date_options, attrs) %>
@@ -0,0 +1 @@
1
+ <%= datetime_select(object, method, date_options, attrs) %>
@@ -0,0 +1,7 @@
1
+ <li class='<%= classes %>' id='input-<%= DynamicFieldsets.config.form_field_prefix %><%= field.id %>-child-<%= fieldset_child.id %>'>
2
+ <label for ='<%=DynamicFieldsets.config.form_field_prefix %><%= field.id %>'>
3
+ <%= field.label %>
4
+ <% if field.required? %>
5
+ <abbr title='required'>*</abbr>
6
+ <% end %>
7
+ </label>
@@ -0,0 +1 @@
1
+ <%= select_tag(name, options_from_collection_for_select( collection, :id, :name, selected_ids ), attrs) %>
@@ -0,0 +1,8 @@
1
+ <div id='<%= name %>'>
2
+ <% options.each do |option| %>
3
+ <label for='<%= option[:name] %>'>
4
+ <%= radio_button_tag(option[:name], option[:value], option[:checked], option[:html_attributes]) %>
5
+ <%= option[:label] %>
6
+ </label>
7
+ <% end %>
8
+ </div>
@@ -0,0 +1 @@
1
+ <%= select_tag(name, options_from_collection_for_select( collection, :id, :name, selected_id ), attrs) %>
@@ -0,0 +1 @@
1
+ <%= text_field object, method, attrs %>
@@ -0,0 +1 @@
1
+ <%= text_area_tag(name, content, attrs) %>
@@ -13,8 +13,8 @@ var allInputs = $(":input:not(:hidden)");
13
13
 
14
14
  ***************************************************************************/
15
15
 
16
- function grab_fsc_id(field, field_type) {
17
- switch(field_type)
16
+ function grab_fsc_id(field, type) {
17
+ switch(type)
18
18
  {
19
19
  case 'text':
20
20
  var id_array = field.attr('id').split('-');
@@ -114,8 +114,8 @@ function group_action(success_flag, action, group_field) {
114
114
  }
115
115
  };
116
116
 
117
- function grab_value(field, field_type) {
118
- switch(field_type)
117
+ function grab_value(field, type) {
118
+ switch(type)
119
119
  {
120
120
  case 'text':
121
121
  return field.attr('value').toLowerCase();
@@ -204,15 +204,15 @@ function getIntersect(arr1, arr2) {
204
204
 
205
205
  allInputs.change( function() {
206
206
  var field = $(this);
207
- var field_type = grab_type(field);
208
- var fieldset_child_id = grab_fsc_id(field, field_type);
209
- var entered_value = grab_value(field, field_type)
207
+ var type = grab_type(field);
208
+ var fieldset_child_id = grab_fsc_id(field, type);
209
+ var entered_value = grab_value(field, type)
210
210
  if (fieldset_child_id in json_holder) {
211
211
  for (var group in json_holder[fieldset_child_id]) {
212
212
  var action = json_holder[fieldset_child_id][group]['action'];
213
213
  var group_fsc_id = json_holder[fieldset_child_id][group]['fieldset_child_id'];
214
214
  var group_field_id = json_holder[fieldset_child_id][group]['field_id'];
215
- var group_field = 'field-' + group_field_id + '-child-' + group_fsc_id;
215
+ var group_field = '<%= DynamicFieldsets.config.form_field_prefix %>' + group_field_id + '-child-' + group_fsc_id;
216
216
 
217
217
  // As each dependency clause is AND'd together, we'll assume it'll be
218
218
  // true until short circuited into being false.`
@@ -0,0 +1 @@
1
+ <p>This field type needs to set the show_partial to an existing partial.</p>
@@ -0,0 +1,2 @@
1
+ <p>This footer needs to be overridden by setting show_footer_partial in your child Field class.</p>
2
+
@@ -0,0 +1 @@
1
+ <p>This footer needs to be overridden by setting show_header_partial in your child Field class.</p>
@@ -0,0 +1,13 @@
1
+ <div class='dynamic_fieldsets field'>
2
+ <span class='label'><%= label %></label>
3
+ <% if values.nil? || values.empty? %>
4
+ <em class='empty'>No answer given</em>
5
+ <% else %>
6
+ <ul>
7
+ <% values.each do |value| %>
8
+ <span class='value'><%= value %></span>
9
+ <% end %>
10
+ </ul>
11
+ <% end %>
12
+ </div>
13
+
@@ -0,0 +1,8 @@
1
+ <div class='dynamic_fieldsets field'>
2
+ <span class='label'><%= label %></label>
3
+ <% if value.nil? || value.empty? %>
4
+ <em class='empty'>No answer given</em>
5
+ <% else %>
6
+ <span class='value'><%= value %></span>
7
+ <% end %>
8
+ </div>
@@ -0,0 +1,2 @@
1
+ # Autotest.add_discovery { "rails" }
2
+ Autotest.add_discovery { "rspec2" }
@@ -5,17 +5,19 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "dynamic_fieldsets"
8
- s.version = "0.0.16"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jeremiah Hemphill", "Ethan Pemble", "John Carter"]
12
- s.date = "2012-02-13"
12
+ s.date = "2012-02-28"
13
13
  s.description = "Dynamic fieldsets for rails controllers"
14
14
  s.email = "jeremiah@cloudspace.com"
15
15
  s.extra_rdoc_files = [
16
16
  "README.rdoc"
17
17
  ]
18
18
  s.files = [
19
+ ".rdebugrc",
20
+ ".rspec",
19
21
  "CHANGELOG",
20
22
  "Gemfile",
21
23
  "Gemfile.lock",
@@ -31,6 +33,10 @@ Gem::Specification.new do |s|
31
33
  "app/helpers/dynamic_fieldsets/fieldset_children_helper.rb",
32
34
  "app/helpers/dynamic_fieldsets/nested_model_helper.rb",
33
35
  "app/helpers/dynamic_fieldsets_helper.rb",
36
+ "app/models/dynamic_fieldsets.rb",
37
+ "app/models/dynamic_fieldsets/checkbox_field.rb",
38
+ "app/models/dynamic_fieldsets/date_field.rb",
39
+ "app/models/dynamic_fieldsets/datetime_field.rb",
34
40
  "app/models/dynamic_fieldsets/dependency.rb",
35
41
  "app/models/dynamic_fieldsets/dependency_clause.rb",
36
42
  "app/models/dynamic_fieldsets/dependency_group.rb",
@@ -42,6 +48,12 @@ Gem::Specification.new do |s|
42
48
  "app/models/dynamic_fieldsets/fieldset.rb",
43
49
  "app/models/dynamic_fieldsets/fieldset_associator.rb",
44
50
  "app/models/dynamic_fieldsets/fieldset_child.rb",
51
+ "app/models/dynamic_fieldsets/instruction_field.rb",
52
+ "app/models/dynamic_fieldsets/multiple_select_field.rb",
53
+ "app/models/dynamic_fieldsets/radio_field.rb",
54
+ "app/models/dynamic_fieldsets/select_field.rb",
55
+ "app/models/dynamic_fieldsets/text_field.rb",
56
+ "app/models/dynamic_fieldsets/textarea_field.rb",
45
57
  "app/views/dynamic_fieldsets/fields/_disable_field_form.html.erb",
46
58
  "app/views/dynamic_fieldsets/fields/_field_default_fields.html.erb",
47
59
  "app/views/dynamic_fieldsets/fields/_field_html_attribute_fields.html.erb",
@@ -67,8 +79,26 @@ Gem::Specification.new do |s|
67
79
  "app/views/dynamic_fieldsets/fieldsets/new.html.erb",
68
80
  "app/views/dynamic_fieldsets/fieldsets/reorder.html.erb",
69
81
  "app/views/dynamic_fieldsets/fieldsets/show.html.erb",
82
+ "app/views/dynamic_fieldsets/form_partials/_checkbox_field.html.erb",
83
+ "app/views/dynamic_fieldsets/form_partials/_date_field.html.erb",
84
+ "app/views/dynamic_fieldsets/form_partials/_datetime_field.html.erb",
85
+ "app/views/dynamic_fieldsets/form_partials/_input_footer.html.erb",
86
+ "app/views/dynamic_fieldsets/form_partials/_input_header.html.erb",
87
+ "app/views/dynamic_fieldsets/form_partials/_instruction_field.html.erb",
88
+ "app/views/dynamic_fieldsets/form_partials/_multiple_select_field.html.erb",
89
+ "app/views/dynamic_fieldsets/form_partials/_radio_field.html.erb",
90
+ "app/views/dynamic_fieldsets/form_partials/_select_field.html.erb",
91
+ "app/views/dynamic_fieldsets/form_partials/_text_field.html.erb",
92
+ "app/views/dynamic_fieldsets/form_partials/_textarea_field.html.erb",
70
93
  "app/views/dynamic_fieldsets/shared/_javascript_watcher.html.erb",
71
94
  "app/views/dynamic_fieldsets/shared/_nested_model_javascript.html.erb",
95
+ "app/views/dynamic_fieldsets/show_partials/_show_incomplete.html.erb",
96
+ "app/views/dynamic_fieldsets/show_partials/_show_incomplete_footer.html.erb",
97
+ "app/views/dynamic_fieldsets/show_partials/_show_incomplete_header.html.erb",
98
+ "app/views/dynamic_fieldsets/show_partials/_show_instruction.html.erb",
99
+ "app/views/dynamic_fieldsets/show_partials/_show_multiple_answers.html.erb",
100
+ "app/views/dynamic_fieldsets/show_partials/_show_single_answer.html.erb",
101
+ "autotest/discover.rb",
72
102
  "config/.routes.rb.swp",
73
103
  "config/routes.rb",
74
104
  "dynamic_fieldsets.gemspec",
@@ -76,6 +106,9 @@ Gem::Specification.new do |s|
76
106
  "lib/dynamic_fieldsets/config.rb",
77
107
  "lib/dynamic_fieldsets/dynamic_fieldsets_in_model.rb",
78
108
  "lib/dynamic_fieldsets/engine.rb",
109
+ "lib/dynamic_fieldsets/field_with_field_options.rb",
110
+ "lib/dynamic_fieldsets/field_with_multiple_answers.rb",
111
+ "lib/dynamic_fieldsets/field_with_single_answer.rb",
79
112
  "lib/dynamic_fieldsets/railtie.rb",
80
113
  "lib/generators/dynamic_fieldsets/controllers_generator.rb",
81
114
  "lib/generators/dynamic_fieldsets/install_generator.rb",
@@ -104,6 +137,7 @@ Gem::Specification.new do |s|
104
137
  "spec/dummy/config/environments/production.rb",
105
138
  "spec/dummy/config/environments/test.rb",
106
139
  "spec/dummy/config/initializers/backtrace_silencers.rb",
140
+ "spec/dummy/config/initializers/dynamic_fieldsets.rb",
107
141
  "spec/dummy/config/initializers/inflections.rb",
108
142
  "spec/dummy/config/initializers/mime_types.rb",
109
143
  "spec/dummy/config/initializers/secret_token.rb",
@@ -143,7 +177,13 @@ Gem::Specification.new do |s|
143
177
  "spec/dynamic_fieldsets_helper_spec.rb",
144
178
  "spec/dynamic_fieldsets_in_model_spec.rb",
145
179
  "spec/dynamic_fieldsets_spec.rb",
180
+ "spec/field_with_field_options_spec.rb",
181
+ "spec/field_with_multiple_answers_spec.rb",
182
+ "spec/field_with_single_answer_spec.rb",
146
183
  "spec/integration/navigation_spec.rb",
184
+ "spec/models/checkbox_field_spec.rb",
185
+ "spec/models/date_field_spec.rb",
186
+ "spec/models/datetime_field_spec.rb",
147
187
  "spec/models/dependency_clause_spec.rb",
148
188
  "spec/models/dependency_group_spec.rb",
149
189
  "spec/models/dependency_spec.rb",
@@ -155,6 +195,11 @@ Gem::Specification.new do |s|
155
195
  "spec/models/fieldset_associator_spec.rb",
156
196
  "spec/models/fieldset_child_spec.rb",
157
197
  "spec/models/fieldset_spec.rb",
198
+ "spec/models/instruction_field_spec.rb",
199
+ "spec/models/multiple_select_field_spec.rb",
200
+ "spec/models/radio_field_spec.rb",
201
+ "spec/models/text_field_spec.rb",
202
+ "spec/models/textarea_field_spec.rb",
158
203
  "spec/spec_helper.rb",
159
204
  "spec/support/dependency_group_helper.rb",
160
205
  "spec/support/dependency_helper.rb",
@@ -177,53 +222,62 @@ Gem::Specification.new do |s|
177
222
  s.specification_version = 3
178
223
 
179
224
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
180
- s.add_runtime_dependency(%q<rails>, [">= 3.0.7"])
225
+ s.add_runtime_dependency(%q<rails>, ["~> 3.0.7"])
181
226
  s.add_development_dependency(%q<capybara>, [">= 0.4.0"])
182
227
  s.add_development_dependency(%q<sqlite3>, [">= 0"])
183
228
  s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
229
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
230
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.3"])
231
+ s.add_development_dependency(%q<json>, [">= 0"])
184
232
  s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
185
233
  s.add_development_dependency(%q<rspec-rails>, ["~> 2.6.1"])
186
- s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
234
+ s.add_development_dependency(%q<shoulda>, ["~> 3.0.0"])
235
+ s.add_development_dependency(%q<ruby_parser>, ["~> 2.3.1"])
236
+ s.add_development_dependency(%q<ZenTest>, [">= 0"])
237
+ s.add_development_dependency(%q<autotest-rails>, [">= 0"])
187
238
  s.add_development_dependency(%q<cucumber>, [">= 0"])
188
239
  s.add_development_dependency(%q<cucumber-rails>, [">= 0"])
189
240
  s.add_development_dependency(%q<database_cleaner>, [">= 0"])
190
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
191
- s.add_development_dependency(%q<jeweler>, ["~> 1.6.3"])
192
- s.add_development_dependency(%q<rcov>, [">= 0"])
193
- s.add_development_dependency(%q<json>, [">= 0"])
241
+ s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
194
242
  s.add_development_dependency(%q<ci_reporter>, [">= 0"])
195
243
  else
196
- s.add_dependency(%q<rails>, [">= 3.0.7"])
244
+ s.add_dependency(%q<rails>, ["~> 3.0.7"])
197
245
  s.add_dependency(%q<capybara>, [">= 0.4.0"])
198
246
  s.add_dependency(%q<sqlite3>, [">= 0"])
199
247
  s.add_dependency(%q<ruby-debug19>, [">= 0"])
248
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
249
+ s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
250
+ s.add_dependency(%q<json>, [">= 0"])
200
251
  s.add_dependency(%q<rspec>, ["~> 2.6.0"])
201
252
  s.add_dependency(%q<rspec-rails>, ["~> 2.6.1"])
202
- s.add_dependency(%q<yard>, ["~> 0.6.0"])
253
+ s.add_dependency(%q<shoulda>, ["~> 3.0.0"])
254
+ s.add_dependency(%q<ruby_parser>, ["~> 2.3.1"])
255
+ s.add_dependency(%q<ZenTest>, [">= 0"])
256
+ s.add_dependency(%q<autotest-rails>, [">= 0"])
203
257
  s.add_dependency(%q<cucumber>, [">= 0"])
204
258
  s.add_dependency(%q<cucumber-rails>, [">= 0"])
205
259
  s.add_dependency(%q<database_cleaner>, [">= 0"])
206
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
207
- s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
208
- s.add_dependency(%q<rcov>, [">= 0"])
209
- s.add_dependency(%q<json>, [">= 0"])
260
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
210
261
  s.add_dependency(%q<ci_reporter>, [">= 0"])
211
262
  end
212
263
  else
213
- s.add_dependency(%q<rails>, [">= 3.0.7"])
264
+ s.add_dependency(%q<rails>, ["~> 3.0.7"])
214
265
  s.add_dependency(%q<capybara>, [">= 0.4.0"])
215
266
  s.add_dependency(%q<sqlite3>, [">= 0"])
216
267
  s.add_dependency(%q<ruby-debug19>, [">= 0"])
268
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
269
+ s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
270
+ s.add_dependency(%q<json>, [">= 0"])
217
271
  s.add_dependency(%q<rspec>, ["~> 2.6.0"])
218
272
  s.add_dependency(%q<rspec-rails>, ["~> 2.6.1"])
219
- s.add_dependency(%q<yard>, ["~> 0.6.0"])
273
+ s.add_dependency(%q<shoulda>, ["~> 3.0.0"])
274
+ s.add_dependency(%q<ruby_parser>, ["~> 2.3.1"])
275
+ s.add_dependency(%q<ZenTest>, [">= 0"])
276
+ s.add_dependency(%q<autotest-rails>, [">= 0"])
220
277
  s.add_dependency(%q<cucumber>, [">= 0"])
221
278
  s.add_dependency(%q<cucumber-rails>, [">= 0"])
222
279
  s.add_dependency(%q<database_cleaner>, [">= 0"])
223
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
224
- s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
225
- s.add_dependency(%q<rcov>, [">= 0"])
226
- s.add_dependency(%q<json>, [">= 0"])
280
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
227
281
  s.add_dependency(%q<ci_reporter>, [">= 0"])
228
282
  end
229
283
  end
@@ -0,0 +1,45 @@
1
+ # this file was stolen from kaminari
2
+ require 'active_support/configurable'
3
+
4
+ module DynamicFieldsets
5
+
6
+ # create new configs by passing a block with the config assignment
7
+ def self.configure(&block)
8
+ yield @config ||= DynamicFieldsets::Configuration.new
9
+ end
10
+
11
+ def self.config
12
+ @config
13
+ end
14
+
15
+ # setup config data
16
+ class Configuration
17
+ include ActiveSupport::Configurable
18
+ config_accessor :available_field_types
19
+ config_accessor :form_fieldset_associator_prefix
20
+ config_accessor :form_field_prefix
21
+
22
+ def param_name
23
+ config.param_name.respond_to?(:call) ? config.param_name.call() : config.param_name
24
+ end
25
+ end
26
+
27
+ # setup default options
28
+ # this should match the generator config that goes in the initializer file
29
+ configure do |config|
30
+ config.available_field_types = [
31
+ "DynamicFieldsets::CheckboxField",
32
+ "DynamicFieldsets::DateField",
33
+ "DynamicFieldsets::DatetimeField",
34
+ "DynamicFieldsets::InstructionField",
35
+ "DynamicFieldsets::MultipleSelectField",
36
+ "DynamicFieldsets::RadioField",
37
+ "DynamicFieldsets::SelectField",
38
+ "DynamicFieldsets::TextField",
39
+ "DynamicFieldsets::TextareaField"
40
+ ]
41
+ config.form_fieldset_associator_prefix = "fsa-"
42
+ config.form_field_prefix = "field-"
43
+ end
44
+ end
45
+
@@ -59,7 +59,7 @@ module DynamicFieldsets
59
59
  # for each fsa
60
60
  self.dynamic_fieldsets.keys.each do |key|
61
61
  fsa = self.fieldset_associator(key)
62
- fsa_tag_id = "fsa-" + fsa.id.to_s
62
+ fsa_tag_id = DynamicFieldsets.config.form_fieldset_associator_prefix + fsa.id.to_s
63
63
 
64
64
  # check if the values are set, if it matches the current fsa, and if it matches the current fieldset
65
65
  if !self.dynamic_fieldset_values.nil? && self.dynamic_fieldset_values.has_key?(fsa_tag_id) && self.dynamic_fieldset_values[fsa_tag_id][:fieldset_model_name] == key
@@ -81,8 +81,8 @@ module DynamicFieldsets
81
81
  end
82
82
  elsif child.is_a?(DynamicFieldsets::Field)
83
83
  # if a child, check if the params value is set, check if it is required, check if it satisfies condition
84
- fsa_tag_id = "fsa-" + fsa_id.to_s
85
- field_tag_id = "field-" + child.id.to_s
84
+ fsa_tag_id = DynamicFieldsets.config.form_fieldset_associator_prefix + fsa_id.to_s
85
+ field_tag_id = DynamicFieldsets.config.form_field_prefix + child.id.to_s
86
86
  if !self.dynamic_fieldset_values[fsa_tag_id].has_key?(field_tag_id)
87
87
  self.errors.add(:base, child.label + " is missing from the form data")
88
88
  else
@@ -95,17 +95,18 @@ module DynamicFieldsets
95
95
  end
96
96
  else
97
97
  # found a major problem, not sure how to get here
98
- puts "found a child that wasn't a field or fieldset" + child.inspect
98
+ throw "found a child that wasn't a field or fieldset" + child.inspect
99
99
  end
100
100
  end
101
101
 
102
102
  # Stores data from the controller into the dynamic_fieldset_values instance variable
103
+ # Also combines the date and time fields into a single field
103
104
  #
104
105
  # @param [Hash] params The parameters from the controller that include fsa tags
105
106
  def set_fieldset_values( params )
106
- values = params.select{ |key| key.match(/^fsa-/) }
107
+ values = params.select{ |key| key.match(/^#{DynamicFieldsets.config.form_fieldset_associator_prefix}/) }
107
108
  values.keys.each do |key|
108
- set_date_to_mysql( values[key] )
109
+ values[key] = set_date_to_mysql( values[key] )
109
110
  end
110
111
  self.dynamic_fieldset_values = values
111
112
  end
@@ -116,6 +117,12 @@ module DynamicFieldsets
116
117
  # time conversions. If the query receives a string instead of a time object, time zone information
117
118
  # may be saved incorrectly. (1-25-2012)
118
119
  #
120
+ # At some point this should be moved to the date_field and datetime_field models. Right now, it needs
121
+ # to stay here because we are taking the values from the form and iterating over the keys. This
122
+ # will not work because the date information is stored int 3-5 keys. We need to change the form
123
+ # data parser to get a list of expected field and iterate over them, looking for the values in the
124
+ # form post. That is a big change that we don't have time for now. (JH 2-27-2012)
125
+ #
119
126
  # @param [Hash] post The post parameters that include date fields like date(1i), date(2i), ...
120
127
  # @return [Hash] The modified hash containing one key-pair value in YYYY-MM-DD[ hh:mm] format.
121
128
  def set_date_to_mysql( post )
@@ -143,73 +150,41 @@ module DynamicFieldsets
143
150
  return post
144
151
  end
145
152
 
146
-
147
- # hacky system to save fieldset values
148
- # needs to be refactored and tested
149
- #
150
- # among other things, it can edit field records for random fsas if the wrong information comes from the controller
151
-
153
+ # Given the form values, finds the keys that correspond to fieldsets
154
+ # then passes the value for the key to the fieldset associator object for saving into individual field records
152
155
  def save_dynamic_fieldsets
153
156
  values = self.dynamic_fieldset_values
154
157
  if !values.nil?
155
158
  values.keys.each do |key|
156
- if key.start_with?("fsa-")
157
- key_id = key.gsub(/^fsa-/, "")
158
-
159
- if key_id.eql? ""
160
- then fsa = DynamicFieldsets::FieldsetAssociator.create(
161
- :fieldset_id => values[key][:fieldset_id],
162
- :fieldset_model_id => self.id,
163
- :fieldset_model_type => self.class.name,
164
- :fieldset_model_name => values[key][:fieldset_model_name] )
165
- else fsa = DynamicFieldsets::FieldsetAssociator.find_by_id key_id
166
- end
167
-
168
- values[key].keys.each do |sub_key| # EACH FIELD
169
- if sub_key.start_with?("field-")
170
- sub_key_id = sub_key.gsub(/^field-/, "")
171
-
172
- this_value = values[key][sub_key]
173
- if this_value.is_a? Array
174
- then # multiple values
175
- field_records = DynamicFieldsets::FieldRecord.where(:fieldset_associator_id => fsa.id, :fieldset_child_id => sub_key_id)
176
-
177
- this_value.each do |value|
178
- if field_records.select{ |record| record.value.eql? value }.empty? # record does not exist?
179
- #ADD
180
- DynamicFieldsets::FieldRecord.create( :fieldset_associator_id => fsa.id,
181
- :fieldset_child_id => sub_key_id,
182
- :value => value)
183
- end
184
- end
185
- field_records.each do |record|
186
- if !this_value.include? record.value then
187
- #DELETE
188
- record.destroy
189
- else
190
- #KEEP
191
- end
192
- end
193
-
194
- else # single value
195
- # retrieve record
196
- field_record = DynamicFieldsets::FieldRecord.where(:fieldset_associator_id => fsa.id, :fieldset_child_id => sub_key_id).first
197
- if field_record.nil? # create record
198
- field_record = DynamicFieldsets::FieldRecord.create(:fieldset_associator_id => fsa.id, :fieldset_child_id => sub_key_id, :value => this_value)
199
- else # update record
200
- field_record.value = this_value
201
- field_record.save
202
- end
203
- end
204
-
205
- end
206
- end
159
+ if key.start_with?(DynamicFieldsets.config.form_fieldset_associator_prefix)
160
+ save_fsa(key, values[key])
207
161
  end
208
162
  end
209
163
  end
210
164
  self.dynamic_fieldset_values = nil
211
165
  end
212
166
 
167
+ # save all of the fields and fieldsets in the values hash for this fieldset associator
168
+ #
169
+ # @param [String] The key that includes the fieldset associator's id
170
+ # @param [Hash] fsa_values An array of input information from the form
171
+ def save_fsa(key, fsa_values)
172
+ key_id = key.gsub(/^#{DynamicFieldsets.config.form_fieldset_associator_prefix}/, "")
173
+
174
+ if(key_id == "")
175
+ fsa = DynamicFieldsets::FieldsetAssociator.create(
176
+ :fieldset_id => fsa_values[:fieldset_id],
177
+ :fieldset_model_id => self.id,
178
+ :fieldset_model_type => self.class.name,
179
+ :fieldset_model_name => fsa_values[:fieldset_model_name]
180
+ )
181
+ else
182
+ fsa = DynamicFieldsets::FieldsetAssociator.find_by_id key_id
183
+ end
184
+
185
+ fsa.update_fieldset_records_with_form_information(fsa_values)
186
+ end
187
+
213
188
  # Matches methods that match named_fieldset and named_fieldset_fieldset
214
189
  # Or calls super
215
190
  #