cocoon 1.0.17 → 1.0.18

Sign up to get free protection for your applications and to get access to all the features.
@@ -149,14 +149,41 @@ It takes four parameters:
149
149
  - f: referring to the containing form-object
150
150
  - association: the name of the association (plural) of which a new instance needs to be added (symbol or string).
151
151
  - html_options: extra html-options (see `link_to`)
152
- There are three extra options that allow to control the placement of the new link-data:
152
+ There are some special options, the first three allow to control the placement of the new link-data:
153
153
  - `data-association-insertion-node` : the jquery selector of the node
154
154
  - `data-association-insertion-method` : jquery method that inserts the new data. `before`, `after`, `append`, `prepend`, etc. Default: `before`
155
155
  - `data-association-insertion-position` : old method specifying where to insert new data.
156
156
  - this setting still works but `data-association-insertion-method` takes precedence. may be removed in a future version.
157
+ - `partial`: explicitly declare the name of the partial that will be used
158
+ - `render_options` : options passed through to the form-builder function (e.g. `simple_fields_for`, `semantic_fields_for` or `fields_for`).
159
+ If it contains a `:locals` option containing a hash, that is handed to the partial.
157
160
 
158
161
  Optionally you could also leave out the name and supply a block that is captured to give the name (if you want to do something more complicated).
159
162
 
163
+ #### :render_options
164
+ Inside the `html_options` you can add an option `:render_options`, and the containing hash will be handed down to the form-builder for the inserted
165
+ form. E.g. especially when using `twitter-bootstrap` and `simple_form` together, the `simple_fields_for` needs the option `:wrapper => 'inline'` which can
166
+ be handed down as follows:
167
+
168
+ ````haml
169
+ = link_to_add_association 'add something', f, :something, :render_options => {:wrapper => 'inline' }
170
+ ````
171
+
172
+ If you want to specify locals that needed to handed down to the partial, write
173
+
174
+ ````haml
175
+ = link_to_add_association 'add something', f, :something, :render_options => {:locals => {:sherlock => 'Holmes' }}
176
+ ````
177
+
178
+
179
+ #### :partial
180
+
181
+ To overrule the default partial name, e.g. because it shared between multiple views, write
182
+
183
+ ````haml
184
+ = link_to_add_association 'add something', f, :something, :partial => 'shared/something_fields'
185
+ ````
186
+
160
187
 
161
188
  ### link_to_remove_association
162
189
 
@@ -171,13 +198,6 @@ It takes three parameters:
171
198
 
172
199
  Optionally you could also leave out the name and supply a block that is captured to give the name (if you want to do something more complicated).
173
200
 
174
- Inside the `html_options` you can add an option `:render_options`, and the containing hash will be handed down to the form-builder for the inserted
175
- form. E.g. especially when using `twitter-bootstrap` and `simple_form` together, the `simple_fields_for` needs the option `:wrapper => 'inline'` which can
176
- be handed down as follows:
177
-
178
- ````haml
179
- = link_to_add_association 'add something', f, :something, :render_options => {:wrapper => 'inline' }
180
- ````
181
201
 
182
202
  ### Callbacks (upon insert and remove of items)
183
203
 
@@ -208,10 +228,15 @@ $(document).ready(function() {
208
228
  $("#owner_from_list").show();
209
229
  $("#owner a.add_fields").show();
210
230
  });
231
+ $('#owner').bind("after-removal-callback",
232
+ function() {
233
+ /* e.g. recalculate order of child items */
234
+ });
211
235
  });
212
236
  ````
213
237
 
214
238
  Do note that for the callbacks to work there has to be a surrounding container (div), where you can bind the callbacks to.
239
+ Note that the default `removal-callback` is called _before_ removing the nested item.
215
240
 
216
241
  ### Control the Insertion behaviour
217
242
 
@@ -234,7 +259,12 @@ The `association-insertion-method` will determine where to add it in relation wi
234
259
 
235
260
  ### Partial
236
261
 
237
- The partial should be named `_<association-object_singular>_fields`, and should start with a container (e.g. `div`) of class `.nested-fields`.
262
+ If no explicit partial-name is given, `cocoon` looks for a file named `_<association-object_singular>_fields`.
263
+ To override the default partial-name use the option `:partial`.
264
+
265
+ For the javascript to behave correctly, the partial should start with a container (e.g. `div`) of class `.nested-fields`.
266
+
267
+
238
268
 
239
269
  There is no limit to the amount of nesting, though.
240
270
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.17
1
+ 1.0.18
@@ -6,7 +6,11 @@
6
6
  }
7
7
 
8
8
  function trigger_removal_callback(node) {
9
- node.parent().parent().trigger('removal-callback');
9
+ node.trigger('removal-callback');
10
+ }
11
+
12
+ function trigger_after_removal_callback(node) {
13
+ node.trigger('after-removal-callback');
10
14
  }
11
15
 
12
16
  $('.add_fields').live('click', function(e) {
@@ -17,8 +21,6 @@
17
21
  content = $this.data('template'),
18
22
  insertionMethod = $this.data('association-insertion-method') || $this.data('association-insertion-position') || 'before';
19
23
  insertionNode = $this.data('association-insertion-node'),
20
- insertionCallback = $this.data('insertion-callback'),
21
- removalCallback = $this.data('removal-callback'),
22
24
  regexp_braced = new RegExp('\\[new_' + assoc + '\\]', 'g'),
23
25
  regexp_underscord = new RegExp('_new_' + assoc + '_', 'g'),
24
26
  new_id = new Date().getTime(),
@@ -52,17 +54,21 @@
52
54
 
53
55
  $('.remove_fields.dynamic').live('click', function(e) {
54
56
  var $this = $(this);
55
- trigger_removal_callback($this);
57
+ var trigger_node = $this.closest(".nested-fields").parent();
58
+ trigger_removal_callback(trigger_node);
56
59
  e.preventDefault();
57
60
  $this.closest(".nested-fields").remove();
61
+ trigger_after_removal_callback(trigger_node);
58
62
  });
59
63
 
60
64
  $('.remove_fields.existing').live('click', function(e) {
61
65
  var $this = $(this);
62
- trigger_removal_callback($this);
66
+ var trigger_node = $this.closest(".nested-fields").parent().parent();
67
+ trigger_removal_callback(trigger_node);
63
68
  e.preventDefault();
64
69
  $this.prev("input[type=hidden]").val("1");
65
70
  $this.closest(".nested-fields").hide();
71
+ trigger_after_removal_callback(trigger_node);
66
72
  });
67
73
 
68
74
  })(jQuery);
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "cocoon"
8
- s.version = "1.0.17"
8
+ s.version = "1.0.18"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nathan Van der Auwera"]
12
- s.date = "2012-03-16"
12
+ s.date = "2012-04-07"
13
13
  s.description = "Unobtrusive nested forms handling, using jQuery. Use this and discover cocoon-heaven."
14
14
  s.email = "nathan@dixis.com"
15
15
  s.extra_rdoc_files = [
@@ -33,9 +33,11 @@ module Cocoon
33
33
  # :nodoc:
34
34
  def render_association(association, f, new_object, render_options={}, custom_partial=nil)
35
35
  partial = setup_partial(custom_partial, association)
36
+ locals = render_options.delete(:locals)
36
37
  method_name = f.respond_to?(:semantic_fields_for) ? :semantic_fields_for : (f.respond_to?(:simple_fields_for) ? :simple_fields_for : :fields_for)
37
38
  f.send(method_name, association, new_object, {:child_index => "new_#{association}"}.merge(render_options)) do |builder|
38
- render(partial, :f => builder, :dynamic => true)
39
+ partial_options = {:f => builder, :dynamic => true}.merge(locals)
40
+ render(partial, partial_options)
39
41
  end
40
42
  end
41
43
 
@@ -45,6 +47,9 @@ module Cocoon
45
47
  # - *f* : the form this should come in (the formtastic form)
46
48
  # - *association* : the associated objects, e.g. :tasks, this should be the name of the <tt>has_many</tt> relation.
47
49
  # - *html_options*: html options to be passed to <tt>link_to</tt> (see <tt>link_to</tt>)
50
+ # - *:render_options* : options passed to `simple_fields_for, semantic_fields_for or fields_for`
51
+ # - *:locals* : the locals hash in the :render_options is handed to the partial
52
+ # - *:partial* : explicitly override the default partial name
48
53
  # - *&block*: see <tt>link_to</tt>
49
54
 
50
55
  def link_to_add_association(*args, &block)
@@ -54,6 +54,13 @@ describe Cocoon do
54
54
  end
55
55
  end
56
56
 
57
+ context "when using aliased association and class-name" do
58
+ it "uses the correct name" do
59
+ result = @tester.link_to_add_association('add something', @form_obj, :admin_comments)
60
+ result.to_s.should == '<a href="#" class="add_fields" data-association="admin_comment" data-associations="admin_comments" data-template="form&lt;tag&gt;">add something</a>'
61
+ end
62
+ end
63
+
57
64
  it "tttt" do
58
65
  @post.class.reflect_on_association(:people).klass.new.should be_a(Person)
59
66
  end
@@ -66,6 +73,18 @@ describe Cocoon do
66
73
  end
67
74
  end
68
75
 
76
+ context "with extra render-options to pass locals to the partial" do
77
+ it "uses the correct plural" do
78
+ @tester.unstub(:render_association)
79
+ @form_obj.should_receive(:fields_for) { | association, new_object, options_hash, &block| block.call }
80
+ @tester.should_receive(:render).with("person_fields", {:f=>nil, :dynamic=>true, :alfred=>"Judoka"}).and_return ("partiallll")
81
+ result = @tester.link_to_add_association('add something', @form_obj, :people, :render_options => {:wrapper => 'inline', :locals => {:alfred => 'Judoka'}})
82
+ result.to_s.should == '<a href="#" class="add_fields" data-association="person" data-associations="people" data-template="partiallll">add something</a>'
83
+ end
84
+ end
85
+
86
+
87
+
69
88
  context "when using formtastic" do
70
89
  before(:each) do
71
90
  @tester.unstub(:render_association)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoon
3
3
  version: !ruby/object:Gem::Version
4
- hash: 53
4
+ hash: 51
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 17
10
- version: 1.0.17
9
+ - 18
10
+ version: 1.0.18
11
11
  platform: ruby
12
12
  authors:
13
13
  - Nathan Van der Auwera
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-03-16 00:00:00 Z
18
+ date: 2012-04-07 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  requirement: &id001 !ruby/object:Gem::Requirement