cocoon 1.0.12 → 1.0.13
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.
- data/History.md +10 -0
- data/README.markdown +49 -9
- data/VERSION +1 -1
- data/app/assets/javascripts/cocoon.js +11 -6
- data/cocoon.gemspec +2 -2
- data/spec/spec_helper.rb +8 -1
- metadata +4 -4
data/History.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Change History / Release Notes
|
2
2
|
|
3
|
+
## Version 1.0.13
|
4
|
+
|
5
|
+
* A while ago we added the option to add a javascript callback on inserting a new associated object, I now made sure we can add a callback on insertion
|
6
|
+
and on removal of a new item. One example where this was useful for me is visible in the demo project `cocoon_simple_form_demo` where I implemented a
|
7
|
+
`belongs_to` relation, and either select from a list, or add a new element.
|
8
|
+
So: the callback-mechanism has changed, and now the callback is bound to the parent container, instead of the link itself. This is because we can also
|
9
|
+
bind the removal callback there (as the removal link is inserted in the html dynamically).
|
10
|
+
|
11
|
+
For more info, see the `README`.
|
12
|
+
|
3
13
|
## Version 1.0.12
|
4
14
|
|
5
15
|
* using "this" in `association-insertion-node` is now possible
|
data/README.markdown
CHANGED
@@ -135,14 +135,6 @@ It takes four parameters:
|
|
135
135
|
|
136
136
|
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).
|
137
137
|
|
138
|
-
There is an option to add a callback on insertion. The callback can be added as follows:
|
139
|
-
|
140
|
-
$("#todo_tasks a.add_fields").
|
141
|
-
data("insertion-callback",
|
142
|
-
function() {
|
143
|
-
$(this).find("textarea").autoResize({extraSpace:0}).change();
|
144
|
-
});
|
145
|
-
|
146
138
|
|
147
139
|
### link_to_remove_association
|
148
140
|
|
@@ -157,9 +149,57 @@ It takes three parameters:
|
|
157
149
|
|
158
150
|
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
151
|
|
152
|
+
### Callbacks (upon insert and remove of items)
|
153
|
+
|
154
|
+
There is an option to add a callback on insertion or removal. If in your view you have the following snippet to select an `onwer`
|
155
|
+
(we use slim for demonstration purposes)
|
156
|
+
|
157
|
+
#owner
|
158
|
+
#owner_from_list
|
159
|
+
= f.association :owner, :collection => Person.all(:order => 'name'), :prompt => 'Choose an existing owner'
|
160
|
+
= link_to_add_association 'add a new person as owner', f, :owner
|
161
|
+
|
162
|
+
This view part will either let you select an owner from the list of persons, or show the fields to add a new person as owner.
|
163
|
+
|
164
|
+
|
165
|
+
The callbacks can be added as follows:
|
166
|
+
|
167
|
+
$(document).ready(function() {
|
168
|
+
$('#owner').bind('insertion-callback',
|
169
|
+
function() {
|
170
|
+
$("#owner_from_list").hide();
|
171
|
+
$("#owner a.add_fields").hide();
|
172
|
+
});
|
173
|
+
$('#owner').bind("removal-callback",
|
174
|
+
function() {
|
175
|
+
$("#owner_from_list").show();
|
176
|
+
$("#owner a.add_fields").show();
|
177
|
+
});
|
178
|
+
});
|
179
|
+
|
180
|
+
Do note that for the callbacks to work there has to be a surrounding container (div), where you can bind the callbacks to.
|
181
|
+
|
182
|
+
### Control the Insertion behaviour
|
183
|
+
|
184
|
+
The default insertion location is at the back of the current container. But we have added two `data`-attributes that are read to determine the insertion-node and -location.
|
185
|
+
|
186
|
+
For example:
|
187
|
+
|
188
|
+
$(document).ready(function() {
|
189
|
+
$("#owner a.add_fields").
|
190
|
+
data("association-insertion-position", 'before').
|
191
|
+
data("association-insertion-node", 'this');
|
192
|
+
});
|
193
|
+
|
194
|
+
|
195
|
+
The `association-insertion-node` will determine where to add it. You can choose any selector here, or specify this (default it is the parent-container).
|
196
|
+
|
197
|
+
The `association-insertion-position` will determine where to add it in relation with the node. Only two options: `before` or `after`.
|
198
|
+
|
199
|
+
|
160
200
|
### Partial
|
161
201
|
|
162
|
-
The partial should be named `_<association-object_singular>_fields`, and should start with a div of class `.nested-fields`.
|
202
|
+
The partial should be named `_<association-object_singular>_fields`, and should start with a container (e.g. `div`) of class `.nested-fields`.
|
163
203
|
|
164
204
|
There is no limit to the amount of nesting, though.
|
165
205
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.13
|
@@ -1,10 +1,14 @@
|
|
1
|
-
|
1
|
+
(function($) {
|
2
2
|
|
3
3
|
function replace_in_content(content, regexp_str, with_str) {
|
4
4
|
reg_exp = new RegExp(regexp_str);
|
5
5
|
content.replace(reg_exp, with_str);
|
6
6
|
}
|
7
7
|
|
8
|
+
function trigger_removal_callback(node) {
|
9
|
+
node.parent().parent().trigger('removal-callback');
|
10
|
+
}
|
11
|
+
|
8
12
|
$('.add_fields').live('click', function(e) {
|
9
13
|
e.preventDefault();
|
10
14
|
var assoc = $(this).data('association'),
|
@@ -13,6 +17,7 @@ $(document).ready(function() {
|
|
13
17
|
insertionPosition = $(this).data('association-insertion-position'),
|
14
18
|
insertionNode = $(this).data('association-insertion-node'),
|
15
19
|
insertionCallback = $(this).data('insertion-callback'),
|
20
|
+
removalCallback = $(this).data('removal-callback'),
|
16
21
|
regexp_braced = new RegExp('\\[new_' + assoc + '\\]', 'g'),
|
17
22
|
regexp_underscord = new RegExp('_new_' + assoc + '_', 'g'),
|
18
23
|
new_id = new Date().getTime(),
|
@@ -41,21 +46,21 @@ $(document).ready(function() {
|
|
41
46
|
} else {
|
42
47
|
insertionNode.before(contentNode);
|
43
48
|
}
|
44
|
-
|
45
|
-
|
46
|
-
insertionCallback.call(contentNode);
|
47
|
-
}
|
49
|
+
|
50
|
+
$(this).parent().trigger('insertion-callback');
|
48
51
|
});
|
49
52
|
|
50
53
|
$('.remove_fields.dynamic').live('click', function(e) {
|
54
|
+
trigger_removal_callback($(this));
|
51
55
|
e.preventDefault();
|
52
56
|
$(this).closest(".nested-fields").remove();
|
53
57
|
});
|
54
58
|
|
55
59
|
$('.remove_fields.existing').live('click', function(e) {
|
60
|
+
trigger_removal_callback($(this));
|
56
61
|
e.preventDefault();
|
57
62
|
$(this).prev("input[type=hidden]").val("1");
|
58
63
|
$(this).closest(".nested-fields").hide();
|
59
64
|
});
|
60
65
|
|
61
|
-
});
|
66
|
+
})(jQuery);
|
data/cocoon.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{cocoon}
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.13"
|
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 = %q{2011-
|
12
|
+
s.date = %q{2011-10-12}
|
13
13
|
s.description = %q{Unobtrusive nested forms handling, using jQuery. Use this and discover cocoon-heaven.}
|
14
14
|
s.email = %q{nathan@dixis.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,17 @@
|
|
1
1
|
# Configure Rails Envinronment
|
2
2
|
ENV["RAILS_ENV"] = "test"
|
3
3
|
|
4
|
+
# only start SimpleCov on ruby 1.9.x
|
5
|
+
if RUBY_VERSION[0..2].to_f >= 1.9
|
6
|
+
require 'simplecov'
|
7
|
+
SimpleCov.start
|
8
|
+
end
|
9
|
+
|
10
|
+
|
4
11
|
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
5
12
|
require "rails/test_help"
|
6
13
|
require "rspec/rails"
|
7
|
-
|
14
|
+
|
8
15
|
|
9
16
|
ActionMailer::Base.delivery_method = :test
|
10
17
|
ActionMailer::Base.perform_deliveries = true
|
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:
|
4
|
+
hash: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 13
|
10
|
+
version: 1.0.13
|
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: 2011-
|
18
|
+
date: 2011-10-12 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|