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,2 @@
1
+ module DynamicFieldsets
2
+ end
@@ -0,0 +1,29 @@
1
+ module DynamicFieldsets
2
+ # Creates checkbox tags on a form
3
+ #
4
+ # Includes support for predefined field options and multiple selected answers
5
+ class CheckboxField < Field
6
+ acts_as_field_with_field_options
7
+ acts_as_field_with_multiple_answers
8
+
9
+ # Note that the checkbox needs individual data for each of the included options
10
+ # This means that some things, such as the name are duplicated for each field option
11
+ #
12
+ #
13
+ # @return [Hash] Data needed for the checkbox form partial
14
+ def form_partial_locals(args)
15
+ output = super
16
+ output[:options] = []
17
+ field_options.each do |option|
18
+ output[:options] << {
19
+ :name => "#{DynamicFieldsets.config.form_fieldset_associator_prefix}#{args[:fsa].id}[#{DynamicFieldsets.config.form_field_prefix}#{args[:fieldset_child].id}][]",
20
+ :value => option.id.to_s,
21
+ :checked => values_or_defaults_for_form(args[:values]).include?(option.id.to_s),
22
+ :label => option.name,
23
+ :html_attributes => html_attribute_hash
24
+ }
25
+ end
26
+ return output
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ module DynamicFieldsets
2
+ # Creates date tags on a form
3
+ #
4
+ # The date tag currently defaults to the current date if nothing is set with the year range starting 70 years in the past
5
+ #
6
+ # The value of the input is stored as a string so costly Date.parse calls are used to parse the string
7
+ # This may have to be changed in the future
8
+ class DateField < Field
9
+ acts_as_field_with_single_answer
10
+
11
+ # Returns the current value if set, then the default value if set, then the current date as a Date object
12
+ #
13
+ # @return [Date] The current time stored in the date field
14
+ def get_date_or_today(value)
15
+ default_date = value_or_default_for_form(value)
16
+ if default_date.empty?
17
+ return Date.today
18
+ else
19
+ # not sure why Date.parse doesn't work here
20
+ return Time.parse(default_date)
21
+ end
22
+ end
23
+
24
+ # Includes information used in the date_options argument (third) on the date select helper
25
+ #
26
+ # @return [Hash] Data for the date form partial
27
+ def form_partial_locals(args)
28
+ output = super
29
+ output[:date_options] = {
30
+ :start_year => Time.now.year - 70,
31
+ :default => get_date_or_today(args[:value])
32
+ }
33
+ return output
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,36 @@
1
+ module DynamicFieldsets
2
+ # Creates datetime tags on a form
3
+ #
4
+ # The datetime tag currently defaults to the current time if nothing is set with the year range starting 70 years in the past
5
+ #
6
+ # The value of the input is stored as a string so costly Time.parse calls are used to parse the string
7
+ # This may have to be changed in the future
8
+ class DatetimeField < Field
9
+ acts_as_field_with_single_answer
10
+
11
+ # Returns the current value if set, then the default value if set, then the current time as a Time object
12
+ #
13
+ # @return [Time] The current time stored in the datetime field
14
+ def get_datetime_or_today(value)
15
+ default_time = value_or_default_for_form(value)
16
+ if default_time.empty?
17
+ return Time.now
18
+ else
19
+ return Time.parse(default_time)
20
+ end
21
+ end
22
+
23
+ # Includes information used in the date_options argument (third) on the date select helper
24
+ #
25
+ # @return [Hash] Data for the datetime form partial
26
+ def form_partial_locals(args)
27
+ output = super
28
+ output[:date_options] = {
29
+ :start_year => Time.now.year - 70,
30
+ :default => get_datetime_or_today(args[:value])
31
+ }
32
+ return output
33
+ end
34
+ end
35
+ end
36
+
@@ -4,7 +4,7 @@ module DynamicFieldsets
4
4
  #
5
5
  # @author John "hex" Carter
6
6
  class Dependency < ActiveRecord::Base
7
- set_table_name "dynamic_fieldsets_dependencies"
7
+ self.table_name = "dynamic_fieldsets_dependencies"
8
8
 
9
9
  RELATIONSHIP_LIST = ["equals","not equals","includes","not includes","blank","not blank"]
10
10
 
@@ -3,7 +3,7 @@ module DynamicFieldsets
3
3
  #
4
4
  # @author Jeremiah Hemphill
5
5
  class DependencyClause < ActiveRecord::Base
6
- set_table_name "dynamic_fieldsets_dependency_clauses"
6
+ self.table_name = "dynamic_fieldsets_dependency_clauses"
7
7
  belongs_to :dependency_group
8
8
 
9
9
  has_many :dependencies
@@ -1,6 +1,6 @@
1
1
  module DynamicFieldsets
2
2
  class DependencyGroup < ActiveRecord::Base
3
- set_table_name "dynamic_fieldsets_dependency_groups"
3
+ self.table_name = "dynamic_fieldsets_dependency_groups"
4
4
  belongs_to :fieldset_child
5
5
 
6
6
  has_many :dependency_clauses
@@ -3,8 +3,9 @@ module DynamicFieldsets
3
3
  #
4
4
  # @author Jeremiah Hemphill, Ethan Pemble
5
5
  class Field < ActiveRecord::Base
6
- set_table_name "dynamic_fieldsets_fields"
7
- # Relations
6
+ self.table_name = "dynamic_fieldsets_fields"
7
+
8
+ # Associations
8
9
 
9
10
  # parents
10
11
  has_many :fieldset_children, :dependent => :destroy, :as => :child
@@ -25,67 +26,194 @@ module DynamicFieldsets
25
26
  # Validations
26
27
  validates_presence_of :name
27
28
  validates_presence_of :label
28
- validates_presence_of :field_type
29
+ validates_presence_of :type
29
30
  validates_inclusion_of :enabled, :in => [true, false]
30
31
  validates_inclusion_of :required, :in => [true, false]
31
- validate :has_field_options, :field_type_in_field_types
32
32
 
33
- # validates inclusion of wasn't working so I made it a custom validation
34
- # refactor later when I figure out how rails works
35
- def field_type_in_field_types
36
- if !Field.field_types.include?(self.field_type)
37
- self.errors.add(:field_type, "The field type must be one of the available field types.")
33
+
34
+ # Scopes and Static Methods
35
+
36
+ # Either calls the defaul descendants method or pulls the data from the config
37
+ # Deals with weird single table inheritance issues with cache classes off
38
+ # Causes errors only in development mode
39
+ #
40
+ # @return [Array<String>] An array of descendant class names
41
+ def self.descendants
42
+ if ::Rails.application.config.cache_classes
43
+ super
44
+ else
45
+ DynamicFieldsets.config.available_field_types
38
46
  end
39
47
  end
40
48
 
41
- # Custom validation for fields with multiple options on update
42
- def has_field_options
43
- if options? && self.field_options.empty?
44
- self.errors.add(:field_options, "This field must have options")
45
- end
49
+ # @return [Array<String>] Humanized collection of descendants
50
+ def self.descendant_collection
51
+ descendants.collect { |d| [d.to_s.gsub("DynamicFieldsets::", "").underscore.humanize, d.to_s ] }
46
52
  end
53
+
54
+ # Form partial Methods
47
55
 
48
- # @returns [Array] An array of allowable field types
49
- def self.field_types
50
- ["select", "multiple_select", "checkbox", "radio", "textfield", "textarea", "date", "datetime", "instruction"]
56
+ # @return [String] Name of partial to render for the form
57
+ def form_partial
58
+ "/dynamic_fieldsets/form_partials/" + self.class.to_s.gsub("DynamicFieldsets::", "").underscore
51
59
  end
52
60
 
53
- # @returns [Array] An array of field types that use options
54
- def self.option_field_types
55
- ["select", "multiple_select", "checkbox", "radio"]
61
+ # @return [String] Name of the input header for the form
62
+ def form_header_partial
63
+ "/dynamic_fieldsets/form_partials/input_header"
56
64
  end
57
-
58
- # @return [Boolean] True if the field is of type 'select', 'multiple_select', 'radio', or 'checkbox'
59
- def options?
60
- Field.option_field_types.include? self.field_type
65
+
66
+ # @return [Boolean] By default, use the header partial
67
+ def use_form_header_partial?
68
+ true
61
69
  end
62
-
63
- # @return [FieldOptions] Returns all field options that are enabled
64
- def options
65
- return self.field_options.reject{ |option| !option.enabled }
70
+
71
+ # @return [String] Name of the input footer for the form
72
+ def form_footer_partial
73
+ "/dynamic_fieldsets/form_partials/input_footer"
66
74
  end
67
-
75
+
76
+ # @return [Boolean] By default, use the footer partial
77
+ def use_form_footer_partial?
78
+ true
79
+ end
80
+
81
+ # @return [Hash] Data needed for the form partial
82
+ def form_partial_locals(args)
83
+ output = {
84
+ :fsa => args[:fsa],
85
+ :fieldset_child => args[:fieldset_child],
86
+ :attrs => self.html_attribute_hash,
87
+ # for use in helpers like text_field and date_select
88
+ :object => "#{DynamicFieldsets::config.form_fieldset_associator_prefix}#{args[:fsa].id}",
89
+ :method => "#{DynamicFieldsets::config.form_field_prefix}#{args[:fieldset_child].id}",
90
+ }
91
+ # name for use in helpers like select_tag, check_box_tag, or anything ending with _tag
92
+ # this is more of a convenience method
93
+ output[:name] = "#{output[:object]}[#{output[:method]}]"
94
+ output[:id] = "#{output[:object]}_#{output[:method]}"
95
+ return output
96
+ end
97
+
98
+ # @return [Hash] A hash of html attribute key: value pairs
99
+ def html_attribute_hash
100
+ attrs = {}
101
+ field_html_attributes.each{ |a| attrs.merge! a.attribute_name.to_sym => a.value } if !field_html_attributes.empty?
102
+ return attrs
103
+ end
104
+
105
+ # Show partial Methods
106
+
107
+ # This method must be overriden
108
+ #
109
+ # @return [String] Name of partial to render for the show page
110
+ def show_partial
111
+ "/dynamic_fieldsets/show_partials/show_incomplete"
112
+ end
113
+
114
+ # This method must be overriden if show_header_partial returns true
115
+ #
116
+ # @return [String] Name of the input header for the show
117
+ def show_header_partial
118
+ "/dynamic_fieldsets/show_partials/show_incomplete_header"
119
+ end
120
+
121
+ # @return [Boolean] By default, do not use the header partial
122
+ def use_show_header_partial?
123
+ false
124
+ end
125
+
126
+ # This method must be overriden if show_footer_partial returns true
127
+ #
128
+ # @return [String] Name of the input footer for the show
129
+ def show_footer_partial
130
+ "/dynamic_fieldsets/show_partials/show_incomplete_footer"
131
+ end
132
+
133
+ # @return [Boolean] By default, do not use the footer partial
134
+ def use_show_footer_partial?
135
+ false
136
+ end
137
+
138
+ # Note that this method is really weird
139
+ # You would think that the value displayed should be figured out here
140
+ # but instead, it is figured out first, then passed in, in the arguments hash
141
+ #
142
+ # @return [Hash] Information needed for the show partial, don't know what I need yet
143
+ def show_partial_locals(args)
144
+ # these should be incredibly temporary
145
+ {
146
+ :value => args[:value],
147
+ :values => args[:values],
148
+ :label => self.label,
149
+ }
150
+ end
151
+
152
+ # given a value hash for a field, return the part that needs to be shown on the show page
153
+ def get_value_for_show(value)
154
+ value[:value]
155
+ end
156
+
157
+ # Other Methods
158
+
68
159
  # @return [Boolean] False if field_default.value is empty
69
160
  def has_defaults?
70
161
  return self.field_defaults.length > 0
71
162
  end
72
-
73
- # @return [Array] Alias for field_defaults
74
- def defaults
75
- return self.field_defaults if options?
76
- return nil
77
- end
78
-
79
- # @return [String] Alias for field_defaults.first
80
- def default
81
- return nil if options?
82
- return self.field_defaults.first
83
- end
84
163
 
85
164
  # @return [Boolean] True if there are any field records for the field or if it is in any fieldsets
86
165
  def in_use?
87
166
  self.fieldset_children.count { |child| !child.fieldset_id.nil? || !child.field_records.empty? } > 0
88
167
  end
89
-
168
+
169
+ # Fields such as selects, checkboxes, and radios use predefined field options for their values
170
+ # By default, a field does not use field options
171
+ #
172
+ # @return [Boolean] Whether the field uses field options, defaults to false
173
+ def uses_field_options?
174
+ false
175
+ end
176
+
177
+ # this collects defaults so that we can use them for fields
178
+ # note that this should be overridden when the field uses field options
179
+ # in that case, it should return field option ids instead of field option names
180
+ #
181
+ # I'm sorry
182
+ def collect_default_values
183
+ field_defaults.collect { |d| d[:value] }
184
+ end
185
+
186
+ # This method should be overridden by the field subclasses
187
+ #
188
+ # @param [DynamicFieldsets::FieldsetAssociator] fsa The associator
189
+ # @param [DynamicFieldsets::FieldsetChild] fsc The fieldset child
190
+ # @return [Nil] An empty result
191
+ def get_values_using_fsa_and_fsc(fsa, fsc)
192
+ return nil
193
+ end
194
+
195
+ # Collects the field records for the field so they can be used on the front end
196
+ # These are only the currently saved values in the database, don't worry
197
+ # about defaults here
198
+ #
199
+ # This works for fields that do not use field options
200
+ #
201
+ # @return [Array] An array of field record values
202
+ def collect_field_records_by_fsa_and_fsc(fsa, fsc)
203
+ # I think this needs to return some sort of hash
204
+ records = DynamicFieldsets::FieldRecord.where(:fieldset_associator_id => fsa.id, :fieldset_child_id => fsc.id)
205
+ return records.collect { |r| { :value => r.value } }
206
+ end
207
+
208
+ # Updates the field records for the field based on the given values
209
+ #
210
+ # This must be overridden if it is used
211
+ #
212
+ # @param [DynamicFieldsets::FieldsetAssociator] fsa The associator the value is attached to
213
+ # @param [DynamicFieldsets::FieldsetChild] fieldset_child The fieldset child for the value
214
+ # @param [Array or String] value The new values inputted by the user from the form
215
+ def update_field_records(fsa, fieldset_child, value)
216
+ throw "Field.update_field_records must be overridden to save data from the form."
217
+ end
90
218
  end
91
219
  end
@@ -5,7 +5,7 @@ module DynamicFieldsets
5
5
  #
6
6
  # @authors Scott Sampson, Jeremiah Hemphill, Ethan Pemble
7
7
  class FieldDefault < ActiveRecord::Base
8
- set_table_name "dynamic_fieldsets_field_defaults"
8
+ self.table_name = "dynamic_fieldsets_field_defaults"
9
9
  #relations
10
10
  belongs_to :field
11
11
 
@@ -21,7 +21,7 @@ module DynamicFieldsets
21
21
  #
22
22
  # http://www.youtube.com/watch?v=BeP6CpUnfc0
23
23
  def convert_option_name_to_id
24
- if Field.option_field_types.include?(self.field.field_type)
24
+ if field.uses_field_options?
25
25
  option = FieldOption.find_by_name(self.value)
26
26
  self.value = option.id unless option.nil?
27
27
  end
@@ -29,7 +29,7 @@ module DynamicFieldsets
29
29
 
30
30
  # @return [String] Either the value or the name of the field option reference by the value
31
31
  def pretty_value
32
- if !self.field.nil? && Field.option_field_types.include?(self.field.field_type)
32
+ if !self.field.nil? && field.uses_field_options?
33
33
  option = FieldOption.find_by_id(self.value)
34
34
  if !option.nil?
35
35
  return option.name
@@ -5,7 +5,7 @@ module DynamicFieldsets
5
5
  #
6
6
  # @authors Scott Sampson, Jeremiah Hemphill, Ethan Pemble
7
7
  class FieldHtmlAttribute < ActiveRecord::Base
8
- set_table_name "dynamic_fieldsets_field_html_attributes"
8
+ self.table_name = "dynamic_fieldsets_field_html_attributes"
9
9
  #relations
10
10
  belongs_to :field
11
11
 
@@ -5,7 +5,7 @@ module DynamicFieldsets
5
5
  #
6
6
  # @authors Scott Sampson, Jeremiah Hemphill, Ethan Pemble
7
7
  class FieldOption < ActiveRecord::Base
8
- set_table_name "dynamic_fieldsets_field_options"
8
+ self.table_name = "dynamic_fieldsets_field_options"
9
9
  #relations
10
10
  belongs_to :field
11
11
 
@@ -2,7 +2,7 @@ module DynamicFieldsets
2
2
  # Stores a single record's answer to a field in a fieldset
3
3
  # Fields with multiple answers should have multiple records in this model
4
4
  class FieldRecord < ActiveRecord::Base
5
- set_table_name "dynamic_fieldsets_field_records"
5
+ self.table_name = "dynamic_fieldsets_field_records"
6
6
 
7
7
  belongs_to :fieldset_child
8
8
  belongs_to :fieldset_associator
@@ -3,7 +3,7 @@ module DynamicFieldsets
3
3
  #
4
4
  # @author Jeremiah Hemphill, Ethan Pemble
5
5
  class Fieldset < ActiveRecord::Base
6
- set_table_name "dynamic_fieldsets_fieldsets"
6
+ self.table_name = "dynamic_fieldsets_fieldsets"
7
7
 
8
8
  # Relations
9
9
  has_many :fieldset_associators
@@ -43,6 +43,10 @@ module DynamicFieldsets
43
43
 
44
44
  # The collected descendents of a fieldset.
45
45
  # This group is sorted by order number on the fieldsetchild model
46
+ #
47
+ # IMPORTANT NOTE: At first glance, this looks like it should return a collection of fieldset children. It does not.
48
+ # This is a relic from the original design, and there is code working around the issue in several different places.
49
+ #
46
50
  # @return [Array] Ordered collection of descendent fields and fieldsets.
47
51
  def children
48
52
  collected_children = []
@@ -60,5 +64,36 @@ module DynamicFieldsets
60
64
  def has_children?
61
65
  return !self.fieldset_children.empty?
62
66
  end
67
+
68
+ # returns field record values for every field in the fsa
69
+ #
70
+ # note that this adds a hierarchy to the values
71
+ # not sure if this will require a rewrite somewhere else
72
+ #
73
+ # @param [DynamicFieldsets::FieldsetAssociator] The parent fsa
74
+ # @return [Hash] A hash of field record values using the fieldset child id as they key
75
+ def get_values_using_fsa(fsa)
76
+ output = {}
77
+ fieldset_children.each do |child|
78
+ output[child.id] = child.get_value_using_fsa(fsa)
79
+ end
80
+ return output
81
+ end
82
+
83
+ # Updates field options based on information from the form
84
+ #
85
+ # The form values should only be values for the current fsa
86
+ #
87
+ # @param [Hash] form_values Information from the form
88
+ def update_field_records_with_form_information(form_values)
89
+ form_values.each_pair do |fieldset_child_key, value|
90
+ if fieldset_child_key.start_with?(DynamicFieldsets.config.form_field_prefix)
91
+ fieldset_child_id = fieldset_child_key.gsub(/^#{DynamicFieldsets.config.form_field_prefix}/, "")
92
+ fieldset_child = fieldset_children.select { |child| child.id == fieldset_child_id.to_i }.first
93
+ # this could potentially hit a fieldset and cause problems
94
+ fieldset_child.child.update_field_records(self, fieldset_child, value)
95
+ end
96
+ end
97
+ end
63
98
  end
64
99
  end