Skip to content

Commit 43a5616

Browse files
committed
WIP
1 parent 7812496 commit 43a5616

File tree

7 files changed

+114
-62
lines changed

7 files changed

+114
-62
lines changed
Lines changed: 73 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,80 @@
11
(function($) {
2+
var activeFormHelpers = {
3+
generateResourceId: function() {
4+
return new Date().getTime();
5+
},
6+
decodeHtml: function(input){
7+
var e = document.createElement('div');
8+
e.innerHTML = input;
9+
return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
10+
},
11+
};
212

3-
var createNewResourceID = function() {
4-
return new Date().getTime();
5-
}
13+
$.fn.removeFormField = function(nodeToDelete) {
14+
// maybe nodeToDelete could be field index
15+
16+
this.trigger('before-remove', [nodeToDelete]);
17+
18+
var timeout = this.data('remove-timeout') || 0;
19+
20+
console.log(nodeToDelete)
21+
var input = nodeToDelete.find("input").filter(function(i, t) {
22+
console.log(t, $(t).attr("name"))
23+
return false
24+
})
25+
26+
var context = this;
27+
setTimeout(function() {
28+
if (isDynamic) {
29+
nodeToDelete.remove();
30+
} else {
31+
nodeToDelete.find("input[type=hidden]").val("1");
32+
nodeToDelete.hide();
33+
}
34+
context.trigger('after-remove', [nodeToDelete]);
35+
}, timeout);
36+
37+
return this
38+
};
39+
40+
$.fn.addFormField = function(assoc, options) {
41+
if(options == undefined) {
42+
options = {}
43+
}
44+
var selector = "." + assoc + "_template";
45+
var contentTemplate = this.find(selector)
46+
47+
if(contentTemplate.length == 0) {
48+
contentTemplate = this.siblings().filter(selector)
49+
}
50+
51+
var newId = activeFormHelpers.generateResourceId();
52+
var regex = new RegExp("new_" + assoc, "g");
53+
var content = contentTemplate.text().replace(regex, newId);
54+
var contentNode = $(activeFormHelpers.decodeHtml(content));
55+
56+
if(!options.insertionMethod) {
57+
options.insertionMethod = 'before';
58+
}
59+
60+
this.trigger('before-insert', [contentNode]);
61+
62+
var addedContent = this[options.insertionMethod](contentNode);
63+
64+
this.trigger('after-insert', [contentNode]);
65+
66+
return this;
67+
};
668

769
$(document).on('click', '.add_fields', function(e) {
870
e.preventDefault();
971

1072
var $link = $(this);
73+
var form = $link.parents("form").eq(0);
1174
var assoc = $link.data('association');
12-
var content = $link.data('association-insertion-template');
13-
var insertionMethod = $link.data('association-insertion-method') || $link.data('association-insertion-position') || 'before';
75+
var insertionMethod = $link.data('association-insertion-method') || $link.data('association-insertion-position');
1476
var insertionNode = $link.data('association-insertion-node');
1577
var insertionTraversal = $link.data('association-insertion-traversal');
16-
var newId = createNewResourceID();
17-
var regex = new RegExp("new_" + assoc, "g");
18-
var newContent = content.replace(regex, newId);
1978

2079
if (insertionNode){
2180
if (insertionTraversal){
@@ -27,12 +86,10 @@
2786
insertionNode = $link.parent();
2887
}
2988

30-
var contentNode = $(newContent);
31-
insertionNode.trigger('before-insert', [contentNode]);
32-
33-
var addedContent = insertionNode[insertionMethod](contentNode);
34-
35-
insertionNode.trigger('after-insert', [contentNode]);
89+
insertionNode.addFormField(assoc, {
90+
insertionMethod: insertionMethod,
91+
insertionTraversal: insertionTraversal,
92+
})
3693
});
3794

3895
$(document).on('click', '.remove_fields.dynamic, .remove_fields.existing', function(e) {
@@ -41,21 +98,10 @@
4198
var $link = $(this);
4299
var wrapperClass = $link.data('wrapper-class') || 'nested-fields';
43100
var nodeToDelete = $link.closest('.' + wrapperClass);
44-
var triggerNode = nodeToDelete.parent();
45101

46-
triggerNode.trigger('before-remove', [nodeToDelete]);
47-
48-
var timeout = triggerNode.data('remove-timeout') || 0;
102+
var triggerNode = nodeToDelete.parent();
49103

50-
setTimeout(function() {
51-
if ($link.hasClass('dynamic')) {
52-
nodeToDelete.remove();
53-
} else {
54-
$link.prev("input[type=hidden]").val("1");
55-
nodeToDelete.hide();
56-
}
57-
triggerNode.trigger('after-remove', [nodeToDelete]);
58-
}, timeout);
104+
triggerNode.removeFormField(nodeToDelete, $link.hasClass('dynamic'))
59105
});
60106

61107
})(jQuery);

lib/active_form/view_helpers.rb

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ def link_to_remove_association(name, f, html_options={})
77

88
is_existing = f.object.persisted?
99
classes << (is_existing ? 'existing' : 'dynamic')
10-
10+
1111
wrapper_class = html_options.delete(:wrapper_class)
1212
html_options[:class] = [html_options[:class], classes.join(' ')].compact.join(' ')
1313
html_options[:'data-wrapper-class'] = wrapper_class if wrapper_class.present?
@@ -21,35 +21,38 @@ def link_to_remove_association(name, f, html_options={})
2121

2222
def render_association(association, f, new_object, render_options={}, custom_partial=nil)
2323
partial = get_partial_path(custom_partial, association)
24-
24+
2525
if f.respond_to?(:semantic_fields_for)
2626
method_name = :semantic_fields_for
2727
elsif f.respond_to?(:simple_fields_for)
2828
method_name = :simple_fields_for
2929
else
3030
method_name = :fields_for
3131
end
32-
32+
3333
f.send(method_name, association, new_object, {:child_index => "new_#{association}"}.merge(render_options)) do |builder|
3434
render(partial: partial, locals: {:f => builder})
3535
end
3636
end
3737

3838
def link_to_add_association(name, f, association, html_options={})
39-
render_options = html_options.delete(:render_options)
40-
render_options ||= {}
41-
override_partial = html_options.delete(:partial)
42-
4339
html_options[:class] = [html_options[:class], "add_fields"].compact.join(' ')
4440
html_options[:'data-association'] = association.to_s
4541

42+
link_to(name, '#', html_options)
43+
end
44+
45+
def render_association_template(f, association, html_options={})
46+
render_options = html_options.delete(:render_options)
47+
render_options ||= {}
48+
override_partial = html_options.delete(:partial)
4649
new_object = create_object(f, association)
4750

48-
html_options[:'data-association-insertion-template'] = CGI.escapeHTML(render_association(association, f, new_object, render_options, override_partial).to_str).html_safe
49-
50-
link_to(name, '#', html_options)
51+
content_tag :script, class: "association_template #{association}_template", type: "text/plain" do
52+
CGI.escapeHTML(render_association(association, f, new_object, render_options, override_partial)).html_safe
53+
end
5154
end
52-
55+
5356
def create_object(f, association)
5457
f.object.get_model(association)
5558
end

test/dummy/.ruby-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2.0.0-p451

test/dummy/app/assets/javascripts/projects.js

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,20 @@ $(document).ready(function() {
2323
$(".project-tag-fields a.add_fields").
2424
data("association-insertion-position", 'before').
2525
data("association-insertion-node", 'this');
26-
$('.project-tag-fields').bind('after-insert',
27-
function() {
28-
$(this).children("#tag_from_list").remove();
29-
$(this).children("a.add_fields").hide();
30-
});
3126
});
3227

28+
$("body").on('after-insert', '.project-tag-fields',
29+
function() {
30+
$(this).children("#tag_from_list").remove();
31+
$(this).children("a.add_fields").hide();
32+
});
33+
3334
$('#tasks').bind('before-insert', function(e,task_to_be_added) {
3435
task_to_be_added.fadeIn('slow');
3536
});
3637

37-
$('#tasks').bind('after-insert', function(e, added_task) {
38-
//added_task.css("background","red");
39-
});
40-
4138
$('#tasks').bind('before-remove', function(e, task) {
4239
$(this).data('remove-timeout', 1000);
4340
task.fadeOut('slow');
4441
})
45-
46-
$('body').tabs();
47-
});
42+
});

test/dummy/app/views/assignments/_form.html.erb

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@
1717
</div>
1818

1919
<h2>Tasks Details</h2>
20-
<%= f.fields_for :tasks do |task_fields| %>
21-
<%= render "task_fields", :f => task_fields %>
22-
<% end %>
2320

24-
<div class="links">
25-
<%= link_to_add_association "Add a Task", f, :tasks %>
21+
<div class="tasks_container">
22+
<%= f.fields_for :tasks do |task_fields| %>
23+
<%= render "task_fields", :f => task_fields %>
24+
<% end %>
25+
<%= render_association_template(f, :tasks) %>
2626
</div>
2727

28+
<!-- $(".tasks_container").addFormField("tasks", {insertionMethod: 'after'}) -->
29+
<!-- $(".tasks_container").removeFormField("tasks", $(".nested-fields").eq(3)) -->
30+
2831
<div class="actions">
2932
<%= f.submit %>
3033
</div>
31-
<% end %>
34+
<% end %>

test/dummy/app/views/projects/_form.html.erb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,22 @@
2121

2222
<div class="tab-content">
2323
<div id="tasks" class="active">
24+
<%= render_association_template f, :tasks, :render_options => { :wrapper => 'inline' } %>
2425
<%= f.simple_fields_for :tasks, wrapper: 'inline' do |task| %>
2526
<%= render 'task_fields', :f => task %>
2627
<% end %>
2728
<div class="links">
28-
<%= link_to_add_association 'add task', f, :tasks, :render_options => { :wrapper => 'inline' } %>
29+
<%= link_to_add_association 'add task', f, :tasks %>
2930
</div>
3031
</div>
3132

3233
<div id="people">
34+
<%= render_association_template f, :contributors, :render_options => { :wrapper => 'inline' } %>
3335
<%= f.simple_fields_for :contributors, wrapper: 'inline' do |contributor| %>
3436
<%= render 'contributor_fields', :f => contributor %>
3537
<% end %>
3638
<div class="links">
37-
<%= link_to_add_association 'add contributor', f, :contributors, :render_options => { :wrapper => 'inline' } %>
39+
<%= link_to_add_association 'add contributor', f, :contributors %>
3840
</div>
3941
</div>
4042

@@ -46,14 +48,15 @@
4648
</div>
4749

4850
<div id="tags">
51+
<%= render_association_template f, :project_tags, :render_options => { :wrapper => 'inline' } %>
4952
<%= f.simple_fields_for :project_tags, wrapper: 'inline' do |project_tag| %>
5053
<%= render 'project_tag_fields', :f => project_tag %>
5154
<% end %>
52-
<%= link_to_add_association 'add a tag', f, :project_tags, :render_options => { :wrapper => 'inline' } %>
55+
<%= link_to_add_association 'add a tag', f, :project_tags %>
5356
</div>
5457
</div>
5558

5659
<div class="actions">
5760
<%= f.button :submit, :disable_with => 'Please wait ...' %>
5861
</div>
59-
<% end %>
62+
<% end %>
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<div class="nested-fields project-tag-fields">
2+
<%= render_association_template f, :tag, :render_options => { :wrapper => 'inline' } %>
23
<div id="tag_from_list">
34
<%= f.association :tag, :collection => Tag.order(:name), :prompt => 'Choose an existing tag' %>
45
</div>
5-
<%= link_to_add_association 'or create a new tag', f, :tag, :render_options => { :wrapper => 'inline' } %>
6+
<%= link_to_add_association 'or create a new tag', f, :tag %>
67
<%= link_to_remove_association "remove tag", f %>
7-
</div>
8+
</div>

0 commit comments

Comments
 (0)