cocooned 1.3.0 → 1.3.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.
@@ -1,3 +1,5 @@
1
1
  /*
2
2
  *= require cocooned
3
3
  */
4
+
5
+ /* TODO: Remove in 2.0 */
data/cocooned.gemspec CHANGED
@@ -23,7 +23,9 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.require_paths = ['lib']
25
25
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
- f.match(%r{^(test|spec|features)/})
26
+ f.match(%r{^(config|gemfiles|npm|spec)/}) ||
27
+ %w[.gitignore .rspec .travis.yml].include?(f) ||
28
+ %w[Gemfile Gemfile.lock package.json yarn.lock].include?(f)
27
29
  end
28
30
 
29
31
  spec.add_dependency 'rails', '>= 4.0', '<= 6.0'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cocooned
4
- VERSION = '1.3.0'
4
+ VERSION = '1.3.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocooned
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gaël-Ian Havard
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-08-17 00:00:00.000000000 Z
12
+ date: 2018-08-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -123,29 +123,15 @@ executables: []
123
123
  extensions: []
124
124
  extra_rdoc_files: []
125
125
  files:
126
- - ".gitignore"
127
- - ".rspec"
128
- - ".travis.yml"
129
- - Gemfile
130
- - Gemfile.lock
131
126
  - History.md
132
127
  - LICENSE
133
128
  - README.md
134
129
  - Rakefile
135
130
  - app/assets/javascripts/cocoon.js
136
131
  - app/assets/javascripts/cocooned.js
137
- - app/assets/javascripts/cocooned/core.js
138
- - app/assets/javascripts/cocooned/jquery/onload.js
139
- - app/assets/javascripts/cocooned/jquery/plugin.js
140
- - app/assets/javascripts/cocooned/plugins/limit.js
141
- - app/assets/javascripts/cocooned/plugins/reorderable.js
142
132
  - app/assets/stylesheets/cocoon.css
143
133
  - app/assets/stylesheets/cocooned.css
144
134
  - cocooned.gemspec
145
- - config/linters/js.json
146
- - config/linters/ruby.yml
147
- - gemfiles/Gemfile.rails-4
148
- - gemfiles/Gemfile.rails-5
149
135
  - lib/cocooned.rb
150
136
  - lib/cocooned/association_builder.rb
151
137
  - lib/cocooned/helpers.rb
@@ -153,8 +139,6 @@ files:
153
139
  - lib/cocooned/helpers/deprecate.rb
154
140
  - lib/cocooned/railtie.rb
155
141
  - lib/cocooned/version.rb
156
- - package.json
157
- - yarn.lock
158
142
  homepage: http://github.com/notus-sh/cocooned
159
143
  licenses:
160
144
  - Apache-2.0
data/.gitignore DELETED
@@ -1,15 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /doc/
6
- /pkg/
7
- /spec/reports/
8
- /tmp/
9
-
10
- /node_modules/
11
- /vendor/bundle/
12
-
13
- spec/dummy/db/*.sqlite3
14
- spec/dummy/log/*.log
15
- spec/dummy/tmp/
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --require spec_helper
data/.travis.yml DELETED
@@ -1,14 +0,0 @@
1
- sudo: false
2
- cache: bundler
3
- language: ruby
4
- rvm:
5
- - 2.2.10
6
- - 2.3.7
7
- - 2.4.4
8
- - 2.5.1
9
- gemfile:
10
- - gemfiles/Gemfile.rails-4
11
- - gemfiles/Gemfile.rails-5
12
-
13
- matrix:
14
- fast_finish: true
data/Gemfile DELETED
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'http://rubygems.org'
4
-
5
- # Specify your gem's dependencies in cocooned.gemspec
6
- gemspec
7
-
8
- group :development, :test do
9
- # Dummy app dependencies
10
- gem 'jquery-rails'
11
- gem 'rails', '~> 5.0'
12
- gem 'sqlite3'
13
-
14
- gem 'nokogiri'
15
- gem 'simplecov', require: false
16
- end
data/Gemfile.lock DELETED
@@ -1,194 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- cocooned (1.3.0)
5
- rails (>= 4.0, <= 6.0)
6
-
7
- GEM
8
- remote: http://rubygems.org/
9
- specs:
10
- actioncable (5.2.1)
11
- actionpack (= 5.2.1)
12
- nio4r (~> 2.0)
13
- websocket-driver (>= 0.6.1)
14
- actionmailer (5.2.1)
15
- actionpack (= 5.2.1)
16
- actionview (= 5.2.1)
17
- activejob (= 5.2.1)
18
- mail (~> 2.5, >= 2.5.4)
19
- rails-dom-testing (~> 2.0)
20
- actionpack (5.2.1)
21
- actionview (= 5.2.1)
22
- activesupport (= 5.2.1)
23
- rack (~> 2.0)
24
- rack-test (>= 0.6.3)
25
- rails-dom-testing (~> 2.0)
26
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
27
- actionview (5.2.1)
28
- activesupport (= 5.2.1)
29
- builder (~> 3.1)
30
- erubi (~> 1.4)
31
- rails-dom-testing (~> 2.0)
32
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
33
- activejob (5.2.1)
34
- activesupport (= 5.2.1)
35
- globalid (>= 0.3.6)
36
- activemodel (5.2.1)
37
- activesupport (= 5.2.1)
38
- activerecord (5.2.1)
39
- activemodel (= 5.2.1)
40
- activesupport (= 5.2.1)
41
- arel (>= 9.0)
42
- activestorage (5.2.1)
43
- actionpack (= 5.2.1)
44
- activerecord (= 5.2.1)
45
- marcel (~> 0.3.1)
46
- activesupport (5.2.1)
47
- concurrent-ruby (~> 1.0, >= 1.0.2)
48
- i18n (>= 0.7, < 2)
49
- minitest (~> 5.1)
50
- tzinfo (~> 1.1)
51
- arel (9.0.0)
52
- ast (2.4.0)
53
- builder (3.2.3)
54
- concurrent-ruby (1.0.5)
55
- crass (1.0.4)
56
- diff-lcs (1.3)
57
- docile (1.3.1)
58
- erubi (1.7.1)
59
- globalid (0.4.1)
60
- activesupport (>= 4.2.0)
61
- i18n (1.1.0)
62
- concurrent-ruby (~> 1.0)
63
- jaro_winkler (1.5.1)
64
- jasmine (3.2.0)
65
- jasmine-core (= 3.2.0)
66
- phantomjs
67
- rack (>= 1.2.1)
68
- rake
69
- jasmine-core (3.2.0)
70
- jquery-rails (4.3.3)
71
- rails-dom-testing (>= 1, < 3)
72
- railties (>= 4.2.0)
73
- thor (>= 0.14, < 2.0)
74
- json (2.1.0)
75
- loofah (2.2.2)
76
- crass (~> 1.0.2)
77
- nokogiri (>= 1.5.9)
78
- mail (2.7.0)
79
- mini_mime (>= 0.1.1)
80
- marcel (0.3.2)
81
- mimemagic (~> 0.3.2)
82
- method_source (0.9.0)
83
- mimemagic (0.3.2)
84
- mini_mime (1.0.1)
85
- mini_portile2 (2.3.0)
86
- minitest (5.11.3)
87
- nio4r (2.3.1)
88
- nokogiri (1.8.4)
89
- mini_portile2 (~> 2.3.0)
90
- parallel (1.12.1)
91
- parser (2.5.1.2)
92
- ast (~> 2.4.0)
93
- phantomjs (2.1.1.0)
94
- powerpack (0.1.2)
95
- rack (2.0.5)
96
- rack-test (1.1.0)
97
- rack (>= 1.0, < 3)
98
- rails (5.2.1)
99
- actioncable (= 5.2.1)
100
- actionmailer (= 5.2.1)
101
- actionpack (= 5.2.1)
102
- actionview (= 5.2.1)
103
- activejob (= 5.2.1)
104
- activemodel (= 5.2.1)
105
- activerecord (= 5.2.1)
106
- activestorage (= 5.2.1)
107
- activesupport (= 5.2.1)
108
- bundler (>= 1.3.0)
109
- railties (= 5.2.1)
110
- sprockets-rails (>= 2.0.0)
111
- rails-dom-testing (2.0.3)
112
- activesupport (>= 4.2.0)
113
- nokogiri (>= 1.6)
114
- rails-html-sanitizer (1.0.4)
115
- loofah (~> 2.2, >= 2.2.2)
116
- railties (5.2.1)
117
- actionpack (= 5.2.1)
118
- activesupport (= 5.2.1)
119
- method_source
120
- rake (>= 0.8.7)
121
- thor (>= 0.19.0, < 2.0)
122
- rainbow (3.0.0)
123
- rake (12.3.1)
124
- rspec (3.8.0)
125
- rspec-core (~> 3.8.0)
126
- rspec-expectations (~> 3.8.0)
127
- rspec-mocks (~> 3.8.0)
128
- rspec-core (3.8.0)
129
- rspec-support (~> 3.8.0)
130
- rspec-expectations (3.8.1)
131
- diff-lcs (>= 1.2.0, < 2.0)
132
- rspec-support (~> 3.8.0)
133
- rspec-mocks (3.8.0)
134
- diff-lcs (>= 1.2.0, < 2.0)
135
- rspec-support (~> 3.8.0)
136
- rspec-rails (3.8.0)
137
- actionpack (>= 3.0)
138
- activesupport (>= 3.0)
139
- railties (>= 3.0)
140
- rspec-core (~> 3.8.0)
141
- rspec-expectations (~> 3.8.0)
142
- rspec-mocks (~> 3.8.0)
143
- rspec-support (~> 3.8.0)
144
- rspec-support (3.8.0)
145
- rubocop (0.58.2)
146
- jaro_winkler (~> 1.5.1)
147
- parallel (~> 1.10)
148
- parser (>= 2.5, != 2.5.1.1)
149
- powerpack (~> 0.1)
150
- rainbow (>= 2.2.2, < 4.0)
151
- ruby-progressbar (~> 1.7)
152
- unicode-display_width (~> 1.0, >= 1.0.1)
153
- ruby-progressbar (1.10.0)
154
- simplecov (0.16.1)
155
- docile (~> 1.1)
156
- json (>= 1.8, < 3)
157
- simplecov-html (~> 0.10.0)
158
- simplecov-html (0.10.2)
159
- sprockets (3.7.2)
160
- concurrent-ruby (~> 1.0)
161
- rack (> 1, < 3)
162
- sprockets-rails (3.2.1)
163
- actionpack (>= 4.0)
164
- activesupport (>= 4.0)
165
- sprockets (>= 3.0.0)
166
- sqlite3 (1.3.13)
167
- thor (0.20.0)
168
- thread_safe (0.3.6)
169
- tzinfo (1.2.5)
170
- thread_safe (~> 0.1)
171
- unicode-display_width (1.4.0)
172
- websocket-driver (0.7.0)
173
- websocket-extensions (>= 0.1.0)
174
- websocket-extensions (0.1.3)
175
-
176
- PLATFORMS
177
- ruby
178
-
179
- DEPENDENCIES
180
- bundler (~> 1.16)
181
- cocooned!
182
- jasmine (~> 3.2)
183
- jquery-rails
184
- nokogiri
185
- rails (~> 5.0)
186
- rake
187
- rspec (~> 3.8.0)
188
- rspec-rails (~> 3.8.0)
189
- rubocop
190
- simplecov
191
- sqlite3
192
-
193
- BUNDLED WITH
194
- 1.16.2
@@ -1,284 +0,0 @@
1
- var Cocooned = function (container, options) {
2
- this.container = jQuery(container);
3
- this.options = jQuery.extend({}, this.defaultOptions(), (options || {}));
4
-
5
- // Autoload plugins
6
- for (var moduleName in Cocooned.Plugins) {
7
- if (Cocooned.Plugins.hasOwnProperty(moduleName)) {
8
- var module = Cocooned.Plugins[moduleName];
9
- var optionName = moduleName.charAt(0).toLowerCase() + moduleName.slice(1);
10
-
11
- if (this.options[optionName]) {
12
- for (var method in module) {
13
- if (module.hasOwnProperty(method) && typeof module[method] === 'function') {
14
- this[method] = module[method];
15
- }
16
- }
17
- }
18
- }
19
- }
20
-
21
- this.init();
22
- };
23
-
24
- Cocooned.Plugins = {};
25
- Cocooned.prototype = {
26
-
27
- elementsCounter: 0,
28
-
29
- // Compatibility with Cocoon
30
- // TODO: Remove in 2.0 (Only Cocoon namespaces).
31
- namespaces: {
32
- events: ['cocooned', 'cocoon']
33
- },
34
-
35
- // Compatibility with Cocoon
36
- // TODO: Remove in 2.0 (Only Cocoon class names).
37
- classes: {
38
- // Actions link
39
- add: ['cocooned-add', 'add_fields'],
40
- remove: ['cocooned-remove', 'remove_fields'],
41
- up: ['cocooned-move-up'],
42
- down: ['cocooned-move-down'],
43
- // Containers
44
- container: ['cocooned-container'],
45
- item: ['cocooned-item', 'nested-fields'],
46
- },
47
-
48
- defaultOptions: function () {
49
- var options = {};
50
-
51
- for (var moduleName in Cocooned.Plugins) {
52
- if (Cocooned.Plugins.hasOwnProperty(moduleName)) {
53
- var module = Cocooned.Plugins[moduleName];
54
- var optionName = moduleName.charAt(0).toLowerCase() + moduleName.slice(1);
55
-
56
- options[optionName] = module.defaultOptionValue;
57
- }
58
- }
59
-
60
- return options;
61
- },
62
-
63
- notify: function (node, eventType, eventData) {
64
- return !(this.namespaces.events.some(function(namespace) {
65
- var namespacedEventType = [namespace, eventType].join(':');
66
- var event = jQuery.Event(namespacedEventType, eventData);
67
-
68
- node.trigger(event, [eventData.node, eventData.cocooned]);
69
-
70
- return (event.isPropagationStopped() || event.isDefaultPrevented());
71
- }));
72
- },
73
-
74
- selector: function (type, selector) {
75
- var s = selector || '&';
76
- return this.classes[type].map(function(klass) { return s.replace(/&/, '.' + klass); }).join(', ');
77
- },
78
-
79
- namespacedNativeEvents: function (type) {
80
- var namespaces = this.namespaces.events.map(function(ns) { return '.' + ns; });
81
- namespaces.unshift(type);
82
- return namespaces.join('');
83
- },
84
-
85
- buildId: function () {
86
- return (new Date().getTime() + this.elementsCounter++);
87
- },
88
-
89
- buildContentNode: function (content) {
90
- var id = this.buildId();
91
- var html = (content || this.content);
92
- var braced = '[' + id + ']';
93
- var underscored = '_' + id + '_';
94
-
95
- ['associations', 'association'].forEach(function (a) {
96
- html = html.replace(this.regexps[a]['braced'], braced + '$1');
97
- html = html.replace(this.regexps[a]['underscored'], underscored + '$1');
98
- }, this);
99
-
100
- return $(html);
101
- },
102
-
103
- getInsertionNode: function (adder) {
104
- var $adder = $(adder);
105
- var insertionNode = $adder.data('association-insertion-node');
106
- var insertionTraversal = $adder.data('association-insertion-traversal');
107
-
108
- if (!insertionNode) {
109
- return $adder.parent();
110
- }
111
-
112
- if (typeof insertionNode === 'function') {
113
- return insertionNode($adder);
114
- }
115
-
116
- if (insertionTraversal) {
117
- return $adder[insertionTraversal](insertionNode);
118
- }
119
-
120
- return insertionNode === 'this' ? $adder : $(insertionNode);
121
- },
122
-
123
- getInsertionMethod: function (adder) {
124
- var $adder = $(adder);
125
- return $adder.data('association-insertion-method') || 'before';
126
- },
127
-
128
- getItems: function (selector) {
129
- selector = selector || '';
130
- var self = this;
131
- return $(this.selector('item', selector), this.container).filter(function () {
132
- return ($(this).closest(self.selector('container')).get(0) === self.container.get(0));
133
- });
134
- },
135
-
136
- findContainer: function (addLink) {
137
- var $adder = $(addLink);
138
- var insertionNode = this.getInsertionNode($adder);
139
- var insertionMethod = this.getInsertionMethod($adder);
140
-
141
- switch (insertionMethod) {
142
- case 'before':
143
- case 'after':
144
- case 'replaceWith':
145
- return insertionNode.parent();
146
-
147
- case 'append':
148
- case 'prepend':
149
- default:
150
- return insertionNode;
151
- }
152
- },
153
-
154
- findItem: function (removeLink) {
155
- return $(removeLink).closest(this.selector('item'));
156
- },
157
-
158
- init: function () {
159
- var self = this;
160
-
161
- this.addLinks = $(this.selector('add')).filter(function () {
162
- var container = self.findContainer(this);
163
- return (container.get(0) === self.container.get(0));
164
- });
165
-
166
- var addLink = $(this.addLinks.get(0));
167
-
168
- this.content = addLink.data('association-insertion-template');
169
- this.regexps = {
170
- association: {
171
- braced: new RegExp('\\[new_' + addLink.data('association') + '\\](.*?\\s)', 'g'),
172
- underscored: new RegExp('_new_' + addLink.data('association') + '_(\\w*)', 'g')
173
- },
174
- associations: {
175
- braced: new RegExp('\\[new_' + addLink.data('associations') + '\\](.*?\\s)', 'g'),
176
- underscored: new RegExp('_new_' + addLink.data('associations') + '_(\\w*)', 'g')
177
- }
178
- };
179
-
180
- this.initUi();
181
- this.bindEvents();
182
- },
183
-
184
- initUi: function () {
185
- var self = this;
186
-
187
- if (!this.container.attr('id')) {
188
- this.container.attr('id', this.buildId());
189
- }
190
- this.container.addClass(this.classes['container'].join(' '));
191
-
192
- $(function () { self.hideMarkedForDestruction(); });
193
- $(document).on('page:load turbolinks:load', function () { self.hideMarkedForDestruction(); });
194
- },
195
-
196
- bindEvents: function () {
197
- var self = this;
198
-
199
- // Bind add links
200
- this.addLinks.on(
201
- this.namespacedNativeEvents('click'),
202
- function (e) {
203
- e.preventDefault();
204
- self.add(this);
205
- });
206
-
207
- // Bind remove links
208
- // (Binded on document instead of container to not bypass click handler defined in jquery_ujs)
209
- $(document).on(
210
- this.namespacedNativeEvents('click'),
211
- this.selector('remove', '#' + this.container.attr('id') + ' &'),
212
- function (e) {
213
- e.preventDefault();
214
- self.remove(this);
215
- });
216
-
217
- // Bind options events
218
- $.each(this.options, function (name, value) {
219
- var bindMethod = 'bind' + name.charAt(0).toUpperCase() + name.slice(1);
220
- if (value && self[bindMethod]) {
221
- self[bindMethod]();
222
- }
223
- });
224
- },
225
-
226
- add: function (adder) {
227
- var $adder = $(adder);
228
- var insertionMethod = this.getInsertionMethod($adder);
229
- var insertionNode = this.getInsertionNode($adder);
230
- var contentTemplate = $adder.data('association-insertion-template');
231
- var count = parseInt($adder.data('count'), 10) || 1;
232
-
233
- for (var i = 0; i < count; i++) {
234
- var contentNode = this.buildContentNode(contentTemplate);
235
- var eventData = { link: $adder, node: contentNode, cocooned: this };
236
- var afterNode = (insertionMethod === 'replaceWith' ? contentNode : insertionNode);
237
-
238
- // Insertion can be prevented through a 'cocooned:before-insert' event handler
239
- if (!this.notify(insertionNode, 'before-insert', eventData)) {
240
- return false;
241
- }
242
-
243
- insertionNode[insertionMethod](contentNode);
244
-
245
- this.notify(afterNode, 'after-insert', eventData);
246
- }
247
- },
248
-
249
- remove: function (remover) {
250
- var self = this;
251
- var $remover = $(remover);
252
- var nodeToDelete = this.findItem($remover);
253
- var triggerNode = nodeToDelete.parent();
254
- var eventData = { link: $remover, node: nodeToDelete, cocooned: this };
255
-
256
- // Deletion can be prevented through a 'cocooned:before-remove' event handler
257
- if (!this.notify(triggerNode, 'before-remove', eventData)) {
258
- return false;
259
- }
260
-
261
- var timeout = triggerNode.data('remove-timeout') || 0;
262
-
263
- setTimeout(function () {
264
- if ($remover.hasClass('dynamic')) {
265
- nodeToDelete.remove();
266
- } else {
267
- nodeToDelete.find('input[required], select[required]').each(function (index, element) {
268
- $(element).removeAttr('required');
269
- });
270
- $remover.siblings('input[type=hidden][name$="[_destroy]"]').val('true');
271
- nodeToDelete.hide();
272
- }
273
- self.notify(triggerNode, 'after-remove', eventData);
274
- }, timeout);
275
- },
276
-
277
- hideMarkedForDestruction: function () {
278
- var self = this;
279
- $(this.selector('remove', '&.existing.destroyed'), this.container).each(function (i, removeLink) {
280
- var node = self.findItem(removeLink);
281
- node.hide();
282
- });
283
- }
284
- };