nested_form_im 0.2.0.1

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.
Files changed (66) hide show
  1. data/CHANGELOG.rdoc +34 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +94 -0
  4. data/Rakefile +29 -0
  5. data/lib/generators/nested_form/install_generator.rb +17 -0
  6. data/lib/nested_form.rb +1 -0
  7. data/lib/nested_form/builder_mixin.rb +70 -0
  8. data/lib/nested_form/builders.rb +23 -0
  9. data/lib/nested_form/engine.rb +14 -0
  10. data/lib/nested_form/view_helper.rb +42 -0
  11. data/spec/dummy/Rakefile +7 -0
  12. data/spec/dummy/app/assets/javascripts/application.js +5 -0
  13. data/spec/dummy/app/assets/javascripts/jquery.js +8981 -0
  14. data/spec/dummy/app/assets/javascripts/jquery_nested_form.js +71 -0
  15. data/spec/dummy/app/assets/javascripts/projects.js +2 -0
  16. data/spec/dummy/app/assets/javascripts/prototype.js +6082 -0
  17. data/spec/dummy/app/assets/javascripts/prototype_nested_form.js +51 -0
  18. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  19. data/spec/dummy/app/assets/stylesheets/projects.css +4 -0
  20. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  21. data/spec/dummy/app/controllers/projects_controller.rb +5 -0
  22. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  23. data/spec/dummy/app/helpers/projects_helper.rb +2 -0
  24. data/spec/dummy/app/models/milestone.rb +3 -0
  25. data/spec/dummy/app/models/project.rb +4 -0
  26. data/spec/dummy/app/models/task.rb +3 -0
  27. data/spec/dummy/app/views/layouts/application.html.erb +11 -0
  28. data/spec/dummy/app/views/projects/new.html.erb +14 -0
  29. data/spec/dummy/config.ru +4 -0
  30. data/spec/dummy/config/application.rb +42 -0
  31. data/spec/dummy/config/boot.rb +10 -0
  32. data/spec/dummy/config/database.yml +25 -0
  33. data/spec/dummy/config/environment.rb +5 -0
  34. data/spec/dummy/config/environments/development.rb +27 -0
  35. data/spec/dummy/config/environments/production.rb +54 -0
  36. data/spec/dummy/config/environments/test.rb +39 -0
  37. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  38. data/spec/dummy/config/initializers/inflections.rb +10 -0
  39. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  40. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  41. data/spec/dummy/config/initializers/session_store.rb +8 -0
  42. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  43. data/spec/dummy/config/locales/en.yml +5 -0
  44. data/spec/dummy/config/routes.rb +59 -0
  45. data/spec/dummy/db/development.sqlite3 +0 -0
  46. data/spec/dummy/db/migrate/20110710143903_initial_tables.rb +23 -0
  47. data/spec/dummy/db/schema.rb +29 -0
  48. data/spec/dummy/db/test.sqlite3 +0 -0
  49. data/spec/dummy/public/404.html +26 -0
  50. data/spec/dummy/public/422.html +26 -0
  51. data/spec/dummy/public/500.html +26 -0
  52. data/spec/dummy/public/favicon.ico +0 -0
  53. data/spec/dummy/public/javascripts/application.js +5 -0
  54. data/spec/dummy/public/javascripts/jquery.js +8981 -0
  55. data/spec/dummy/public/javascripts/jquery_nested_form.js +71 -0
  56. data/spec/dummy/public/javascripts/projects.js +2 -0
  57. data/spec/dummy/public/javascripts/prototype.js +6082 -0
  58. data/spec/dummy/public/javascripts/prototype_nested_form.js +51 -0
  59. data/spec/dummy/script/rails +6 -0
  60. data/spec/dummy/test/functional/projects_controller_test.rb +7 -0
  61. data/spec/dummy/test/unit/helpers/projects_helper_test.rb +4 -0
  62. data/spec/form_spec.rb +31 -0
  63. data/spec/nested_form/builder_spec.rb +42 -0
  64. data/spec/nested_form/view_helper_spec.rb +47 -0
  65. data/spec/spec_helper.rb +16 -0
  66. metadata +145 -0
@@ -0,0 +1,51 @@
1
+ document.observe('click', function(e, el) {
2
+ if (el = e.findElement('form a.add_nested_fields')) {
3
+ // Setup
4
+ var assoc = el.readAttribute('data-association'); // Name of child
5
+ var content = $(assoc + '_fields_blueprint').innerHTML; // Fields template
6
+
7
+ // Make the context correct by replacing new_<parents> with the generated ID
8
+ // of each of the parent objects
9
+ var context = (el.getOffsetParent('.fields').firstDescendant().readAttribute('name') || '').replace(new RegExp('\[[a-z]+\]$'), '');
10
+
11
+ // context will be something like this for a brand new form:
12
+ // project[tasks_attributes][new_1255929127459][assignments_attributes][new_1255929128105]
13
+ // or for an edit form:
14
+ // project[tasks_attributes][0][assignments_attributes][1]
15
+ if(context) {
16
+ var parent_names = context.match(/[a-z_]+_attributes/g) || [];
17
+ var parent_ids = context.match(/(new_)?[0-9]+/g) || [];
18
+
19
+ for(i = 0; i < parent_names.length; i++) {
20
+ if(parent_ids[i]) {
21
+ content = content.replace(
22
+ new RegExp('(_' + parent_names[i] + ')_.+?_', 'g'),
23
+ '$1_' + parent_ids[i] + '_');
24
+
25
+ content = content.replace(
26
+ new RegExp('(\\[' + parent_names[i] + '\\])\\[.+?\\]', 'g'),
27
+ '$1[' + parent_ids[i] + ']');
28
+ }
29
+ }
30
+ }
31
+
32
+ // Make a unique ID for the new child
33
+ var regexp = new RegExp('new_' + assoc, 'g');
34
+ var new_id = new Date().getTime();
35
+ content = content.replace(regexp, "new_" + new_id);
36
+
37
+ el.insert({ before: content });
38
+ return false;
39
+ }
40
+ });
41
+
42
+ document.observe('click', function(e, el) {
43
+ if (el = e.findElement('form a.remove_nested_fields')) {
44
+ var hidden_field = el.previous(0);
45
+ if(hidden_field) {
46
+ hidden_field.value = '1';
47
+ }
48
+ el.ancestors()[0].hide();
49
+ return false;
50
+ }
51
+ });
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class ProjectsControllerTest < ActionController::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ class ProjectsHelperTest < ActionView::TestCase
4
+ end
data/spec/form_spec.rb ADDED
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'NestedForm' do
4
+ include Capybara::DSL
5
+
6
+ def check_form
7
+ page.should have_no_css('form .fields input[id$=name]')
8
+ click_link 'Add new task'
9
+ page.should have_css('form .fields input[id$=name]', :count => 1)
10
+ find('form .fields input[id$=name]').should be_visible
11
+ find('form .fields input[id$=_destroy]').value.should == 'false'
12
+
13
+ click_link 'Remove'
14
+ find('form .fields input[id$=_destroy]').value.should == '1'
15
+ find('form .fields input[id$=name]').should_not be_visible
16
+
17
+ click_link 'Add new task'
18
+ click_link 'Add new task'
19
+ fields = all('form .fields')
20
+ fields.select { |field| field.visible? }.count.should == 2
21
+ fields.reject { |field| field.visible? }.count.should == 1
22
+ end
23
+
24
+ it 'should work with jQuery and Prototype', :js => true do
25
+ visit '/projects/new'
26
+ check_form
27
+
28
+ visit '/projects/new?type=prototype'
29
+ check_form
30
+ end
31
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ [NestedForm::Builder, NestedForm::SimpleBuilder, defined?(NestedForm::FormtasticBuilder) ? NestedForm::FormtasticBuilder : nil].compact.each do |builder|
4
+ describe builder do
5
+ describe "with no options" do
6
+ before(:each) do
7
+ @project = Project.new
8
+ @template = ActionView::Base.new
9
+ @template.output_buffer = ""
10
+ @builder = builder.new(:item, @project, @template, {}, proc {})
11
+ end
12
+
13
+ it "has an add link which behaves similar to a Rails link_to" do
14
+ @builder.link_to_add("Add", :tasks).should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks">Add</a>'
15
+ @builder.link_to_add("Add", :tasks, :class => "foo", :href => "url").should == '<a href="url" class="foo add_nested_fields" data-association="tasks">Add</a>'
16
+ @builder.link_to_add(:tasks) { "Add" }.should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks">Add</a>'
17
+ end
18
+
19
+ it "has a remove link which behaves similar to a Rails link_to" do
20
+ @builder.link_to_remove("Remove").should == '<input id="item__destroy" name="item[_destroy]" type="hidden" value="false" /><a href="javascript:void(0)" class="remove_nested_fields">Remove</a>'
21
+ @builder.link_to_remove("Remove", :class => "foo", :href => "url").should == '<input id="item__destroy" name="item[_destroy]" type="hidden" value="false" /><a href="url" class="foo remove_nested_fields">Remove</a>'
22
+ @builder.link_to_remove { "Remove" }.should == '<input id="item__destroy" name="item[_destroy]" type="hidden" value="false" /><a href="javascript:void(0)" class="remove_nested_fields">Remove</a>'
23
+ end
24
+
25
+ it "should wrap nested fields each in a div with class" do
26
+ 2.times { @project.tasks.build }
27
+ @builder.fields_for(:tasks) do
28
+ "Task"
29
+ end.should == '<div class="fields">Task</div><div class="fields">Task</div>'
30
+ end
31
+
32
+ it "should add task fields to hidden div after form" do
33
+ pending
34
+ output = ""
35
+ mock(@template).after_nested_form(:tasks) { |arg, block| output << block.call }
36
+ @builder.fields_for(:tasks) { "Task" }
37
+ @builder.link_to_add("Add", :tasks)
38
+ output.should == '<div id="tasks_fields_blueprint" style="display: none"><div class="fields">Task</div></div>'
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,47 @@
1
+ require "spec_helper"
2
+
3
+ describe NestedForm::ViewHelper do
4
+ include RSpec::Rails::HelperExampleGroup
5
+
6
+ before(:each) do
7
+ _routes.draw do
8
+ resources :projects
9
+ end
10
+ end
11
+
12
+ it "should pass nested form builder to form_for along with other options" do
13
+ pending
14
+ mock.proxy(_view).form_for(:first, :as => :second, :other => :arg, :builder => NestedForm::Builder) do |form_html|
15
+ form_html
16
+ end
17
+ _view.nested_form_for(:first, :as => :second, :other => :arg) {"form"}
18
+ end
19
+
20
+ it "should pass instance of NestedForm::Builder to nested_form_for block" do
21
+ _view.nested_form_for(Project.new) do |f|
22
+ f.should be_instance_of(NestedForm::Builder)
23
+ end
24
+ end
25
+
26
+ it "should pass instance of NestedForm::SimpleBuilder to simple_nested_form_for block" do
27
+ _view.simple_nested_form_for(Project.new) do |f|
28
+ f.should be_instance_of(NestedForm::SimpleBuilder)
29
+ end
30
+ end
31
+
32
+ if defined?(NestedForm::FormtasticBuilder)
33
+ it "should pass instance of NestedForm::FormtasticBuilder to semantic_nested_form_for block" do
34
+ _view.semantic_nested_form_for(Project.new) do |f|
35
+ f.should be_instance_of(NestedForm::FormtasticBuilder)
36
+ end
37
+ end
38
+ end
39
+
40
+ it "should append content to end of nested form" do
41
+ _view.after_nested_form(:tasks) { _view.concat("123") }
42
+ _view.after_nested_form(:milestones) { _view.concat("456") }
43
+ _view.nested_form_for(Project.new) {}
44
+ _view.output_buffer.should include("123456")
45
+ end
46
+ end
47
+
@@ -0,0 +1,16 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+ require 'rspec/rails'
6
+ require 'capybara/rspec'
7
+
8
+ Capybara.javascript_driver = :selenium
9
+ RSpec.configure do |config|
10
+ config.mock_with :mocha
11
+ end
12
+
13
+ Rails.backtrace_cleaner.remove_silencers!
14
+
15
+ # Load support files
16
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nested_form_im
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.2.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Ryan Bates
9
+ - Andrea Singh
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-07-03 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec-rails
17
+ version_requirements: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: 2.6.0
22
+ none: false
23
+ requirement: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 2.6.0
28
+ none: false
29
+ prerelease: false
30
+ type: :development
31
+ - !ruby/object:Gem::Dependency
32
+ name: mocha
33
+ version_requirements: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: !binary |-
38
+ MA==
39
+ none: false
40
+ requirement: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: !binary |-
45
+ MA==
46
+ none: false
47
+ prerelease: false
48
+ type: :development
49
+ description: Gem to conveniently handle multiple models in a single form with Rails 3 and jQuery or Prototype.
50
+ email: ryan@railscasts.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - lib/nested_form.rb
56
+ - lib/generators/nested_form/install_generator.rb
57
+ - lib/nested_form/builder_mixin.rb
58
+ - lib/nested_form/builders.rb
59
+ - lib/nested_form/engine.rb
60
+ - lib/nested_form/view_helper.rb
61
+ - spec/form_spec.rb
62
+ - spec/spec_helper.rb
63
+ - spec/dummy/config.ru
64
+ - spec/dummy/Rakefile
65
+ - spec/dummy/app/assets/javascripts/application.js
66
+ - spec/dummy/app/assets/javascripts/jquery.js
67
+ - spec/dummy/app/assets/javascripts/jquery_nested_form.js
68
+ - spec/dummy/app/assets/javascripts/projects.js
69
+ - spec/dummy/app/assets/javascripts/prototype.js
70
+ - spec/dummy/app/assets/javascripts/prototype_nested_form.js
71
+ - spec/dummy/app/assets/stylesheets/application.css
72
+ - spec/dummy/app/assets/stylesheets/projects.css
73
+ - spec/dummy/app/controllers/application_controller.rb
74
+ - spec/dummy/app/controllers/projects_controller.rb
75
+ - spec/dummy/app/helpers/application_helper.rb
76
+ - spec/dummy/app/helpers/projects_helper.rb
77
+ - spec/dummy/app/models/milestone.rb
78
+ - spec/dummy/app/models/project.rb
79
+ - spec/dummy/app/models/task.rb
80
+ - spec/dummy/app/views/layouts/application.html.erb
81
+ - spec/dummy/app/views/projects/new.html.erb
82
+ - spec/dummy/config/application.rb
83
+ - spec/dummy/config/boot.rb
84
+ - spec/dummy/config/database.yml
85
+ - spec/dummy/config/environment.rb
86
+ - spec/dummy/config/routes.rb
87
+ - spec/dummy/config/environments/development.rb
88
+ - spec/dummy/config/environments/production.rb
89
+ - spec/dummy/config/environments/test.rb
90
+ - spec/dummy/config/initializers/backtrace_silencers.rb
91
+ - spec/dummy/config/initializers/inflections.rb
92
+ - spec/dummy/config/initializers/mime_types.rb
93
+ - spec/dummy/config/initializers/secret_token.rb
94
+ - spec/dummy/config/initializers/session_store.rb
95
+ - spec/dummy/config/initializers/wrap_parameters.rb
96
+ - spec/dummy/config/locales/en.yml
97
+ - spec/dummy/db/development.sqlite3
98
+ - spec/dummy/db/schema.rb
99
+ - spec/dummy/db/test.sqlite3
100
+ - spec/dummy/db/migrate/20110710143903_initial_tables.rb
101
+ - spec/dummy/public/404.html
102
+ - spec/dummy/public/422.html
103
+ - spec/dummy/public/500.html
104
+ - spec/dummy/public/favicon.ico
105
+ - spec/dummy/public/javascripts/application.js
106
+ - spec/dummy/public/javascripts/jquery.js
107
+ - spec/dummy/public/javascripts/jquery_nested_form.js
108
+ - spec/dummy/public/javascripts/projects.js
109
+ - spec/dummy/public/javascripts/prototype.js
110
+ - spec/dummy/public/javascripts/prototype_nested_form.js
111
+ - spec/dummy/script/rails
112
+ - spec/dummy/test/functional/projects_controller_test.rb
113
+ - spec/dummy/test/unit/helpers/projects_helper_test.rb
114
+ - spec/nested_form/builder_spec.rb
115
+ - spec/nested_form/view_helper_spec.rb
116
+ - CHANGELOG.rdoc
117
+ - LICENSE
118
+ - Rakefile
119
+ - README.rdoc
120
+ homepage: http://github.com/intentmedia/nested_form
121
+ licenses: []
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: !binary |-
131
+ MA==
132
+ none: false
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 1.3.4
138
+ none: false
139
+ requirements: []
140
+ rubyforge_project: nested_form_im
141
+ rubygems_version: 1.8.24
142
+ signing_key:
143
+ specification_version: 3
144
+ summary: Gem to conveniently handle multiple models in a single form.
145
+ test_files: []