diff --git a/.gitignore b/.gitignore index 89cbc761..a0fc6ce7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ Gemfile.lock .bundle log gemfiles +/.idea/ diff --git a/lib/generators/nested_form/templates/jquery_nested_form.js b/lib/generators/nested_form/templates/jquery_nested_form.js index 669fabf9..c807122a 100644 --- a/lib/generators/nested_form/templates/jquery_nested_form.js +++ b/lib/generators/nested_form/templates/jquery_nested_form.js @@ -4,6 +4,9 @@ jQuery(function($) { var assoc = $(this).attr('data-association'); // Name of child var content = $('#' + assoc + '_fields_blueprint').html(); // Fields template + var insert_node = $(this).attr('data-insert-node') || this; // Insertion Node + var insert_position = $(this).attr('data-insert-position') || 'before'; // Insertion Position + // Make the context correct by replacing new_ with the generated ID // of each of the parent objects var context = ($(this).closest('.fields').find('input:first').attr('name') || '').replace(new RegExp('\[[a-z]+\]$'), ''); @@ -34,7 +37,26 @@ jQuery(function($) { var new_id = new Date().getTime(); content = content.replace(regexp, "new_" + new_id); - var field = $(content).insertBefore(this); + + insert_node = $(this).closest("form").find(insert_node); +// var field = $(content).insertBefore(this); + switch(insert_position){ + case 'before': + var field = $(content).insertBefore(insert_node); + break; + case 'after': + var field = $(content).insertAfter(insert_node); + break; + case 'top': + var field = $(content).prependTo(insert_node); + break; + case 'bottom': + var field = $(content).appendTo(insert_node); + break; + default: + var field = $(content).insertBefore(this); + } + $(this).closest("form").trigger({type: 'nested:fieldAdded', field: field}); return false; }); diff --git a/lib/generators/nested_form/templates/prototype_nested_form.js b/lib/generators/nested_form/templates/prototype_nested_form.js index d17a4f1e..3fb9947e 100644 --- a/lib/generators/nested_form/templates/prototype_nested_form.js +++ b/lib/generators/nested_form/templates/prototype_nested_form.js @@ -4,6 +4,9 @@ document.observe('click', function(e, el) { var assoc = el.readAttribute('data-association'); // Name of child var content = $(assoc + '_fields_blueprint').innerHTML; // Fields template + var insert_node = el.readAttribute('data-insert-node') || el; // Insertion Node + var insert_position = el.readAttribute('data-insert-position') || 'before'; // Insertion Position + // Make the context correct by replacing new_ with the generated ID // of each of the parent objects var context = (el.getOffsetParent('.fields').firstDescendant().readAttribute('name') || '').replace(new RegExp('\[[a-z]+\]$'), ''); @@ -34,7 +37,8 @@ document.observe('click', function(e, el) { var new_id = new Date().getTime(); content = content.replace(regexp, "new_" + new_id); - el.insert({ before: content }); + if (Object.isString(insert_node)) insert_node = e.findElement('form '+insert_node) + insert_node.insert({ insert_position: content }); return false; } }); diff --git a/lib/nested_form/builder_mixin.rb b/lib/nested_form/builder_mixin.rb index e01011a9..98adaa8b 100644 --- a/lib/nested_form/builder_mixin.rb +++ b/lib/nested_form/builder_mixin.rb @@ -16,6 +16,10 @@ def link_to_add(*args, &block) association = args.pop options[:class] = [options[:class], "add_nested_fields"].compact.join(" ") options["data-association"] = association + + options["data-insert-node"] = options.delete(:node) + options["data-insert-position"] = options.delete(:position) + args << (options.delete(:href) || "javascript:void(0)") args << options @fields ||= {} diff --git a/nested_form.gemspec b/nested_form.gemspec index ff8b658d..5486ac08 100644 --- a/nested_form.gemspec +++ b/nested_form.gemspec @@ -12,7 +12,7 @@ Gem::Specification.new do |s| s.add_development_dependency "rspec-rails", "~> 2.6.0" s.add_development_dependency "mocha" - # s.add_development_dependency "rails", "~> 3.1.0.rc" + s.add_development_dependency "rails", "~> 3.0.8" s.rubyforge_project = s.name s.required_rubygems_version = ">= 1.3.4" diff --git a/spec/nested_form/builder_spec.rb b/spec/nested_form/builder_spec.rb index 73617773..4da097e7 100644 --- a/spec/nested_form/builder_spec.rb +++ b/spec/nested_form/builder_spec.rb @@ -16,6 +16,12 @@ @builder.link_to_add(:tasks) { "Add" }.should == 'Add' end + it "has an add link with positionable attributes" do + @builder.link_to_add("Add", :tasks, :position => :before).should == 'Add' + @builder.link_to_add("Add", :tasks, :node => 'table').should == 'Add' + @builder.link_to_add("Add", :tasks, :node => 'table', :position => :before).should == 'Add' + end + it "has a remove link which behaves similar to a Rails link_to" do @builder.link_to_remove("Remove").should == 'Remove' @builder.link_to_remove("Remove", :class => "foo", :href => "url").should == 'Remove'