dynamic_fieldsets 0.1.16 → 0.1.17
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +18 -0
- data/VERSION +1 -1
- data/app/helpers/dynamic_fieldsets_helper.rb +18 -51
- data/app/models/dynamic_fieldsets/field.rb +5 -1
- data/app/models/dynamic_fieldsets/fieldset.rb +1 -1
- data/app/models/dynamic_fieldsets/fieldset_associator.rb +25 -8
- data/app/models/dynamic_fieldsets/fieldset_child.rb +1 -1
- data/app/views/dynamic_fieldsets/fieldset_children/_dependency_fields.html.erb +1 -1
- data/app/views/dynamic_fieldsets/fieldsets/_child.html.erb +1 -1
- data/app/views/dynamic_fieldsets/shared/{_javascript_watcher.html.erb → _form_javascript_watcher.html.erb} +53 -57
- data/app/views/dynamic_fieldsets/shared/_show_javascript_watcher.html.erb +138 -0
- data/app/views/dynamic_fieldsets/show_partials/_show_instruction.html.erb +1 -1
- data/app/views/dynamic_fieldsets/show_partials/_show_multiple_answers.html.erb +1 -1
- data/app/views/dynamic_fieldsets/show_partials/_show_single_answer.html.erb +1 -1
- data/dynamic_fieldsets.gemspec +4 -3
- data/spec/dummy/app/models/information_form.rb +2 -1
- data/spec/dummy/app/views/information_forms/_form.html.erb +1 -0
- data/spec/dummy/app/views/information_forms/show.html.erb +1 -0
- metadata +5 -4
data/CHANGELOG
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
== unreleased changes
|
2
2
|
|
3
|
+
== 0.1.17
|
4
|
+
* Handling for nested fieldsets dependencies and for 'parallele' fieldset dependencies
|
5
|
+
* Wrote a js watcher for the show page, since previous solution is limited to a single fieldset.
|
6
|
+
* Fixed problems that came up for AND and OR dependencies during more complex testing.
|
7
|
+
|
8
|
+
== 0.1.16
|
9
|
+
* Added fieldset associator ids to fieldeset dependency hash so we can handle inter fieldset dependencies.
|
10
|
+
|
11
|
+
== 0.1.12
|
12
|
+
* Removed blank option from selects, it was causing problems on submission
|
13
|
+
changed the way 'checked' radios are read to jquery
|
14
|
+
|
15
|
+
== 0.1.11
|
16
|
+
|
17
|
+
* Fixed dependencies: AND, OR, multiple, and nested working,
|
18
|
+
-textboxes are cleared when hidden (still need to handle inputs and selects)
|
19
|
+
All values are now evaluated when any change, for radios only the checked one is read
|
20
|
+
|
3
21
|
== 0.1.10
|
4
22
|
|
5
23
|
* Fixed a namespacing issue in the nested model helper where it was overriding the helper of another project with the same method name.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.17
|
@@ -32,6 +32,8 @@ module DynamicFieldsetsHelper
|
|
32
32
|
end
|
33
33
|
|
34
34
|
args = {
|
35
|
+
:fsa => fsa,
|
36
|
+
:fieldset_child => fieldset_child,
|
35
37
|
:value => values,
|
36
38
|
:values => values
|
37
39
|
}
|
@@ -83,46 +85,6 @@ module DynamicFieldsetsHelper
|
|
83
85
|
return field_markup
|
84
86
|
end
|
85
87
|
|
86
|
-
# Removes fieldset children that do not show in the edit form due to dependencies
|
87
|
-
# @param [Fieldset] fieldset The Fieldset to render
|
88
|
-
# @param [Hash] values Stored values for the fieldset
|
89
|
-
# @return [Array <FieldsetChild>] children that should render in show page
|
90
|
-
#
|
91
|
-
def hide_children(fieldset, values)
|
92
|
-
children = []
|
93
|
-
fieldset.fieldset_children.each do |child_field|
|
94
|
-
value = values[child_field.id]
|
95
|
-
dependent_on = DynamicFieldsets::DependencyGroup.where(:fieldset_child_id => child_field.id).first
|
96
|
-
if dependent_on.nil?
|
97
|
-
children << child_field.child
|
98
|
-
else
|
99
|
-
dependencies = dependent_on.dependency_clauses.collect(&:dependencies).flatten.uniq
|
100
|
-
dependencies.each do |dependency|
|
101
|
-
if values[dependency.fieldset_child_id].present?
|
102
|
-
dependent_on_type = dependency.fieldset_child.child.type
|
103
|
-
dependent_on_values = values[dependency.fieldset_child_id]
|
104
|
-
check_values = []
|
105
|
-
|
106
|
-
if dependent_on_type == "DynamicFieldsets::CheckboxField" || dependent_on_type == "DynamicFieldsets::MultipleSelectField"
|
107
|
-
dependent_on_values.each do |current_value|
|
108
|
-
check_values << current_value[:name]
|
109
|
-
end
|
110
|
-
else
|
111
|
-
check_values << (dependent_on_values.has_key?(:name) ? dependent_on_values[:name] : dependent_on_values[:value])
|
112
|
-
end
|
113
|
-
|
114
|
-
check_values.each do |check|
|
115
|
-
if dependent_on.action == "show" && check == dependency.value
|
116
|
-
children << child_field.child
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
return children.uniq
|
124
|
-
end
|
125
|
-
|
126
88
|
# Builds HTML for the provided fieldset and its children.
|
127
89
|
# @param [FieldsetAssociator] fsa parent FieldsetAssociator
|
128
90
|
# @param [Fieldset] fieldset The Fieldset to render
|
@@ -132,8 +94,7 @@ module DynamicFieldsetsHelper
|
|
132
94
|
lines = []
|
133
95
|
lines.push render(:partial => "/dynamic_fieldsets/shared/fieldset_header", :locals => {:fieldset => fieldset})
|
134
96
|
|
135
|
-
|
136
|
-
children = form_type == "show" ? hide_children(fieldset, values) : fieldset.children
|
97
|
+
children = fieldset.children
|
137
98
|
|
138
99
|
# this returns field/fieldset objects rather than fieldset children
|
139
100
|
# that is why this code looks like it is accessing odd objects
|
@@ -155,14 +116,14 @@ module DynamicFieldsetsHelper
|
|
155
116
|
# @param [FieldsetAssociator] The fieldset associator for the dynamic fieldset to render
|
156
117
|
# @return [String] The HTML for the entire dynamic fieldset
|
157
118
|
def dynamic_fieldset_show_renderer(fsa)
|
158
|
-
return dynamic_fieldset_renderer(fsa, "show")
|
119
|
+
return dynamic_fieldset_renderer(fsa, "show") << javascript_renderer("show",fsa)
|
159
120
|
end
|
160
121
|
|
161
122
|
# Build HTML for a specific dynamic fieldset on a form page
|
162
123
|
# @param [FieldsetAssociator] The fieldset associator for the dynamic fieldset to render
|
163
124
|
# @return [String] The HTML for the entire dynamic fieldset
|
164
125
|
def dynamic_fieldset_form_renderer(fsa)
|
165
|
-
return dynamic_fieldset_renderer(fsa, "form") << javascript_renderer(fsa)
|
126
|
+
return dynamic_fieldset_renderer(fsa, "form") << javascript_renderer("form",fsa)
|
166
127
|
end
|
167
128
|
|
168
129
|
# Builds HTML for a specific dynamic fieldset in a form.
|
@@ -184,15 +145,21 @@ module DynamicFieldsetsHelper
|
|
184
145
|
#
|
185
146
|
# @params [FieldsetAssociator] The fieldset associator for the dynamic fieldset to render
|
186
147
|
# @return [String] The javascript variable that shows what fields have dependencies
|
187
|
-
def javascript_renderer(fsa)
|
148
|
+
def javascript_renderer(form_type, fsa)
|
188
149
|
unless fsa.id == nil
|
189
150
|
rendered_javascript = "<script type='text/javascript'>
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
151
|
+
if ( typeof dynamic_fieldsets_dependencies == 'undefined' ){
|
152
|
+
var dynamic_fieldsets_dependencies = #{fsa.dependency_child_hash.to_json};
|
153
|
+
} else {
|
154
|
+
$.extend(dynamic_fieldsets_dependencies, #{fsa.dependency_child_hash.to_json});
|
155
|
+
}</script>"
|
156
|
+
|
157
|
+
if form_type == "form"
|
158
|
+
rendered_javascript += render "dynamic_fieldsets/shared/form_javascript_watcher"
|
159
|
+
elsif form_type == "show"
|
160
|
+
rendered_javascript += render "dynamic_fieldsets/shared/show_javascript_watcher"
|
161
|
+
end
|
162
|
+
|
196
163
|
return rendered_javascript.html_safe
|
197
164
|
else
|
198
165
|
return ""
|
@@ -148,11 +148,15 @@ module DynamicFieldsets
|
|
148
148
|
# @return [Hash] Information needed for the show partial, don't know what I need yet
|
149
149
|
def show_partial_locals(args)
|
150
150
|
# these should be incredibly temporary
|
151
|
-
{
|
151
|
+
output = {
|
152
152
|
:value => args[:value],
|
153
153
|
:values => args[:values],
|
154
154
|
:label => self.label,
|
155
|
+
:object => "#{DynamicFieldsets::config.form_fieldset_associator_prefix}#{args[:fsa].id}",
|
156
|
+
:method => "#{DynamicFieldsets::config.form_field_prefix}#{args[:fieldset_child].id}",
|
155
157
|
}
|
158
|
+
output[:id] = "#{output[:object]}_#{output[:method]}"
|
159
|
+
return output
|
156
160
|
end
|
157
161
|
|
158
162
|
# given a value hash for a field, return the part that needs to be shown on the show page
|
@@ -91,7 +91,7 @@ module DynamicFieldsets
|
|
91
91
|
fieldset_child_id = fieldset_child_key.gsub(/^#{DynamicFieldsets.config.form_field_prefix}/, "")
|
92
92
|
fieldset_child = fieldset_children.select { |child| child.id == fieldset_child_id.to_i }.first
|
93
93
|
# this could potentially hit a fieldset and cause problems
|
94
|
-
fieldset_child.child.update_field_records(fsa, fieldset_child, value)
|
94
|
+
fieldset_child.child.update_field_records(fsa, fieldset_child, value) if fieldset_child.present?
|
95
95
|
end
|
96
96
|
end
|
97
97
|
end
|
@@ -72,12 +72,12 @@ module DynamicFieldsets
|
|
72
72
|
end
|
73
73
|
|
74
74
|
|
75
|
-
# Converts the list of fields with dependencies generated by the
|
75
|
+
# Converts the list of fields with dependencies generated by the look_for_dependent_ons method into a hash
|
76
76
|
# The hash contains the actual dependencies for the list of fields that have them
|
77
77
|
#
|
78
78
|
# @return [Hash] dependent fields for fields in the fieldset
|
79
79
|
def dependency_child_hash
|
80
|
-
fieldset_child_collection =
|
80
|
+
fieldset_child_collection = look_for_dependent_ons(self.fieldset)
|
81
81
|
|
82
82
|
output = {}
|
83
83
|
fieldset_child_collection.each do |fieldset_child|
|
@@ -85,29 +85,46 @@ module DynamicFieldsets
|
|
85
85
|
fieldset_child.dependencies.each do |dependency|
|
86
86
|
dependency_group = dependency.dependency_clause.dependency_group
|
87
87
|
output[fieldset_child.id][dependency_group.id] = dependency_group.to_hash
|
88
|
-
|
88
|
+
fieldset = dependency_group.fieldset_child.fieldset
|
89
|
+
if fieldset.fieldset_associators.collect(&:id).present?
|
90
|
+
output[fieldset_child.id][dependency_group.id][:fieldset_associators] = fieldset.fieldset_associators.collect(&:id)
|
91
|
+
else
|
92
|
+
output[fieldset_child.id][dependency_group.id][:fieldset_associators] = find_parent_fsa(fieldset).collect(&:id)
|
93
|
+
end
|
89
94
|
end
|
90
95
|
end
|
91
96
|
return output
|
92
97
|
end
|
93
|
-
|
94
98
|
|
95
|
-
# Gets
|
99
|
+
# Gets finds 'ancestor' fieldset with fsa in case of nested fieldset when generating dependency hash
|
100
|
+
# we need an fsa in the dependencies hash (used for cross-fsa dependencies) AU 08-16-13
|
101
|
+
#
|
102
|
+
# @param [Fieldset] fieldset
|
103
|
+
# @return [Array <FieldsetAssociator>] fsa's associated to parent fieldset
|
104
|
+
#
|
105
|
+
def find_parent_fsa(fieldset)
|
106
|
+
if fieldset.fieldset_associators.present?
|
107
|
+
return fieldset.fieldset_associators
|
108
|
+
else
|
109
|
+
return find_parent_fsa(fieldset.parent)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Gets a list of fields in the given Fieldset That Have Dependencies
|
96
114
|
# I am not exactly sure why this method is necessary (JH 3-8-2012)
|
97
115
|
# It seems like we could just make the dependency_child_hash method run recursively
|
98
116
|
#
|
99
117
|
# @param parent_fieldset [DynamicFieldsets::Fieldset] The fieldset to check inside of
|
100
118
|
# @return [Array] The list of fields with dependencies
|
101
|
-
def
|
119
|
+
def look_for_dependent_ons(parent_fieldset)
|
102
120
|
output = []
|
103
121
|
parent_fieldset.fieldset_children.each do |fieldset_child|
|
104
122
|
if fieldset_child.child_type == "DynamicFieldsets::Field"
|
105
123
|
if fieldset_child.dependencies.present?
|
106
124
|
output.push fieldset_child
|
107
|
-
# else then next
|
108
125
|
end
|
109
126
|
else # if child type is a fieldset, then recurse
|
110
|
-
output +=
|
127
|
+
output += look_for_dependent_ons(fieldset_child.child)
|
111
128
|
end
|
112
129
|
end
|
113
130
|
return output
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<tr>
|
2
|
-
<td><%= f.select :fieldset_child_id, options_for_select(DynamicFieldsets::FieldsetChild.
|
2
|
+
<td><%= f.select :fieldset_child_id, options_for_select(DynamicFieldsets::FieldsetChild.select { |x| x.child_type == "DynamicFieldsets::Field" && x.child.type != "DynamicFieldsets::InstructionField" }.collect { |c| [c.child.name, c.id]}, obj.fieldset_child_id)%></td>
|
3
3
|
<td><%= f.select :relationship, DynamicFieldsets::Dependency::RELATIONSHIP_LIST %></td>
|
4
4
|
<td><%= f.text_field :value %></td>
|
5
5
|
<td>
|
@@ -31,7 +31,7 @@
|
|
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>
|
34
|
-
<span class="edit"><%= link_to "Edit Dependency", edit_dynamic_fieldsets_fieldset_child_path(
|
34
|
+
<span class="edit"><%= link_to "Edit Dependency", edit_dynamic_fieldsets_fieldset_child_path(fieldset_child) %></span>
|
35
35
|
<span class="edit"><%= link_to 'Edit Field', edit_dynamic_fieldsets_field_path(child) %></span>
|
36
36
|
<span class="destroy"><%= button_to 'Remove', dynamic_fieldsets_remove_fieldset_child_path(fieldset_child), :method => :post %></span>
|
37
37
|
</span>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<script type='text/javascript'>
|
2
2
|
|
3
3
|
// The only inputs we care about are visible... not hidden
|
4
|
-
var all_inputs = $(":input:not(:hidden)[id^=fsa]").add("p[id^='fsa']");
|
4
|
+
var all_inputs = $(":input:not(:hidden)[id^=fsa]").add("p[id^='fsa']").add("textarea[id^='fsa']");
|
5
5
|
|
6
6
|
//Return the fieldset child id for the input
|
7
7
|
//This uniquely associated the fieldset child with the fieldset associator
|
@@ -61,7 +61,7 @@ function get_input_value(field, type) {
|
|
61
61
|
}
|
62
62
|
return output;
|
63
63
|
case 'checkbox':
|
64
|
-
return
|
64
|
+
return field.parent().parent().find(':checked').map(function(index,option) {
|
65
65
|
return $.trim($(option).parent('label').text())
|
66
66
|
});
|
67
67
|
case 'select':
|
@@ -110,7 +110,7 @@ all_inputs.change( function() {
|
|
110
110
|
var all_fieldset_child_id = get_fieldset_child_id($(input), all_type)
|
111
111
|
user_inputs[all_fieldset_child_id] = get_input_value($(input), all_type);
|
112
112
|
});
|
113
|
-
|
113
|
+
|
114
114
|
if (fieldset_child_id in dynamic_fieldsets_dependencies) {
|
115
115
|
$.each(dynamic_fieldsets_dependencies[fieldset_child_id], function(index, group) {
|
116
116
|
fieldset_associator_ids = dynamic_fieldsets_dependencies[fieldset_child_id][index]["fieldset_associators"];
|
@@ -139,7 +139,7 @@ function update_dependency_group_for_fieldset_child(fieldset_child_id, group, us
|
|
139
139
|
function all_dependency_clauses_true(fieldset_child_id, group, user_inputs) {
|
140
140
|
for(var key in group["clause"]) {
|
141
141
|
var clause = group["clause"][key]
|
142
|
-
if(!at_least_one_dependency_true(
|
142
|
+
if(!at_least_one_dependency_true(clause, user_inputs)) {
|
143
143
|
return false;
|
144
144
|
}
|
145
145
|
}
|
@@ -151,16 +151,13 @@ function all_dependency_clauses_true(fieldset_child_id, group, user_inputs) {
|
|
151
151
|
//Only return false if all are false
|
152
152
|
//It looks to see what dependencies inside the clause should actually be tested (AU 08-07-13)
|
153
153
|
// If dependency doesn't match current field, it looks up the correct stored input to compare
|
154
|
-
function at_least_one_dependency_true(
|
154
|
+
function at_least_one_dependency_true(clause, user_inputs) {
|
155
155
|
for(var key in clause) {
|
156
156
|
var dependency = clause[key]
|
157
|
+
var fieldset_child_id = dependency["fieldset_child_id"]
|
157
158
|
if( evaluate_dependency(user_inputs[fieldset_child_id], dependency["relationship"], dependency["value"]) ){
|
158
159
|
return true
|
159
|
-
}
|
160
|
-
if( evaluate_dependency(user_inputs[dependency['fieldset_child_id']], dependency['relationship'], dependency['value']) ){
|
161
|
-
return true
|
162
|
-
}
|
163
|
-
}
|
160
|
+
}
|
164
161
|
}
|
165
162
|
return false
|
166
163
|
}
|
@@ -202,7 +199,8 @@ function evaluate_dependency(user_value, relationship, stored_value) {
|
|
202
199
|
// group_field: the field to update (generally not the field that triggered the change)
|
203
200
|
function dependency_action(success_flag, action, group_fields, counter) {
|
204
201
|
$.each(group_fields, function(index, group_field){
|
205
|
-
if (
|
202
|
+
if( $('[id$='+group_field+']').size() > 0 ) {
|
203
|
+
if (success_flag){
|
206
204
|
switch(action)
|
207
205
|
{
|
208
206
|
case 'show':
|
@@ -210,65 +208,63 @@ function dependency_action(success_flag, action, group_fields, counter) {
|
|
210
208
|
case 'enable':
|
211
209
|
$('#' + group_field + ' :input').removeAttr('disabled');
|
212
210
|
}
|
213
|
-
|
214
|
-
} else {
|
215
|
-
switch(action)
|
216
|
-
{
|
217
|
-
case 'show':
|
218
|
-
$('[id$=' + group_field +']').hide();
|
219
|
-
case 'enable':
|
220
|
-
$('#' + group_field + ' :input').attr('disabled', true);
|
221
|
-
}
|
222
211
|
|
223
|
-
|
212
|
+
} else {
|
213
|
+
switch(action)
|
214
|
+
{
|
215
|
+
case 'show':
|
216
|
+
$('[id$=' + group_field +']').hide();
|
217
|
+
case 'enable':
|
218
|
+
$('#' + group_field + ' :input').attr('disabled', true);
|
219
|
+
}
|
220
|
+
clear_unused_field(group_field)
|
224
221
|
|
225
|
-
|
226
|
-
|
227
|
-
nested_dependencies(success_flag, action, group_field, counter)
|
228
|
-
}
|
222
|
+
nested_dependencies(success_flag, action, group_field)
|
223
|
+
}
|
229
224
|
}
|
230
225
|
});
|
231
226
|
};
|
232
227
|
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
228
|
+
//clears fields that are being hidden
|
229
|
+
function clear_unused_field(group_field) {
|
230
|
+
fields = $('[id$='+group_field+'] :input')
|
231
|
+
fields.each( function(index, field) {
|
232
|
+
field = $(field)
|
233
|
+
type = get_field_type(field);
|
234
|
+
switch(type)
|
235
|
+
{
|
236
|
+
case 'text':
|
237
|
+
case 'textarea':
|
238
|
+
field.val("");
|
239
|
+
case 'radio':
|
240
|
+
case 'checkbox':
|
241
|
+
if (field.attr('checked') == 'checked') {
|
242
|
+
field.removeAttr('checked')
|
243
|
+
}
|
244
|
+
case 'select':
|
245
|
+
case 'multi-select':
|
246
|
+
}
|
247
|
+
});
|
253
248
|
};
|
254
249
|
|
255
250
|
//looks through dependency hash to find dependent fields that may need to be hidden (AU 08-07-13)
|
256
|
-
function nested_dependencies(success_flag, action, group_field
|
251
|
+
function nested_dependencies(success_flag, action, group_field) {
|
257
252
|
var dependent_on = group_field.split("-").pop();
|
258
253
|
for( var key in dynamic_fieldsets_dependencies ) {
|
259
254
|
var child = dynamic_fieldsets_dependencies[key]
|
260
255
|
for( var keyg in child ) {
|
261
|
-
|
262
|
-
|
263
|
-
var
|
264
|
-
for( var
|
265
|
-
var
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
256
|
+
var group_search = child[keyg]
|
257
|
+
for( var keyc in group_search["clause"] ) {
|
258
|
+
var clause = group_search["clause"][keyc]
|
259
|
+
for( var keyd in clause ) {
|
260
|
+
var dependency = clause[keyd]
|
261
|
+
//select dependent by comparing who the dependency belongs to
|
262
|
+
if ( dependency["fieldset_child_id"] == dependent_on ) {
|
263
|
+
var fsa = group_field.split("_")[0]
|
264
|
+
var field = group_field.split("_")[1]
|
265
|
+
var dependent_id = field.replace(dependent_on, group_search["fieldset_child_id"])
|
266
|
+
var full_dep_id = fsa+"_"+dependent_id
|
267
|
+
dependency_action(success_flag, action, [full_dep_id])
|
272
268
|
}
|
273
269
|
}
|
274
270
|
}
|
@@ -0,0 +1,138 @@
|
|
1
|
+
<script type='text/javascript'>
|
2
|
+
|
3
|
+
var all_divs = $("div :not(:hidden)[id^=fsa]").add("p[id^='fsa']");
|
4
|
+
|
5
|
+
function hide_fields(){
|
6
|
+
var values = {}
|
7
|
+
$.each(all_divs, function(index, div){
|
8
|
+
var div_id = $(div).attr('id');
|
9
|
+
var fieldset_child_id = div_id.substring(div_id.length-1);
|
10
|
+
var fsa_id = div_id.split("_")[0].split("-")[1]
|
11
|
+
|
12
|
+
if($(div).is("p")){
|
13
|
+
values[fieldset_child_id] = div.innerHTML
|
14
|
+
} else {
|
15
|
+
if($(div).attr('type') == 'single'){
|
16
|
+
values[fieldset_child_id] = $(div).find('span').find('span').text()
|
17
|
+
} else {
|
18
|
+
values[fieldset_child_id] = $(div).find('li').map(function(index, li){
|
19
|
+
return $(div).find('span').find('span').text()
|
20
|
+
});
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
var dependency_group = dynamic_fieldsets_dependencies[fieldset_child_id];
|
25
|
+
if((typeof dependency_group) != "undefined"){
|
26
|
+
$.each(dependency_group, function(index, group){
|
27
|
+
var fieldset_associator_ids = group['fieldset_associators'];
|
28
|
+
evaluate_dependencies(fieldset_child_id, group, values, fieldset_associator_ids)
|
29
|
+
})
|
30
|
+
}
|
31
|
+
});
|
32
|
+
}
|
33
|
+
|
34
|
+
function evaluate_dependencies(fieldset_child_id, group, values, fieldset_associator_ids) {
|
35
|
+
var action = group['action'];
|
36
|
+
var group_fsc_id = group['fieldset_child_id'];
|
37
|
+
var group_field_id = group['field_id'];
|
38
|
+
var group_fields = []
|
39
|
+
$.each(fieldset_associator_ids, function(index, fsa_id) {
|
40
|
+
group_fields[index] = '<%= DynamicFieldsets.config.form_fieldset_associator_prefix %>' + fsa_id + '_' + '<%=DynamicFieldsets.config.form_field_prefix %>' + group_fsc_id;
|
41
|
+
});
|
42
|
+
dependency_action(all_dependency_clauses_true(fieldset_child_id, group, values), action, group_fields, 0 )
|
43
|
+
}
|
44
|
+
|
45
|
+
function all_dependency_clauses_true(fieldset_child_id, group, values) {
|
46
|
+
for(var key in group["clause"]) {
|
47
|
+
var clause = group["clause"][key]
|
48
|
+
if(!at_least_one_dependency_true(clause, values)) {
|
49
|
+
return false;
|
50
|
+
}
|
51
|
+
}
|
52
|
+
return true;
|
53
|
+
}
|
54
|
+
|
55
|
+
function at_least_one_dependency_true(clause, values) {
|
56
|
+
for(var key in clause) {
|
57
|
+
var dependency = clause[key]
|
58
|
+
var fieldset_child_id = dependency["fieldset_child_id"]
|
59
|
+
if( evaluate_dependency(values[fieldset_child_id], dependency["relationship"], dependency["value"]) ){
|
60
|
+
return true
|
61
|
+
}
|
62
|
+
}
|
63
|
+
return false
|
64
|
+
}
|
65
|
+
|
66
|
+
function evaluate_dependency(user_value, relationship, stored_value) {
|
67
|
+
switch(relationship)
|
68
|
+
{
|
69
|
+
case 'equals':
|
70
|
+
return user_value == stored_value;
|
71
|
+
case 'not equals':
|
72
|
+
return user_value != stored_value;
|
73
|
+
case 'includes':
|
74
|
+
return $.inArray(stored_value, user_value) != -1;
|
75
|
+
case 'not includes':
|
76
|
+
return $.inArray(stored_value, user_value) == -1;
|
77
|
+
case 'blank':
|
78
|
+
return user_value == "";
|
79
|
+
case 'not blank':
|
80
|
+
return user_value != "";
|
81
|
+
default:
|
82
|
+
return false;
|
83
|
+
}
|
84
|
+
};
|
85
|
+
|
86
|
+
function dependency_action(success_flag, action, group_fields, counter) {
|
87
|
+
$.each(group_fields, function(index, group_field){
|
88
|
+
if (success_flag){
|
89
|
+
switch(action)
|
90
|
+
{
|
91
|
+
case 'show':
|
92
|
+
$('[id$=' + group_field +']').show();
|
93
|
+
case 'enable':
|
94
|
+
$('#' + group_field + ' :input').removeAttr('disabled');
|
95
|
+
}
|
96
|
+
|
97
|
+
} else {
|
98
|
+
switch(action)
|
99
|
+
{
|
100
|
+
case 'show':
|
101
|
+
$('[id$=' + group_field +']').hide();
|
102
|
+
case 'enable':
|
103
|
+
$('#' + group_field + ' :input').attr('disabled', true);
|
104
|
+
}
|
105
|
+
|
106
|
+
//save from infinite recursion, only goes as deep as there are dependency groups
|
107
|
+
if( counter < Object.keys(dynamic_fieldsets_dependencies).length ) {
|
108
|
+
nested_dependencies(success_flag, action, group_field, counter)
|
109
|
+
}
|
110
|
+
}
|
111
|
+
});
|
112
|
+
};
|
113
|
+
|
114
|
+
function nested_dependencies(success_flag, action, group_field, counter) {
|
115
|
+
var dependent_on = group_field.split("-").pop();
|
116
|
+
for( var key in dynamic_fieldsets_dependencies ) {
|
117
|
+
var child = dynamic_fieldsets_dependencies[key]
|
118
|
+
for( var keyg in child ) {
|
119
|
+
//ignore own group since dependents won't be here
|
120
|
+
if( keyg != dependent_on ) {
|
121
|
+
var group_search = child[keyg]
|
122
|
+
for( var keyc in group_search["clause"] ) {
|
123
|
+
var clause = group_search["clause"][keyc]
|
124
|
+
for( var keyd in clause ) {
|
125
|
+
var dependency = clause[keyd]
|
126
|
+
if ( dependency["fieldset_child_id"] == dependent_on ) {
|
127
|
+
var dependent_id = group_field.replace(dependent_on, group_search["fieldset_child_id"])
|
128
|
+
dependency_action(success_flag, action, [dependent_id], counter+1)
|
129
|
+
}
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
133
|
+
}
|
134
|
+
}
|
135
|
+
};
|
136
|
+
|
137
|
+
hide_fields();
|
138
|
+
</script>
|
@@ -1 +1 @@
|
|
1
|
-
<p><%= label %></p>
|
1
|
+
<p id='<%= id %>'><%= label %></p>
|
data/dynamic_fieldsets.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "dynamic_fieldsets"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.17"
|
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 = "2013-
|
12
|
+
s.date = "2013-09-10"
|
13
13
|
s.description = "Dynamic fieldsets for rails controllers"
|
14
14
|
s.email = "jeremiah@cloudspace.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -92,8 +92,9 @@ Gem::Specification.new do |s|
|
|
92
92
|
"app/views/dynamic_fieldsets/form_partials/_textarea_field.html.erb",
|
93
93
|
"app/views/dynamic_fieldsets/shared/_fieldset_footer.html.erb",
|
94
94
|
"app/views/dynamic_fieldsets/shared/_fieldset_header.html.erb",
|
95
|
-
"app/views/dynamic_fieldsets/shared/
|
95
|
+
"app/views/dynamic_fieldsets/shared/_form_javascript_watcher.html.erb",
|
96
96
|
"app/views/dynamic_fieldsets/shared/_nested_model_javascript.html.erb",
|
97
|
+
"app/views/dynamic_fieldsets/shared/_show_javascript_watcher.html.erb",
|
97
98
|
"app/views/dynamic_fieldsets/show_partials/_show_incomplete.html.erb",
|
98
99
|
"app/views/dynamic_fieldsets/show_partials/_show_incomplete_footer.html.erb",
|
99
100
|
"app/views/dynamic_fieldsets/show_partials/_show_incomplete_header.html.erb",
|
@@ -1,5 +1,6 @@
|
|
1
1
|
class InformationForm < ActiveRecord::Base
|
2
2
|
# important note: for this to work, there needs to have a fieldset with an nkey of "first" in the db
|
3
3
|
# so that DynamicFieldsets::Fieldset.find_by_nkey("first") returns a fieldset
|
4
|
-
acts_as_dynamic_fieldset :child_form => {:fieldset => :first}
|
4
|
+
acts_as_dynamic_fieldset :child_form => {:fieldset => :first, :initialize_on_create => true}
|
5
|
+
acts_as_dynamic_fieldset :child_form2 => {:fieldset => :second, :initialize_on_create => true}
|
5
6
|
end
|
@@ -7,6 +7,7 @@
|
|
7
7
|
|
8
8
|
|
9
9
|
<%= dynamic_fieldset_show_renderer(@information_form.child_form) %>
|
10
|
+
<%= dynamic_fieldset_show_renderer(@information_form.child_form2) %>
|
10
11
|
|
11
12
|
<%= link_to 'Edit', edit_information_form_path(@information_form) %> |
|
12
13
|
<%= link_to 'Back', information_forms_path %>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamic_fieldsets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.17
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-
|
14
|
+
date: 2013-09-10 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rails
|
@@ -384,8 +384,9 @@ files:
|
|
384
384
|
- app/views/dynamic_fieldsets/form_partials/_textarea_field.html.erb
|
385
385
|
- app/views/dynamic_fieldsets/shared/_fieldset_footer.html.erb
|
386
386
|
- app/views/dynamic_fieldsets/shared/_fieldset_header.html.erb
|
387
|
-
- app/views/dynamic_fieldsets/shared/
|
387
|
+
- app/views/dynamic_fieldsets/shared/_form_javascript_watcher.html.erb
|
388
388
|
- app/views/dynamic_fieldsets/shared/_nested_model_javascript.html.erb
|
389
|
+
- app/views/dynamic_fieldsets/shared/_show_javascript_watcher.html.erb
|
389
390
|
- app/views/dynamic_fieldsets/show_partials/_show_incomplete.html.erb
|
390
391
|
- app/views/dynamic_fieldsets/show_partials/_show_incomplete_footer.html.erb
|
391
392
|
- app/views/dynamic_fieldsets/show_partials/_show_incomplete_header.html.erb
|
@@ -520,7 +521,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
520
521
|
version: '0'
|
521
522
|
segments:
|
522
523
|
- 0
|
523
|
-
hash:
|
524
|
+
hash: -1940297788818609247
|
524
525
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
525
526
|
none: false
|
526
527
|
requirements:
|