formnestic 1.0.0
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/.document +5 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/.watchr +31 -0
- data/Gemfile +27 -0
- data/Gemfile.lock +133 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +126 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/app/assets/.DS_Store +0 -0
- data/app/assets/javascripts/formnestic/formnestic.js +139 -0
- data/app/assets/stylesheets/formnestic/entypo.css.scss +327 -0
- data/app/assets/stylesheets/formnestic/entypo.eot +0 -0
- data/app/assets/stylesheets/formnestic/entypo.svg +296 -0
- data/app/assets/stylesheets/formnestic/entypo.ttf +0 -0
- data/app/assets/stylesheets/formnestic/entypo.woff +0 -0
- data/app/assets/stylesheets/formnestic/formnestic.css.scss +167 -0
- data/config/locales/formnestic.en.yml +8 -0
- data/formnestic.gemspec +112 -0
- data/lib/formnestic/form_builder/base_builder.rb +55 -0
- data/lib/formnestic/form_builder/list_form_builder.rb +30 -0
- data/lib/formnestic/form_builder/table_form_builder.rb +94 -0
- data/lib/formnestic/form_builder.rb +13 -0
- data/lib/formnestic/helpers/inputs_helper.rb +82 -0
- data/lib/formnestic/helpers.rb +9 -0
- data/lib/formnestic/inputs/base/labelling.rb +15 -0
- data/lib/formnestic/inputs/base/wrapping.rb +52 -0
- data/lib/formnestic/inputs/base.rb +12 -0
- data/lib/formnestic/inputs.rb +7 -0
- data/lib/formnestic.rb +72 -0
- data/lib/generators/formnestic/install_generator.rb +36 -0
- data/log/development.log +0 -0
- data/rwatchr +1 -0
- data/screenshots/list_form.png +0 -0
- data/screenshots/table_form.png +0 -0
- data/spec/helpers/nested_model_helper_spec.rb +277 -0
- data/spec/helpers/nested_model_list_helper_spec.rb +51 -0
- data/spec/inputs/boolean_input_spec.rb +223 -0
- data/spec/spec_helper.rb +553 -0
- data/spec/support/custom_macros.rb +528 -0
- data/spec/support/deferred_garbage_collection.rb +21 -0
- data/spec/support/deprecation.rb +6 -0
- data/spec/support/test_environment.rb +31 -0
- metadata +271 -0
data/.document
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/.watchr
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
def run_spec(file)
|
2
|
+
unless File.exist?(file)
|
3
|
+
puts "#{file} does not exist"
|
4
|
+
return
|
5
|
+
end
|
6
|
+
|
7
|
+
puts "Running #{file}"
|
8
|
+
system "rspec #{file} --backtrace"
|
9
|
+
puts
|
10
|
+
end
|
11
|
+
|
12
|
+
watch("spec/.*/*_spec\.rb") do |match|
|
13
|
+
run_spec match[0]
|
14
|
+
end
|
15
|
+
|
16
|
+
watch("app/(.*/.*)\.rb") do |match|
|
17
|
+
# run_spec %{spec/#{match[1]}_spec.rb}
|
18
|
+
run_spec "spec/helpers/nested_model_list_helper_spec.rb"
|
19
|
+
run_spec "spec/helpers/nested_model_helper_spec.rb"
|
20
|
+
end
|
21
|
+
|
22
|
+
watch("lib/(.*/.*)\.rb") do |match|
|
23
|
+
# run_spec %{spec/#{match[1]}_spec.rb}
|
24
|
+
run_spec "spec/helpers/nested_model_list_helper_spec.rb"
|
25
|
+
run_spec "spec/helpers/nested_model_helper_spec.rb"
|
26
|
+
end
|
27
|
+
|
28
|
+
watch("lib/.*\.rb") do |match|
|
29
|
+
run_spec "spec/helpers/nested_model_list_helper_spec.rb"
|
30
|
+
run_spec "spec/helpers/nested_model_helper_spec.rb"
|
31
|
+
end
|
data/Gemfile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
|
6
|
+
# Add dependencies to develop your gem here.
|
7
|
+
# Include everything needed to run rake, tests, features, etc.
|
8
|
+
|
9
|
+
group :development, :test do
|
10
|
+
gem "shoulda", ">= 0"
|
11
|
+
gem "bundler", "~> 1.0"
|
12
|
+
gem 'rdoc', '~> 3.4'
|
13
|
+
gem "jeweler", "~> 2.0.1"
|
14
|
+
gem 'rspec-rails', '~> 2.14.0'
|
15
|
+
gem 'rspec_tag_matchers', '>= 1.0.0'
|
16
|
+
gem 'tzinfo'
|
17
|
+
gem 'spork'
|
18
|
+
gem 'watchr'
|
19
|
+
end
|
20
|
+
|
21
|
+
group :test do
|
22
|
+
gem 'rake'
|
23
|
+
end
|
24
|
+
|
25
|
+
gem 'actionpack', '>= 3.2.13'
|
26
|
+
gem 'formtastic', "~> 2.2.1"
|
27
|
+
# gem 'formtastic', path: '../formtastic'
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
actionpack (3.2.18)
|
5
|
+
activemodel (= 3.2.18)
|
6
|
+
activesupport (= 3.2.18)
|
7
|
+
builder (~> 3.0.0)
|
8
|
+
erubis (~> 2.7.0)
|
9
|
+
journey (~> 1.0.4)
|
10
|
+
rack (~> 1.4.5)
|
11
|
+
rack-cache (~> 1.2)
|
12
|
+
rack-test (~> 0.6.1)
|
13
|
+
sprockets (~> 2.2.1)
|
14
|
+
activemodel (3.2.18)
|
15
|
+
activesupport (= 3.2.18)
|
16
|
+
builder (~> 3.0.0)
|
17
|
+
activesupport (3.2.18)
|
18
|
+
i18n (~> 0.6, >= 0.6.4)
|
19
|
+
multi_json (~> 1.0)
|
20
|
+
addressable (2.3.6)
|
21
|
+
builder (3.0.4)
|
22
|
+
descendants_tracker (0.0.4)
|
23
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
24
|
+
diff-lcs (1.2.5)
|
25
|
+
erubis (2.7.0)
|
26
|
+
faraday (0.9.0)
|
27
|
+
multipart-post (>= 1.2, < 3)
|
28
|
+
formtastic (2.2.1)
|
29
|
+
actionpack (>= 3.0)
|
30
|
+
git (1.2.7)
|
31
|
+
github_api (0.11.3)
|
32
|
+
addressable (~> 2.3)
|
33
|
+
descendants_tracker (~> 0.0.1)
|
34
|
+
faraday (~> 0.8, < 0.10)
|
35
|
+
hashie (>= 1.2)
|
36
|
+
multi_json (>= 1.7.5, < 2.0)
|
37
|
+
nokogiri (~> 1.6.0)
|
38
|
+
oauth2
|
39
|
+
hashie (3.0.0)
|
40
|
+
highline (1.6.21)
|
41
|
+
hike (1.2.3)
|
42
|
+
i18n (0.6.9)
|
43
|
+
jeweler (2.0.1)
|
44
|
+
builder
|
45
|
+
bundler (>= 1.0)
|
46
|
+
git (>= 1.2.5)
|
47
|
+
github_api
|
48
|
+
highline (>= 1.6.15)
|
49
|
+
nokogiri (>= 1.5.10)
|
50
|
+
rake
|
51
|
+
rdoc
|
52
|
+
journey (1.0.4)
|
53
|
+
json (1.8.1)
|
54
|
+
jwt (1.0.0)
|
55
|
+
mini_portile (0.6.0)
|
56
|
+
multi_json (1.10.1)
|
57
|
+
multi_xml (0.5.5)
|
58
|
+
multipart-post (2.0.0)
|
59
|
+
nokogiri (1.6.2.1)
|
60
|
+
mini_portile (= 0.6.0)
|
61
|
+
oauth2 (0.9.4)
|
62
|
+
faraday (>= 0.8, < 0.10)
|
63
|
+
jwt (~> 1.0)
|
64
|
+
multi_json (~> 1.3)
|
65
|
+
multi_xml (~> 0.5)
|
66
|
+
rack (~> 1.2)
|
67
|
+
rack (1.4.5)
|
68
|
+
rack-cache (1.2)
|
69
|
+
rack (>= 0.4)
|
70
|
+
rack-ssl (1.3.4)
|
71
|
+
rack
|
72
|
+
rack-test (0.6.2)
|
73
|
+
rack (>= 1.0)
|
74
|
+
railties (3.2.18)
|
75
|
+
actionpack (= 3.2.18)
|
76
|
+
activesupport (= 3.2.18)
|
77
|
+
rack-ssl (~> 1.3.2)
|
78
|
+
rake (>= 0.8.7)
|
79
|
+
rdoc (~> 3.4)
|
80
|
+
thor (>= 0.14.6, < 2.0)
|
81
|
+
rake (10.3.2)
|
82
|
+
rdoc (3.12.2)
|
83
|
+
json (~> 1.4)
|
84
|
+
rspec-core (2.14.8)
|
85
|
+
rspec-expectations (2.14.5)
|
86
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
87
|
+
rspec-mocks (2.14.6)
|
88
|
+
rspec-rails (2.14.2)
|
89
|
+
actionpack (>= 3.0)
|
90
|
+
activemodel (>= 3.0)
|
91
|
+
activesupport (>= 3.0)
|
92
|
+
railties (>= 3.0)
|
93
|
+
rspec-core (~> 2.14.0)
|
94
|
+
rspec-expectations (~> 2.14.0)
|
95
|
+
rspec-mocks (~> 2.14.0)
|
96
|
+
rspec_tag_matchers (1.0.0)
|
97
|
+
nokogiri (>= 1.4.0)
|
98
|
+
rspec-rails (>= 1.2.6)
|
99
|
+
shoulda (3.5.0)
|
100
|
+
shoulda-context (~> 1.0, >= 1.0.1)
|
101
|
+
shoulda-matchers (>= 1.4.1, < 3.0)
|
102
|
+
shoulda-context (1.2.1)
|
103
|
+
shoulda-matchers (2.6.1)
|
104
|
+
activesupport (>= 3.0.0)
|
105
|
+
spork (0.9.2)
|
106
|
+
sprockets (2.2.2)
|
107
|
+
hike (~> 1.2)
|
108
|
+
multi_json (~> 1.0)
|
109
|
+
rack (~> 1.0)
|
110
|
+
tilt (~> 1.1, != 1.3.0)
|
111
|
+
thor (0.19.1)
|
112
|
+
thread_safe (0.3.4)
|
113
|
+
tilt (1.4.1)
|
114
|
+
tzinfo (1.2.1)
|
115
|
+
thread_safe (~> 0.1)
|
116
|
+
watchr (0.7)
|
117
|
+
|
118
|
+
PLATFORMS
|
119
|
+
ruby
|
120
|
+
|
121
|
+
DEPENDENCIES
|
122
|
+
actionpack (>= 3.2.13)
|
123
|
+
bundler (~> 1.0)
|
124
|
+
formtastic (~> 2.2.1)
|
125
|
+
jeweler (~> 2.0.1)
|
126
|
+
rake
|
127
|
+
rdoc (~> 3.4)
|
128
|
+
rspec-rails (~> 2.14.0)
|
129
|
+
rspec_tag_matchers (>= 1.0.0)
|
130
|
+
shoulda
|
131
|
+
spork
|
132
|
+
tzinfo
|
133
|
+
watchr
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2014 Formnestic
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
# formnestic
|
2
|
+
|
3
|
+
[](https://travis-ci.org/jameshuynh/formnestic)
|
4
|
+
[](https://codeclimate.com/github/jameshuynh/formnestic)
|
5
|
+
|
6
|
+
An extension of famous [Formtastic Form Builder](https://github.com/justinfrench/formtastic) to make building nested and association form with nested model addable and removable ability extremely easy and simple.
|
7
|
+
|
8
|
+
### Compatibility
|
9
|
+
|
10
|
+
- Formnestic gem requires ``formtastic`` gem version ``2.2.1``
|
11
|
+
- Formnestic gem is Rails 3 and Rails 4 compatible
|
12
|
+
|
13
|
+
### Installation
|
14
|
+
|
15
|
+
Add Formnestic to your Gemfile and run ``bundle install``:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
gem "formnestic", '~> 1.0.0'
|
19
|
+
```
|
20
|
+
|
21
|
+
then run the installation
|
22
|
+
|
23
|
+
```bash
|
24
|
+
bundle exec rails g formnestic:install
|
25
|
+
```
|
26
|
+
|
27
|
+
### Features
|
28
|
+
|
29
|
+
- Table form with row addable and removable
|
30
|
+
- List form with entry addable and removable
|
31
|
+
|
32
|
+
### Usage
|
33
|
+
|
34
|
+
Usage for rails 3 and rails 4 are almost the same, the only difference is that in Rails 4, you will need to remove all the ``attr_accessible`` in Rails 3 and use strong parameters in rails controller.
|
35
|
+
|
36
|
+
Basically, you can now add the following options into ``semantic_fields_for`` call in Formtastic
|
37
|
+
|
38
|
+
- ``display_type``: If you want your nested form to have table style, you can supply in ``table`` string
|
39
|
+
- ``row_removable``: Allow nested model entry to be removed.
|
40
|
+
- ``row_addable``: Allow nested model entry to be added.
|
41
|
+
- ``min_entry``: Minimum number of nested model entries that is allowed. An alert will be shown if user tries to delete the last entry that meets this minumum number.
|
42
|
+
- ``max_entry``: Maximum number of nested model entries that is allowed. Add button will be hidden if user has already added enough entries.
|
43
|
+
- ``new_record_link_label``: The label to be displayed in the Add button.
|
44
|
+
- ``table_headers``: A two(2) dimensional arrays, in which each array is presenting a row in table header row. For instance:
|
45
|
+
|
46
|
+
```rb
|
47
|
+
[
|
48
|
+
[{label: 'Column 1', wrapper_html: {class: "big-column"}}, {label: 'Column 2'}],
|
49
|
+
[{attr: :name}, {attr: :description}],
|
50
|
+
]
|
51
|
+
```
|
52
|
+
|
53
|
+
will yield a table header with 2 rows. The first row has 2 columns labeled ``Column 1`` and ``Column 2`` respectively, the second row labelled respected attribute's name of the nested model.
|
54
|
+
|
55
|
+
The form view is the same between Rails 3 and Rails 4
|
56
|
+
|
57
|
+
```erb
|
58
|
+
<%= semantic_form_for @quiz_pool do |quiz_pool_form| %>
|
59
|
+
<%= quiz_pool_form.inputs do %>
|
60
|
+
<%= quiz_pool_form.input :title %>
|
61
|
+
<%= quiz_pool_form.input :description %>
|
62
|
+
<li>
|
63
|
+
<%= quiz_pool_form.semantic_fields_for :quiz_pool_questions, {
|
64
|
+
row_removable: true,
|
65
|
+
row_addable: true,
|
66
|
+
min_entry: 1,
|
67
|
+
max_entry: 5,
|
68
|
+
new_record_link_label: "+ question"
|
69
|
+
} do |quiz_pool_question_builder| %>
|
70
|
+
<%= quiz_pool_question_builder.inputs do %>
|
71
|
+
<%= quiz_pool_question_builder.input :description %>
|
72
|
+
<%= quiz_pool_question_builder.input :score %>
|
73
|
+
<% end %>
|
74
|
+
<% end %>
|
75
|
+
</li>
|
76
|
+
<% end %>
|
77
|
+
<%= quiz_pool_form.submit %>
|
78
|
+
<% end %>
|
79
|
+
```
|
80
|
+
|
81
|
+
See the usage for each of Rails version below for more details
|
82
|
+
|
83
|
+
#### Rails 3 Usage
|
84
|
+
|
85
|
+
- [Usage & Guideline](https://github.com/jameshuynh/formnestic/wiki/Rails-3-Guideline-and-Usage)
|
86
|
+
- [Sample project for Rails 3.2.18](https://github.com/jameshuynh/formnestic-sample-rails3)
|
87
|
+
|
88
|
+
#### Rails 4 Usage
|
89
|
+
|
90
|
+
- [Usage & Guideline](https://github.com/jameshuynh/formnestic/wiki/Rails-4-Guideline-and-Usage)
|
91
|
+
- [Sample project for Rails 4.1.1](https://github.com/jameshuynh/formnestic-sample-rails4)
|
92
|
+
|
93
|
+
|
94
|
+
#### Screenshots
|
95
|
+
|
96
|
+
##### Table Form
|
97
|
+
|
98
|
+
<p align="left" >
|
99
|
+
<img src="https://raw.githubusercontent.com/jameshuynh/formnestic/master/screenshots/table_form.png" alt="Table Form" title="Table Form">
|
100
|
+
</p>
|
101
|
+
|
102
|
+
#### List Form
|
103
|
+
|
104
|
+
<p align="left" >
|
105
|
+
<img src="https://raw.githubusercontent.com/jameshuynh/formnestic/master/screenshots/list_form.png" alt="List Form" title="List Form">
|
106
|
+
</p>
|
107
|
+
|
108
|
+
### Roadmap to version 2.0
|
109
|
+
|
110
|
+
- Sortable between nested model entry (including rows in a table)
|
111
|
+
- Delegator for alert view
|
112
|
+
- Ability to lock an entry
|
113
|
+
|
114
|
+
## Contributing to formnestic
|
115
|
+
|
116
|
+
- Contribution, Suggestion and Issues are very much appreciated :). Please also fork and send your pull request!
|
117
|
+
- Make sure to add tests for it when sending for pull requests. This is important so I don't break it in a future version unintentionally.
|
118
|
+
|
119
|
+
## Credits
|
120
|
+
|
121
|
+
- Big thanks to [Justin French](https://github.com/justinfrench) for bringing [Formtastic](https://github.com/justinfrench/formtastic) to our lives. It has enabled us to effectively code form much easier in rails and has enabled this gem to happen.
|
122
|
+
|
123
|
+
## Copyright
|
124
|
+
|
125
|
+
Copyright (c) 2014 James, released under the MIT license
|
126
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
begin
|
7
|
+
Bundler.setup(:default, :development)
|
8
|
+
rescue Bundler::BundlerError => e
|
9
|
+
$stderr.puts e.message
|
10
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
11
|
+
exit e.status_code
|
12
|
+
end
|
13
|
+
require 'rake'
|
14
|
+
|
15
|
+
require 'jeweler'
|
16
|
+
Jeweler::Tasks.new do |gem|
|
17
|
+
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
18
|
+
gem.name = "formnestic"
|
19
|
+
gem.homepage = "http://github.com/jameshuynh/formnestic"
|
20
|
+
gem.license = "MIT"
|
21
|
+
gem.summary = %Q{An extension of formtastic form builder gem}
|
22
|
+
gem.description = %Q{An extension of famous Formtastic Form Builder to make building nested and association form with nested model addable and removable ability extremely easy and simple}
|
23
|
+
gem.email = "james@rubify.com"
|
24
|
+
gem.authors = ["James"]
|
25
|
+
gem.version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
26
|
+
gem.files.exclude 'screenshots'
|
27
|
+
# dependencies defined in Gemfile
|
28
|
+
end
|
29
|
+
Jeweler::RubygemsDotOrgTasks.new
|
30
|
+
|
31
|
+
desc 'Test the formtastic plugin.'
|
32
|
+
RSpec::Core::RakeTask.new('spec') do |t|
|
33
|
+
t.pattern = FileList['spec/**/*_spec.rb']
|
34
|
+
end
|
35
|
+
|
36
|
+
desc 'Test the formtastic inputs.'
|
37
|
+
RSpec::Core::RakeTask.new('spec:inputs') do |t|
|
38
|
+
t.pattern = FileList['spec/inputs/*_spec.rb']
|
39
|
+
end
|
40
|
+
|
41
|
+
desc 'Test the formtastic plugin with specdoc formatting and colors'
|
42
|
+
RSpec::Core::RakeTask.new('specdoc') do |t|
|
43
|
+
t.pattern = FileList['spec/**/*_spec.rb']
|
44
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
Binary file
|
@@ -0,0 +1,139 @@
|
|
1
|
+
var Formnestic = {
|
2
|
+
getNumberOfShowingEntriesInATable: function(table) {
|
3
|
+
var counter = 0;
|
4
|
+
table.find('tbody:first').find("tr").each(function() {
|
5
|
+
var dom = $(this);
|
6
|
+
if(!dom.hasClass("formnestic-deleted-row") && !dom.hasClass("formnestic-table-no-border")) {
|
7
|
+
counter = counter + 1;
|
8
|
+
}//end if
|
9
|
+
});
|
10
|
+
return counter;
|
11
|
+
},
|
12
|
+
|
13
|
+
getNumberOfShowingEntriesInANestedModelContainer: function(listContainer) {
|
14
|
+
var counter = 0;
|
15
|
+
listContainer.children().each(function() {
|
16
|
+
var dom = $(this);
|
17
|
+
if(!dom.hasClass("formnestic-deleted-row")) {
|
18
|
+
counter = counter + 1;
|
19
|
+
}//end if
|
20
|
+
});
|
21
|
+
return counter;
|
22
|
+
},
|
23
|
+
|
24
|
+
removeAListEntry: function(deleteEntryLinkDom) {
|
25
|
+
deleteEntryLinkDom = $(deleteEntryLinkDom);
|
26
|
+
var listContainer = deleteEntryLinkDom.parents('div.formnestic-nested-model-container:first').find("div.formnestic-list-entries-container");
|
27
|
+
var nestedModelContainer = listContainer.parent();
|
28
|
+
|
29
|
+
var addRowLinkContainer = nestedModelContainer.find("div.formnestic-list-new-entry-link-container:first");
|
30
|
+
var numberOfShowingEntries = Formnestic.getNumberOfShowingEntriesInANestedModelContainer(listContainer);
|
31
|
+
var minNumberOfEntries = parseInt(nestedModelContainer.attr("min_entry"), 10);
|
32
|
+
var maxNumberOfEntries = parseInt(nestedModelContainer.attr("max_entry"), 10);
|
33
|
+
|
34
|
+
if (minNumberOfEntries !== -1 && numberOfShowingEntries <= minNumberOfEntries) {
|
35
|
+
return alert(nestedModelContainer.attr("min_entry_alert_message"));
|
36
|
+
}//end if
|
37
|
+
|
38
|
+
var entryContainer = deleteEntryLinkDom.parents("fieldset.inputs:first");
|
39
|
+
entryContainer.addClass("formnestic-deleted-row");
|
40
|
+
entryContainer.find(".formnestic-destroy-input").val("true");
|
41
|
+
|
42
|
+
var counter = this.addOddAndEventClassForListContainer(listContainer);
|
43
|
+
if (maxNumberOfEntries !== -1 && counter >= maxNumberOfEntries) {
|
44
|
+
addRowLinkContainer.addClass("formnestic-hidden");
|
45
|
+
} else {
|
46
|
+
addRowLinkContainer.removeClass("formnestic-hidden");
|
47
|
+
}//end else
|
48
|
+
|
49
|
+
entryContainer.fadeOut(function() {});
|
50
|
+
},
|
51
|
+
|
52
|
+
removeATableEntry: function(deleteEntryLinkDom) {
|
53
|
+
deleteEntryLinkDom = $(deleteEntryLinkDom);
|
54
|
+
var table = deleteEntryLinkDom.parents("table:first");
|
55
|
+
var addRowLink = table.find("a.formnestic-add-row-field-link:first");
|
56
|
+
var numberOfShowingEntries = Formnestic.getNumberOfShowingEntriesInATable(table);
|
57
|
+
var minNumberOfEntries = parseInt(table.attr("min_entry"), 10);
|
58
|
+
var maxNumberOfEntries = parseInt(table.attr("max_entry"), 10);
|
59
|
+
if (minNumberOfEntries !== -1 && numberOfShowingEntries <= minNumberOfEntries) {
|
60
|
+
return alert(table.attr("min_entry_alert_message"));
|
61
|
+
}//end if
|
62
|
+
|
63
|
+
var trContainer = deleteEntryLinkDom.parents("tr:first");
|
64
|
+
trContainer.find(".formnestic-destroy-input").val("true");
|
65
|
+
trContainer.addClass("formnestic-deleted-row");
|
66
|
+
var counter = this.addOddAndEvenClassForTable(table);
|
67
|
+
if (maxNumberOfEntries !== -1 && counter >= maxNumberOfEntries) {
|
68
|
+
addRowLink.addClass("formnestic-hidden");
|
69
|
+
} else {
|
70
|
+
addRowLink.removeClass("formnestic-hidden");
|
71
|
+
}//end else
|
72
|
+
trContainer.fadeOut(function() {});
|
73
|
+
},
|
74
|
+
|
75
|
+
addOddAndEventClassForListContainer: function(listContainer) {
|
76
|
+
var counter = 0;
|
77
|
+
listContainer.children().each(function() {
|
78
|
+
var dom = $(this);
|
79
|
+
if(!dom.hasClass("formnestic-deleted-row")) {
|
80
|
+
dom.removeClass("formnestic-odd-row formnestic-even-row").addClass(counter % 2 === 0 ? "formnestic-even-row" : "formnestic-odd-row");
|
81
|
+
var counterDom = dom.find("span.formnestic-li-fieldset-for-order:first");
|
82
|
+
counter = counter + 1;
|
83
|
+
counterDom.html(counter);
|
84
|
+
}
|
85
|
+
});
|
86
|
+
return counter;
|
87
|
+
},
|
88
|
+
|
89
|
+
addOddAndEvenClassForTable: function(table) {
|
90
|
+
var counter = 0;
|
91
|
+
$(table).find("tbody:first").find("tr").each(function() {
|
92
|
+
var trDom = $(this);
|
93
|
+
if(!trDom.hasClass('formnestic-deleted-row') && !trDom.hasClass("formnestic-table-no-border")) {
|
94
|
+
trDom.removeClass("formnestic-odd-row formnestic-even-row").addClass(counter % 2 === 0 ? "formnestic-even-row" : "formnestic-odd-row")
|
95
|
+
counter = counter + 1;
|
96
|
+
}
|
97
|
+
});
|
98
|
+
|
99
|
+
return counter;
|
100
|
+
},
|
101
|
+
|
102
|
+
addNewListEntry: function(linkDom, associationName, content) {
|
103
|
+
var newId = new Date().getTime();
|
104
|
+
var regexp = new RegExp("new_" + associationName, "g");
|
105
|
+
var linkDomContainer = $(linkDom).parent();
|
106
|
+
var listContainer = linkDomContainer.parents('div.formnestic-nested-model-container:first').find("div.formnestic-list-entries-container");
|
107
|
+
var nestedModelContainer = listContainer.parent();
|
108
|
+
var maxNumberOfEntries = parseInt(nestedModelContainer.attr('max_entry'), 10);
|
109
|
+
|
110
|
+
var entryContainer = $(content.replace(regexp, newId)).appendTo(listContainer);
|
111
|
+
var counter = this.addOddAndEventClassForListContainer(listContainer);
|
112
|
+
if (maxNumberOfEntries !== -1 && counter >= maxNumberOfEntries) {
|
113
|
+
linkDomContainer.addClass("formnestic-hidden");
|
114
|
+
} else {
|
115
|
+
linkDomContainer.removeClass("formnestic-hidden");
|
116
|
+
}//end else
|
117
|
+
|
118
|
+
entryContainer.css({display: 'none'}).fadeIn();
|
119
|
+
},
|
120
|
+
|
121
|
+
addNewTableEntry: function(linkDom, associationName, content) {
|
122
|
+
var newId = new Date().getTime();
|
123
|
+
var regexp = new RegExp("new_" + associationName, "g");
|
124
|
+
var linkDomjQuery = $(linkDom);
|
125
|
+
var table = linkDomjQuery.parents('table:first');
|
126
|
+
|
127
|
+
var entryContainer = $(content.replace(regexp, newId)).insertBefore(linkDomjQuery.parents("tr:first"));
|
128
|
+
|
129
|
+
var counter = this.addOddAndEvenClassForTable(table);
|
130
|
+
var maxNumberOfEntries = parseInt(table.attr('max_entry'), 10);
|
131
|
+
if (maxNumberOfEntries !== -1 && counter >= maxNumberOfEntries) {
|
132
|
+
linkDomjQuery.addClass("formnestic-hidden");
|
133
|
+
} else {
|
134
|
+
linkDomjQuery.removeClass("formnestic-hidden");
|
135
|
+
}//end else
|
136
|
+
|
137
|
+
entryContainer.css({display: 'none'}).fadeIn();
|
138
|
+
}
|
139
|
+
};
|