nested_form 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/CHANGELOG.rdoc +18 -0
  2. data/CONTRIBUTING.md +11 -0
  3. data/Gemfile +1 -0
  4. data/README.md +3 -4
  5. data/lib/nested_form/builder_mixin.rb +38 -8
  6. data/lib/nested_form/builders.rb +8 -0
  7. data/lib/nested_form/view_helper.rb +7 -0
  8. data/spec/dummy/app/assets/javascripts/jquery_nested_form.js +13 -10
  9. data/spec/dummy/app/assets/javascripts/prototype_nested_form.js +8 -7
  10. data/spec/dummy/db/development.sqlite3 +0 -0
  11. data/spec/dummy/db/test.sqlite3 +0 -0
  12. data/spec/dummy/log/development.log +2322 -50
  13. data/spec/dummy/log/test.log +878 -422
  14. data/spec/dummy/tmp/cache/assets/C99/4D0/sprockets%2F5e30a6b911437f1428dc32c3ae182123 +0 -0
  15. data/spec/dummy/tmp/cache/assets/C99/7D0/sprockets%2F79513e6956e0ee8624976e041fd5636d +0 -0
  16. data/spec/dummy/tmp/cache/assets/CAA/C90/sprockets%2F1e6c8ee1258009385ccf5b84015424b3 +0 -0
  17. data/spec/dummy/tmp/cache/assets/CB2/CB0/sprockets%2F11cc8d161d71a716dd36f16849d90870 +0 -0
  18. data/spec/dummy/tmp/cache/assets/CB7/7F0/sprockets%2Fac97b043470f6fcc925c352f16956643 +0 -0
  19. data/spec/dummy/tmp/cache/assets/CDB/8A0/sprockets%2Faed2a2575c376263c26e93b56b57051d +0 -0
  20. data/spec/dummy/tmp/cache/assets/D1F/A10/sprockets%2F60317e62cb324bfd9987e8da9636fd06 +0 -0
  21. data/spec/dummy/tmp/cache/assets/D49/870/sprockets%2F90896142645585acc8baf56ad57e3afb +0 -0
  22. data/spec/dummy/tmp/cache/assets/D62/F00/sprockets%2F6ac03a007f26b1c18ed3d53498ad3eb8 +0 -0
  23. data/spec/dummy/tmp/cache/assets/D79/BC0/sprockets%2F85a1db977361cc5130fcefb4637ff67e +0 -0
  24. data/spec/dummy/tmp/cache/assets/D87/1F0/sprockets%2F61c9ceafb877fb740c67416ff6f782a9 +0 -0
  25. data/spec/dummy/tmp/cache/assets/DAD/4F0/sprockets%2F765acd1bf68dc90f7d3e61da78b1e659 +0 -0
  26. data/spec/dummy/tmp/cache/assets/E03/3F0/sprockets%2F82b37ae9eccec44c1ef44cfdd07d8534 +0 -0
  27. data/spec/dummy/tmp/cache/assets/E0A/CA0/sprockets%2F7fe72ac1c0db1a7e8e7f59cf25e8a39e +0 -0
  28. data/spec/dummy/tmp/cache/assets/E3A/A60/sprockets%2F7c72c96cfc66454caf5fc8ca0fedd4f3 +0 -0
  29. data/spec/dummy/tmp/cache/assets/E54/400/sprockets%2Fd0cbc16cc37efcf9dc41f242b5dbbf81 +0 -0
  30. data/spec/dummy/tmp/cache/assets/EB7/AB0/sprockets%2F801d29a5debdbfbfb4eef14d70d9bcdb +0 -0
  31. data/spec/dummy/tmp/cache/assets/F48/5E0/sprockets%2F26cd6ffcffbebbe2fd6cd1a8f0c2debc +0 -0
  32. data/spec/form_spec.rb +1 -1
  33. data/spec/nested_form/builder_spec.rb +55 -10
  34. data/spec/nested_form/view_helper_spec.rb +8 -0
  35. data/vendor/assets/javascripts/jquery_nested_form.js +13 -10
  36. data/vendor/assets/javascripts/prototype_nested_form.js +8 -7
  37. metadata +72 -87
  38. data/spec/dummy/tmp/capybara/capybara-201208212241496415482929.html +0 -31
@@ -45,6 +45,6 @@ describe 'NestedForm' do
45
45
  click_link 'Add new task'
46
46
  click_link 'Add new milestone'
47
47
  name = find('.fields .fields input[id$=name]')[:name]
48
- name.should match(/\Aproject\[tasks_attributes\]\[new_\d+\]\[milestones_attributes\]\[new_\d+\]\[name\]\z/)
48
+ name.should match(/\Aproject\[tasks_attributes\]\[\d+\]\[milestones_attributes\]\[\d+\]\[name\]\z/)
49
49
  end
50
50
  end
@@ -19,9 +19,9 @@ require "spec_helper"
19
19
 
20
20
  describe '#link_to_add' do
21
21
  it "behaves similar to a Rails link_to" do
22
- subject.link_to_add("Add", :tasks).should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks">Add</a>'
23
- subject.link_to_add("Add", :tasks, :class => "foo", :href => "url").should == '<a href="url" class="foo add_nested_fields" data-association="tasks">Add</a>'
24
- subject.link_to_add(:tasks) { "Add" }.should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks">Add</a>'
22
+ subject.link_to_add("Add", :tasks).should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks" data-blueprint-id="tasks_fields_blueprint">Add</a>'
23
+ subject.link_to_add("Add", :tasks, :class => "foo", :href => "url").should == '<a href="url" class="foo add_nested_fields" data-association="tasks" data-blueprint-id="tasks_fields_blueprint">Add</a>'
24
+ subject.link_to_add(:tasks) { "Add" }.should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks" data-blueprint-id="tasks_fields_blueprint">Add</a>'
25
25
  end
26
26
 
27
27
  context 'when missing association is provided' do
@@ -77,13 +77,58 @@ require "spec_helper"
77
77
  end
78
78
  end
79
79
 
80
- it "should add task fields to hidden div after form" do
81
- pending
82
- output = ""
83
- mock(@template).after_nested_form(:tasks) { |arg, block| output << block.call }
84
- @builder.fields_for(:tasks) { "Task" }
85
- @builder.link_to_add("Add", :tasks)
86
- output.should == '<div id="tasks_fields_blueprint" style="display: none"><div class="fields">Task</div></div>'
80
+ it "wraps nested fields marked for destruction with an additional class" do
81
+ task = project.tasks.build
82
+ task.mark_for_destruction
83
+ fields = subject.fields_for(:tasks) { 'Task' }
84
+ fields.should eq('<div class="fields marked_for_destruction">Task</div>')
85
+ end
86
+
87
+ it "puts blueprint into data-blueprint attribute" do
88
+ task = project.tasks.build
89
+ task.mark_for_destruction
90
+ subject.fields_for(:tasks) { 'Task' }
91
+ subject.link_to_add('Add', :tasks)
92
+ output = template.send(:after_nested_form_callbacks)
93
+ expected = ERB::Util.html_escape '<div class="fields">Task</div>'
94
+ output.should match(/div.+data-blueprint="#{expected}"/)
95
+ end
96
+
97
+ it "adds parent association name to the blueprint div id" do
98
+ task = project.tasks.build
99
+ task.milestones.build
100
+ subject.fields_for(:tasks, :builder => builder) do |tf|
101
+ tf.fields_for(:milestones, :builder => builder) { 'Milestone' }
102
+ tf.link_to_add('Add', :milestones)
103
+ end
104
+ output = template.send(:after_nested_form_callbacks)
105
+ output.should match(/div.+id="tasks_milestones_fields_blueprint"/)
106
+ end
107
+
108
+ it "doesn't render wrapper div" do
109
+ task = project.tasks.build
110
+ fields = subject.fields_for(:tasks, :wrapper => false) { 'Task' }
111
+
112
+ fields.should eq('Task')
113
+
114
+ subject.link_to_add 'Add', :tasks
115
+ output = template.send(:after_nested_form_callbacks)
116
+
117
+ output.should match(/div.+data-blueprint="Task"/)
118
+ end
119
+ end
120
+
121
+ context "with options" do
122
+ subject { builder.new(:item, project, template, {}, proc {}) }
123
+
124
+ context "when model_object given" do
125
+ it "should use it instead of new generated" do
126
+ subject.fields_for(:tasks) {|f| f.object.name }
127
+ subject.link_to_add("Add", :tasks, :model_object => Task.new(:name => 'for check'))
128
+ output = template.send(:after_nested_form_callbacks)
129
+ expected = ERB::Util.html_escape '<div class="fields">for check</div>'
130
+ output.should match(/div.+data-blueprint="#{expected}"/)
131
+ end
87
132
  end
88
133
  end
89
134
  end
@@ -37,6 +37,14 @@ describe NestedForm::ViewHelper do
37
37
  end
38
38
  end
39
39
 
40
+ if defined?(NestedForm::FormtasticBootstrapBuilder)
41
+ it "should pass instance of NestedForm::FormtasticBootstrapBuilder to semantic_bootstrap_nested_form_for block" do
42
+ _view.semantic_bootstrap_nested_form_for(Project.new) do |f|
43
+ f.should be_instance_of(NestedForm::FormtasticBootstrapBuilder)
44
+ end
45
+ end
46
+ end
47
+
40
48
  it "should append content to end of nested form" do
41
49
  _view.after_nested_form(:tasks) { _view.concat("123") }
42
50
  _view.after_nested_form(:milestones) { _view.concat("456") }
@@ -7,21 +7,22 @@ jQuery(function($) {
7
7
  NestedFormEvents.prototype = {
8
8
  addFields: function(e) {
9
9
  // Setup
10
- var link = e.currentTarget;
11
- var assoc = $(link).attr('data-association'); // Name of child
12
- var content = $('#' + assoc + '_fields_blueprint').html(); // Fields template
10
+ var link = e.currentTarget;
11
+ var assoc = $(link).data('association'); // Name of child
12
+ var blueprint = $('#' + $(link).data('blueprint-id'));
13
+ var content = blueprint.data('blueprint'); // Fields template
13
14
 
14
- // Make the context correct by replacing new_<parents> with the generated ID
15
+ // Make the context correct by replacing <parents> with the generated ID
15
16
  // of each of the parent objects
16
- var context = ($(link).closest('.fields').closestChild('input, textarea').eq(0).attr('name') || '').replace(new RegExp('\[[a-z]+\]$'), '');
17
+ var context = ($(link).closest('.fields').closestChild('input, textarea, select').eq(0).attr('name') || '').replace(new RegExp('\[[a-z_]+\]$'), '');
17
18
 
18
19
  // context will be something like this for a brand new form:
19
- // project[tasks_attributes][new_1255929127459][assignments_attributes][new_1255929128105]
20
+ // project[tasks_attributes][1255929127459][assignments_attributes][1255929128105]
20
21
  // or for an edit form:
21
22
  // project[tasks_attributes][0][assignments_attributes][1]
22
23
  if (context) {
23
24
  var parentNames = context.match(/[a-z_]+_attributes/g) || [];
24
- var parentIds = context.match(/(new_)?[0-9]+/g) || [];
25
+ var parentIds = context.match(/[0-9]+/g) || [];
25
26
 
26
27
  for(var i = 0; i < parentNames.length; i++) {
27
28
  if(parentIds[i]) {
@@ -39,7 +40,7 @@ jQuery(function($) {
39
40
  // Make a unique ID for the new child
40
41
  var regexp = new RegExp('new_' + assoc, 'g');
41
42
  var new_id = new Date().getTime();
42
- content = content.replace(regexp, "new_" + new_id);
43
+ content = content.replace(regexp, new_id);
43
44
 
44
45
  var field = this.insertFields(content, assoc, link);
45
46
  // bubble up event upto document (through form)
@@ -69,9 +70,11 @@ jQuery(function($) {
69
70
  };
70
71
 
71
72
  window.nestedFormEvents = new NestedFormEvents();
72
- $('form a.add_nested_fields').live('click', nestedFormEvents.addFields);
73
- $('form a.remove_nested_fields').live('click', nestedFormEvents.removeFields);
73
+ $(document)
74
+ .delegate('form a.add_nested_fields', 'click', nestedFormEvents.addFields)
75
+ .delegate('form a.remove_nested_fields', 'click', nestedFormEvents.removeFields);
74
76
  });
77
+
75
78
  // http://plugins.jquery.com/project/closestChild
76
79
  /*
77
80
  * Copyright 2011, Tobias Lindig
@@ -1,20 +1,21 @@
1
1
  document.observe('click', function(e, el) {
2
2
  if (el = e.findElement('form a.add_nested_fields')) {
3
3
  // Setup
4
- var assoc = el.readAttribute('data-association'); // Name of child
5
- var content = $(assoc + '_fields_blueprint').innerHTML; // Fields template
4
+ var assoc = el.readAttribute('data-association'); // Name of child
5
+ var blueprint = $(el.readAttribute('data-blueprint-id'));
6
+ var content = blueprint.readAttribute('data-blueprint'); // Fields template
6
7
 
7
- // Make the context correct by replacing new_<parents> with the generated ID
8
+ // Make the context correct by replacing <parents> with the generated ID
8
9
  // of each of the parent objects
9
- var context = (el.getOffsetParent('.fields').firstDescendant().readAttribute('name') || '').replace(new RegExp('\[[a-z]+\]$'), '');
10
+ var context = (el.getOffsetParent('.fields').firstDescendant().readAttribute('name') || '').replace(new RegExp('\[[a-z_]+\]$'), '');
10
11
 
11
12
  // context will be something like this for a brand new form:
12
- // project[tasks_attributes][new_1255929127459][assignments_attributes][new_1255929128105]
13
+ // project[tasks_attributes][1255929127459][assignments_attributes][1255929128105]
13
14
  // or for an edit form:
14
15
  // project[tasks_attributes][0][assignments_attributes][1]
15
16
  if(context) {
16
17
  var parent_names = context.match(/[a-z_]+_attributes/g) || [];
17
- var parent_ids = context.match(/(new_)?[0-9]+/g) || [];
18
+ var parent_ids = context.match(/[0-9]+/g) || [];
18
19
 
19
20
  for(i = 0; i < parent_names.length; i++) {
20
21
  if(parent_ids[i]) {
@@ -32,7 +33,7 @@ document.observe('click', function(e, el) {
32
33
  // Make a unique ID for the new child
33
34
  var regexp = new RegExp('new_' + assoc, 'g');
34
35
  var new_id = new Date().getTime();
35
- content = content.replace(regexp, "new_" + new_id);
36
+ content = content.replace(regexp, new_id);
36
37
 
37
38
  var field = el.insert({ before: content });
38
39
  field.fire('nested:fieldAdded', {field: field});
metadata CHANGED
@@ -1,90 +1,88 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: nested_form
3
- version: !ruby/object:Gem::Version
4
- hash: 17
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 3
10
- version: 0.2.3
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Ryan Bates
14
9
  - Andrea Singh
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2012-08-23 00:00:00 +03:00
20
- default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
13
+ date: 2012-10-23 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
23
16
  name: rake
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
26
18
  none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 3
31
- segments:
32
- - 0
33
- version: "0"
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
34
23
  type: :development
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: bundler
38
24
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: bundler
33
+ requirement: !ruby/object:Gem::Requirement
40
34
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 3
45
- segments:
46
- - 0
47
- version: "0"
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
48
39
  type: :development
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: rspec-rails
52
40
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-rails
49
+ requirement: !ruby/object:Gem::Requirement
54
50
  none: false
55
- requirements:
51
+ requirements:
56
52
  - - ~>
57
- - !ruby/object:Gem::Version
58
- hash: 15
59
- segments:
60
- - 2
61
- - 6
62
- version: "2.6"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.6'
63
55
  type: :development
64
- version_requirements: *id003
65
- - !ruby/object:Gem::Dependency
66
- name: mocha
67
56
  prerelease: false
68
- requirement: &id004 !ruby/object:Gem::Requirement
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '2.6'
63
+ - !ruby/object:Gem::Dependency
64
+ name: mocha
65
+ requirement: !ruby/object:Gem::Requirement
69
66
  none: false
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- hash: 3
74
- segments:
75
- - 0
76
- version: "0"
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
77
71
  type: :development
78
- version_requirements: *id004
79
- description: Gem to conveniently handle multiple models in a single form with Rails 3 and jQuery or Prototype.
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ description: Gem to conveniently handle multiple models in a single form with Rails
80
+ 3 and jQuery or Prototype.
80
81
  email: ryan@railscasts.com
81
82
  executables: []
82
-
83
83
  extensions: []
84
-
85
84
  extra_rdoc_files: []
86
-
87
- files:
85
+ files:
88
86
  - lib/generators/nested_form/install_generator.rb
89
87
  - lib/nested_form/builder_mixin.rb
90
88
  - lib/nested_form/builders.rb
@@ -161,7 +159,6 @@ files:
161
159
  - spec/dummy/tmp/cache/assets/E54/400/sprockets%2Fd0cbc16cc37efcf9dc41f242b5dbbf81
162
160
  - spec/dummy/tmp/cache/assets/EB7/AB0/sprockets%2F801d29a5debdbfbfb4eef14d70d9bcdb
163
161
  - spec/dummy/tmp/cache/assets/F48/5E0/sprockets%2F26cd6ffcffbebbe2fd6cd1a8f0c2debc
164
- - spec/dummy/tmp/capybara/capybara-201208212241496415482929.html
165
162
  - spec/events_spec.rb
166
163
  - spec/form_spec.rb
167
164
  - spec/nested_form/builder_spec.rb
@@ -170,45 +167,33 @@ files:
170
167
  - vendor/assets/javascripts/jquery_nested_form.js
171
168
  - vendor/assets/javascripts/prototype_nested_form.js
172
169
  - CHANGELOG.rdoc
170
+ - CONTRIBUTING.md
173
171
  - Gemfile
174
172
  - LICENSE
175
173
  - Rakefile
176
174
  - README.md
177
- has_rdoc: true
178
175
  homepage: http://github.com/ryanb/nested_form
179
176
  licenses: []
180
-
181
177
  post_install_message:
182
178
  rdoc_options: []
183
-
184
- require_paths:
179
+ require_paths:
185
180
  - lib
186
- required_ruby_version: !ruby/object:Gem::Requirement
181
+ required_ruby_version: !ruby/object:Gem::Requirement
187
182
  none: false
188
- requirements:
189
- - - ">="
190
- - !ruby/object:Gem::Version
191
- hash: 3
192
- segments:
193
- - 0
194
- version: "0"
195
- required_rubygems_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
188
  none: false
197
- requirements:
198
- - - ">="
199
- - !ruby/object:Gem::Version
200
- hash: 19
201
- segments:
202
- - 1
203
- - 3
204
- - 4
189
+ requirements:
190
+ - - ! '>='
191
+ - !ruby/object:Gem::Version
205
192
  version: 1.3.4
206
193
  requirements: []
207
-
208
194
  rubyforge_project: nested_form
209
- rubygems_version: 1.6.2
195
+ rubygems_version: 1.8.23
210
196
  signing_key:
211
197
  specification_version: 3
212
198
  summary: Gem to conveniently handle multiple models in a single form.
213
199
  test_files: []
214
-
@@ -1,31 +0,0 @@
1
- <!DOCTYPE html>
2
- <html xmlns="http://www.w3.org/1999/xhtml"><head>
3
- <title>Dummy</title>
4
-
5
- <script type="text/javascript" src="/assets/jquery.js"></script>
6
- <script type="text/javascript" src="/assets/jquery_nested_form.js"></script>
7
- <script type="text/javascript" src="/assets/jquery_events_test.js"></script>
8
- </head>
9
- <body>
10
-
11
- <form method="post" id="new_project" class="new_project" action="/projects" accept-charset="UTF-8"><div style="margin:0;padding:0;display:inline"><input type="hidden" value="✓" name="utf8" /></div> <div class="fields"> <div class="fields">
12
- <input type="text" size="30" name="project[tasks_attributes][new_1345578109395][milestones_attributes][new_1345578109485][name]" id="project_tasks_attributes_new_1345578109395_tasks_milestones_attributes_new_1345578109485_name" />
13
- <input type="hidden" value="false" name="project[tasks_attributes][new_1345578109395][milestones_attributes][new_1345578109485][_destroy]" id="project_tasks_attributes_new_1345578109395_tasks_milestones_attributes_new_1345578109485__destroy" /><a data-association="milestones" class="remove_nested_fields" href="javascript:void(0)">Remove milestone</a>
14
- </div><div class="fields">
15
- <input type="text" size="30" name="project[tasks_attributes][new_1345578109395][milestones_attributes][new_1345578109485][name]" id="project_tasks_attributes_new_1345578109395_tasks_milestones_attributes_new_1345578109485_milestones_name" />
16
- <input type="hidden" value="false" name="project[tasks_attributes][new_1345578109395][milestones_attributes][new_1345578109485][_destroy]" id="project_tasks_attributes_new_1345578109395_tasks_milestones_attributes_new_1345578109485_milestones__destroy" /><a data-association="milestones" class="remove_nested_fields" href="javascript:void(0)">Remove milestone</a>
17
- </div><a data-association="milestones" class="add_nested_fields" href="javascript:void(0)">Add new milestone</a>
18
- <input type="hidden" value="false" name="project[tasks_attributes][new_1345578109395][_destroy]" id="project_tasks_attributes_new_1345578109395__destroy" /><a data-association="tasks" class="remove_nested_fields" href="javascript:void(0)">Remove</a>
19
- </div><a data-association="tasks" class="add_nested_fields" href="javascript:void(0)">Add new task</a>
20
- </form><div style="display: none" id="tasks_fields_blueprint"><div class="fields"> <a data-association="milestones" class="add_nested_fields" href="javascript:void(0)">Add new milestone</a>
21
- <input type="hidden" value="false" name="project[tasks_attributes][new_tasks][_destroy]" id="project_tasks_attributes_new_tasks__destroy" /><a data-association="tasks" class="remove_nested_fields" href="javascript:void(0)">Remove</a>
22
- </div></div> <div style="display: none" id="milestones_fields_blueprint"><div class="fields">
23
- <input type="text" size="30" name="project[tasks_attributes][new_tasks][milestones_attributes][new_milestones][name]" id="project_tasks_attributes_new_tasks_milestones_attributes_new_milestones_name" />
24
- <input type="hidden" value="false" name="project[tasks_attributes][new_tasks][milestones_attributes][new_milestones][_destroy]" id="project_tasks_attributes_new_tasks_milestones_attributes_new_milestones__destroy" /><a data-association="milestones" class="remove_nested_fields" href="javascript:void(0)">Remove milestone</a>
25
- </div></div>
26
-
27
- <div id="console"><p>Added some field</p><p>Added task field</p><p>Added some field</p><p>Added milestone field</p><p>Added some field</p><p>Added milestone field</p></div>
28
-
29
-
30
-
31
- </body></html>