rails_depends_on 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 13b8e843efedd99dfdaa7c8f1b5076afe95a817c
4
+ data.tar.gz: 2489e82ea49a004772280476deae0cdb943dbbf8
5
+ SHA512:
6
+ metadata.gz: 7ae7f86885b5285d55fa933c318b62785b12d70352ab3ee2f5c91fc56144d6f9dda55ef7daf91500bf8cadb33970dc9398cc59dec91ae64422f28f349d1209df
7
+ data.tar.gz: fb86d50b1ac18f26a2ca21981bebbf34d8bf607b82fbe1c7866aab46e344eebacc4f071aedcbf7cc95de0d188a78a8c174b4300a5251a4ae46a245ee95831e7b
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rails_depends_on.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Francesco Brunetti
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # RailsDependsOn
2
+
3
+ A simple rails engine to make it easier to use the great DependsOn jQuery Plugin:
4
+
5
+ http://dstreet.github.io/dependsOn/
6
+
7
+ Note: not all the features of the original plugin are implemented for now
8
+
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'rails_depends_on'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install rails_depends_on
25
+
26
+ Include the assets in your javascript manifest file:
27
+ $ //= require dependent-fields to your Javascript manifest file (usually found at app/assets/javascripts/application.js).
28
+
29
+
30
+ ## Usage
31
+
32
+ ```haml
33
+ = f.input 'a_checkbox'
34
+ .depends-on{"data-id" => 'a_checkbox', 'data-value' =>'true'}
35
+ = f.input 'another_field'
36
+ ```
37
+
38
+ ```haml
39
+ = f.input 'a_text_field'
40
+ .depends-on{"data-id" => 'a_text_field', 'data-value' =>[['1'],['2']]}
41
+ = f.input 'another_field'
42
+ ```
43
+
44
+ ## TODO
45
+
46
+ * Multiple dependencies
47
+ * *NOT* qualifier
48
+ * *Contains* qualifier
49
+ * *Regexp* qualifier
50
+ * *url* and *email* qualifier
51
+ * *Custom* Qualifiers
52
+ * implement all dependsOn options (callbacks etc..)
53
+
54
+ ## Contributing
55
+
56
+ Bug reports and pull requests are welcome on GitHub at https://github.com/francescob/rails_depends_on.
57
+
58
+
59
+ ## License
60
+
61
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,601 @@
1
+ /*!
2
+ * dependsOn v1.0.2
3
+ * a jQuery plugin to facilitate the handling of form field dependencies.
4
+ *
5
+ * Copyright (c) 2015 David Street
6
+ * @license the MIT license.
7
+ */
8
+
9
+ (function ($) {
10
+
11
+ /**
12
+ * Creates a new Dependency
13
+ *
14
+ * @class Dependency
15
+ * @param {String} selector The jQuery selector.
16
+ * @param {Object} qualifiers An object representing the qualifiers for the Dependency.
17
+ */
18
+ var Dependency = function ( selector, qualifiers ) {
19
+ this.selector = selector;
20
+ this.$dependencyObj = $(selector);
21
+ this.qualifiers = qualifiers;
22
+ };
23
+
24
+
25
+ /**
26
+ * Qualifier method which checks for the `disabled` attribute.
27
+ *
28
+ * @function enabled
29
+ * @param checkAgainst The value we are checking.
30
+ * @returns {Boolean}
31
+ */
32
+ Dependency.prototype.enabled = function ( checkAgainst ) {
33
+ if ( $(this.selector + '[disabled]').length > 0 ) {
34
+
35
+ // Dependency is disabled and `enabled` qualifier is set to true
36
+ if ( checkAgainst ) {
37
+ return false;
38
+ }
39
+ } else {
40
+
41
+ // Dependency is not disabled and `enabled` qualifier is set to false
42
+ if ( !checkAgainst ) {
43
+ return false;
44
+ }
45
+ }
46
+
47
+ return true;
48
+ };
49
+
50
+
51
+ /**
52
+ * Qualifier method which checks for the `checked` attribute on checkboxes and radio buttons.
53
+ *
54
+ * @function checked
55
+ * @param checkAgainst The value we are checking.
56
+ * @returns {Boolean}
57
+ */
58
+ Dependency.prototype.checked = function ( checkAgainst ) {
59
+
60
+ // Dependency must be a checkbox for this qualifier
61
+ if ( this.$dependencyObj.attr('type') === 'checkbox') {
62
+
63
+ // Checkbox is not checked and the `checked` qualifier is set to true
64
+ // or the checkbox is checked and the `checked` qualifier is set to false
65
+ if ( (!this.$dependencyObj.is(':checked') && checkAgainst) ||
66
+ (this.$dependencyObj.is(':checked') && !checkAgainst ) ) {
67
+
68
+ return false;
69
+ }
70
+ }
71
+
72
+ return true;
73
+ };
74
+
75
+
76
+ /**
77
+ * Qualifier method which checks the dependency input value against an array of
78
+ * whitelisted values.
79
+ *
80
+ * @function values
81
+ * @param checkAgainst The value we are checking.
82
+ * @returns {Boolean}
83
+ */
84
+ Dependency.prototype.values = function ( checkAgainst ) {
85
+ var dependencyValue = this.$dependencyObj.val()
86
+ , length = checkAgainst.length
87
+ , i = 0
88
+ , match = false;
89
+
90
+ // If dependency is a radio group, then filter by `:checked`
91
+ if ( this.$dependencyObj.attr('type') === 'radio' ) {
92
+ dependencyValue = this.$dependencyObj.filter(':checked').val();
93
+ }
94
+
95
+ // Loop through list of accepted values. Break when we find a match.
96
+ for ( i; i < length; i += 1 ) {
97
+ if ( typeof(dependencyValue) === 'array' || typeof(dependencyValue) === 'object' ) {
98
+
99
+ // If `dependencyValue` is an array then check to see if arrays match
100
+ if ( $(this.$dependencyObj.val()).not($(checkAgainst[i])).length === 0 &&
101
+ $(checkAgainst[i]).not($(this.$dependencyObj.val())).length === 0 ) {
102
+ match = true;
103
+ break;
104
+ }
105
+ } else {
106
+ if ( checkAgainst[i] === dependencyValue ) {
107
+ match = true;
108
+ break;
109
+ }
110
+ }
111
+ }
112
+
113
+ return match;
114
+ };
115
+
116
+
117
+ /**
118
+ * Qualifier method which the dependency input value against an array of
119
+ * blacklisted values.
120
+ *
121
+ * @function not
122
+ * @param checkAgainst The value we are checking.
123
+ * @returns {Boolean}
124
+ */
125
+ Dependency.prototype.not = function ( checkAgainst ) {
126
+ var dependencyValue = this.$dependencyObj.val()
127
+ , length = checkAgainst.length
128
+ , i = 0;
129
+
130
+ if ( this.$dependencyObj.attr('type') === 'radio' ) {
131
+ dependencyValue = this.$dependencyObj.filter(':checked').val();
132
+ }
133
+ // Loop through list of blacklisted values. Break when we find a match.
134
+ for ( i; i < length; i += 1 ) {
135
+ if ( checkAgainst[i] === dependencyValue ) {
136
+ return false;
137
+ }
138
+ }
139
+
140
+ return true;
141
+ };
142
+
143
+
144
+ /**
145
+ * Qualifier method which runs a RegEx pattern match on the dependency input value.
146
+ *
147
+ * @function match
148
+ * @param checkAgainst The value we are checking.
149
+ * @returns {Boolean}
150
+ */
151
+ Dependency.prototype.match = function ( checkAgainst ) {
152
+ var dependencyValue = this.$dependencyObj.val()
153
+ , pattern = checkAgainst;
154
+
155
+ return pattern.test( dependencyValue );
156
+ };
157
+
158
+
159
+ /**
160
+ * Qualifier method which checks if a whitelisted value exists in an array of dependencyValues.
161
+ * Used for select inputs with the `multiple` attribute.
162
+ * If `dependencyValue` is not an array or object, then method will fallback
163
+ * to the `values` method.
164
+ *
165
+ * @function contains
166
+ * @param checkAgainst The value we are checking.
167
+ * @returns {Boolean}
168
+ */
169
+ Dependency.prototype.contains = function ( checkAgainst ) {
170
+ var dependencyValue = this.$dependencyObj.val()
171
+ , i = 0;
172
+
173
+ // Dependency value must be an array or object
174
+ if ( typeof(dependencyValue) === 'array' || typeof(dependencyValue) === 'object' ) {
175
+ for ( i in checkAgainst ) {
176
+ if ( $.inArray(checkAgainst[i], dependencyValue) !== -1 ) {
177
+ return true;
178
+ }
179
+
180
+ }
181
+ } else {
182
+ return this.values( checkAgainst );
183
+ }
184
+
185
+ return false;
186
+ };
187
+
188
+
189
+ /**
190
+ * Qualifier method which is a shortcut qualifier uses `match` method to check if value is an
191
+ * email address.
192
+ *
193
+ * @function email
194
+ * @param checkAgainst The value we are checking.
195
+ * @returns {Boolean}
196
+ */
197
+ Dependency.prototype.email = function ( checkAgainst ) {
198
+ var emailPattern = /^[_a-zA-Z0-9\-]+(\.[_a-zA-Z0-9\-]+)*@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$/;
199
+
200
+ return ( this.match(emailPattern) === checkAgainst );
201
+ };
202
+
203
+
204
+ /**
205
+ * Qualifier method which is a shortcut qualifier uses `match` method to check if value is a
206
+ * URL.
207
+ *
208
+ * @function url
209
+ * @param checkAgainst The value we are checking.
210
+ * @returns {Boolean}
211
+ */
212
+ Dependency.prototype.url = function ( checkAgainst ) {
213
+ var urlPattern = /(((http|ftp|https):\/\/)|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?\^=%&:\/~\+#!]*[\w\-\@?\^=%&\/~\+#])?/g;
214
+
215
+ return ( this.match(urlPattern) === checkAgainst );
216
+ };
217
+
218
+ /**
219
+ * Checks the Dependency against all of it's qualifiers.
220
+ *
221
+ * @function doesQualify
222
+ * @returns {Boolean}
223
+ */
224
+ Dependency.prototype.doesQualify = function () {
225
+ var q = 0;
226
+
227
+ // Loop through qualifiers
228
+ for ( q in this.qualifiers ) {
229
+
230
+ // Check if qualifier is a method of the Dependency object; if so,
231
+ // execute it.
232
+ if ( Dependency.prototype.hasOwnProperty( q ) &&
233
+ typeof(Dependency.prototype[q]) === 'function' ) {
234
+
235
+ if ( !this[q](this.qualifiers[q]) ) {
236
+ return false;
237
+ }
238
+ } else {
239
+
240
+ // Custom qualifier method
241
+ if ( typeof(this.qualifiers[q] === 'function') ) {
242
+ return this.qualifiers[q]( this.$dependencyObj.val() );
243
+ }
244
+ }
245
+ }
246
+
247
+ return true;
248
+ };
249
+
250
+
251
+ /**
252
+ * Creates a new DependencySet
253
+ *
254
+ * @class DependencySet
255
+ * @param {Object} dependencies An object containing key-value pairs of selectors and qualifiers.
256
+ */
257
+ var DependencySet = function ( dependencies ) {
258
+ var d = 0;
259
+
260
+ this.dependencies = [];
261
+
262
+ for ( d in dependencies ) {
263
+ this.dependencies.push( new Dependency(d, dependencies[d]) );
264
+ }
265
+ };
266
+
267
+
268
+ /**
269
+ * Checks if each Dependency in the set qualifies.
270
+ *
271
+ * @function doesQualify
272
+ * @returns {Boolean}
273
+ */
274
+ DependencySet.prototype.doesQualify = function () {
275
+ var length = this.dependencies.length
276
+ , d = 0
277
+ , qualifies = true;
278
+
279
+ // Execute `doesQualify` method on each dependency
280
+ for ( d; d < length; d += 1 ) {
281
+ if ( !this.dependencies[d].doesQualify() ) {
282
+ qualifies = false;
283
+ break;
284
+ }
285
+ }
286
+
287
+ return qualifies;
288
+ };
289
+
290
+
291
+ /**
292
+ * Creates a new DependencyCollection
293
+ *
294
+ * @class DependencyCollection
295
+ * @param {Object} subject A jQuery object which is the subject of the dependency.
296
+ * @param {Object} initialSet An object of key-value pairs of selectors and qualifiers
297
+ * representing the inital DependencySet.
298
+ * @param {Object} options An object for key-value pairs of options.
299
+ */
300
+ var DependencyCollection = function ( $subject, initalSet, options ) {
301
+ this.dependencySets = [];
302
+ this.$subject = $subject;
303
+
304
+ // Extend default settings with the provided options
305
+ this.settings = $.extend({
306
+ disable: true,
307
+ hide: true,
308
+ duration: 200,
309
+ onEnable: function() {},
310
+ onDisable: function() {}
311
+ }, options);
312
+
313
+ /**
314
+ * Misc. settings not enabled by default
315
+ * -------------------------------------
316
+ * valueOnEnable: string
317
+ * valueOnDisable: string
318
+ * checkOnDisable: boolean
319
+ * checkOnEnable: boolean
320
+ * valueTarget: selector (string)
321
+ * toggleClass: string
322
+ */
323
+
324
+ this.enableCallback = function() {};
325
+ this.disableCallback = function() {};
326
+
327
+ this.init( initalSet );
328
+ };
329
+
330
+
331
+ /**
332
+ * Initaialize the collection by adding the intial dependencySet
333
+ * and running the first check.
334
+ *
335
+ * @function init
336
+ * @param {Object} dependencies An object of key-value pairs of selectors and qualifiers.
337
+ */
338
+ DependencyCollection.prototype.init = function ( dependencies ) {
339
+ this.addSet( dependencies );
340
+ this.check( true );
341
+ };
342
+
343
+
344
+ /**
345
+ * Add a new DependencySet and register the `change` event for each
346
+ * Dependency in that set.
347
+ *
348
+ * @function addSet
349
+ * @param {Object} set An object of key-value pairs of selectors and qualifiers.
350
+ */
351
+ DependencyCollection.prototype.addSet = function ( set ) {
352
+ var self = this
353
+ , thisSet = 0
354
+ , numDependencies = 0
355
+ , d = 0
356
+ , dependency;
357
+
358
+ // Create a new DependencySet and add it to the stack
359
+ this.dependencySets.push( new DependencySet(set) );
360
+
361
+ thisSet = this.dependencySets.length - 1;
362
+ numDependencies = this.dependencySets[thisSet].dependencies.length;
363
+
364
+ // Loop through each of the Dependencies in the newly added DependencySet
365
+ for ( d; d < numDependencies; d += 1 ) {
366
+ dependency = this.dependencySets[thisSet].dependencies[d];
367
+
368
+ // Register change event
369
+ dependency.$dependencyObj.on('change', function(e) {
370
+ self.triggeredEvent = e;
371
+ self.triggeredDependency = this;
372
+ self.check();
373
+ });
374
+
375
+ // Handle on enter key event (fix for IE which doesn't register a change event when user
376
+ // hits the enter key for text fields)
377
+ if ( dependency.$dependencyObj.attr('type') === 'text' ) {
378
+ dependency.$dependencyObj.on('keypress', function(e) {
379
+ if ( e.which && dependency.$dependencyObj.is(':focus') ) {
380
+ if ( self.check() ) {
381
+ self.triggeredEvent = e;
382
+ self.triggeredDependency = this;
383
+ self.check();
384
+ }
385
+ }
386
+ });
387
+ }
388
+ }
389
+ };
390
+
391
+
392
+ /**
393
+ * Public method to add a new DependencySet to the stack.
394
+ *
395
+ * @function or
396
+ * @param {Object} dependencies An object of key-value pairs of selectors and qualifiers.
397
+ * @returns {DependencyCollection} Returns this DependencyCollection in order to maintain
398
+ * chainability.
399
+ */
400
+ DependencyCollection.prototype.or = function ( dependencies ) {
401
+ this.addSet( dependencies );
402
+ this.check( false );
403
+
404
+ return this;
405
+ };
406
+
407
+ /**
408
+ * Enable the subject.
409
+ *
410
+ * @function enable
411
+ * @param {Boolean} noFade Whether or not to fade the subject or immediately show it.
412
+ */
413
+ DependencyCollection.prototype.enable = function ( noFade ) {
414
+ var valueSubject = this.$subject
415
+ , subjectId = this.$subject.attr( 'id' )
416
+ , $hideObject;
417
+
418
+ // If the value target has been specified by the user
419
+ if ( this.settings.hasOwnProperty('valueTarget') && this.settings.valueTarget !== undefined) {
420
+ valueSubject = $( this.settings.valueTarget );
421
+
422
+ // If the subject is not a form field, then look for one within the subject
423
+ } else if ( this.$subject[0].nodeName.toLowerCase() !== 'input' &&
424
+ this.$subject[0].nodeName.toLowerCase() !== 'textarea' &&
425
+ this.$subject[0].nodeName.toLowerCase() !== 'select') {
426
+
427
+ valueSubject = this.$subject.find( 'input, textarea, select' );
428
+ }
429
+
430
+ // Remove the disabled attribute from the subject if allowed by the settings
431
+ if ( this.settings.disable ) {
432
+ this.$subject.removeAttr( 'disabled' );
433
+ }
434
+
435
+ // Show the subject if allowed by the settings
436
+ if ( this.settings.hide ) {
437
+
438
+ // If the subject's parent is a label
439
+ if ( this.$subject.parent()[0].nodeName.toLowerCase() === 'label' ) {
440
+ $hideObject = this.$subject.parent();
441
+ } else {
442
+ $hideObject = this.$subject.add( 'label[for="' + subjectId + '"]' )
443
+ }
444
+
445
+ if ( $hideObject.css('display') === 'none' ) {
446
+ if ( noFade ) {
447
+
448
+ // Show the input and it's label (if exists)
449
+ $hideObject.show();
450
+ } else {
451
+
452
+ // Fade in the input and it's label (if exists)
453
+ $hideObject.fadeIn( this.settings.duration );
454
+ }
455
+ }
456
+ }
457
+
458
+ // Set the value of the subject if allowed by the settings
459
+ if ( this.settings.hasOwnProperty('valueOnEnable') && this.settings.valueOnEnable !== undefined ) {
460
+ valueSubject.val( this.settings.valueOnEnable );
461
+ }
462
+
463
+ // Add/remove the checked attribute of the subject if allowed by the settings
464
+ if ( this.settings.hasOwnProperty('checkOnEnable') ) {
465
+ if ( this.settings.checkOnEnable ) {
466
+ valueSubject.attr( 'checked', 'checked' );
467
+ } else {
468
+ valueSubject.removeAttr( 'checked' );
469
+ }
470
+ }
471
+
472
+ // Add a class to the subject if allowed by the settings
473
+ if ( this.settings.hasOwnProperty('toggleClass') && this.settings.toggleClass !== undefined ) {
474
+ this.$subject.addClass( this.settings.toggleClass );
475
+ }
476
+
477
+ // User callback
478
+ this.settings.onEnable.call(this.triggeredDependency, this.triggeredEvent);
479
+ };
480
+
481
+ /**
482
+ * Disable the subject.
483
+ *
484
+ * @function disable
485
+ * @param {Boolean} noFade Whether or not to fade the subject or immediately hide it.
486
+ */
487
+ DependencyCollection.prototype.disable = function ( noFade ) {
488
+ var valueSubject = this.$subject
489
+ , subjectId = this.$subject.attr( 'id' )
490
+ , $hideObject;
491
+
492
+ // If the value target has been specified by the user
493
+ if ( this.settings.hasOwnProperty('valueTarget') && this.settings.valueTarget !== undefined) {
494
+ valueSubject = $( this.settings.valueTarget );
495
+
496
+ // If the subject is not a form field, then look for one within the subject
497
+ } else if ( this.$subject[0].nodeName.toLowerCase() !== 'input' &&
498
+ this.$subject[0].nodeName.toLowerCase() !== 'textarea' &&
499
+ this.$subject[0].nodeName.toLowerCase() !== 'select') {
500
+
501
+ valueSubject = this.$subject.find( 'input, textarea, select' );
502
+ }
503
+
504
+ // Add the disabled attribute from the subject if allowed by the settings
505
+ if ( this.settings.disable ) {
506
+ this.$subject.attr( 'disabled', 'disabled' );
507
+ }
508
+
509
+ // Hide the subject if allowed by the settings
510
+ if ( this.settings.hide ) {
511
+
512
+ // If the subject's parent is a label
513
+ if ( this.$subject.parent()[0].nodeName.toLowerCase() === 'label' ) {
514
+ $hideObject = this.$subject.parent();
515
+ } else {
516
+ $hideObject = this.$subject.add( 'label[for="' + subjectId + '"]' )
517
+ }
518
+
519
+ if ( noFade ) {
520
+
521
+ // Hide the input and it's label (if exists)
522
+ $hideObject.css({ 'display': 'none' });
523
+ } else {
524
+
525
+ // Fade out the input and it's label (if exists)
526
+ $hideObject.fadeOut( this.settings.duration );
527
+ }
528
+ }
529
+
530
+ // Set the value of the subject if allowed by the settings
531
+ if ( this.settings.hasOwnProperty('valueOnDisable') && this.settings.valueOnDisable !== undefined ) {
532
+ valueSubject.val( this.settings.valueOnDisable );
533
+ }
534
+
535
+ // Add/remove the checked attribute of the subject if allowed by the settings
536
+ if ( this.settings.hasOwnProperty('checkOnDisable') ) {
537
+ if ( this.settings.checkOnDisable ) {
538
+ valueSubject.attr( 'checked', 'checked' );
539
+ } else {
540
+ valueSubject.removeAttr( 'checked' );
541
+ }
542
+ }
543
+
544
+ // Remove a class of the subject if allowed by the settings
545
+ if ( this.settings.hasOwnProperty('toggleClass') && this.settings.toggleClass !== undefined ) {
546
+ this.$subject.removeClass( this.settings.toggleClass );
547
+ }
548
+
549
+ // User callback
550
+ this.settings.onDisable.call(this.triggeredDependency, this.triggeredEvent);
551
+ };
552
+
553
+
554
+ /**
555
+ * Check each DependencySet's `doesQualify` method. If any of the sets qualify then enable
556
+ * the input, othewise disable it.
557
+ *
558
+ * @function check
559
+ * @param {Boolean} firstRun Whether or not this is the initial check.
560
+ * @returns {Boolean} Whether or not the event qualifies.
561
+ */
562
+ DependencyCollection.prototype.check = function ( firstRun ) {
563
+ var length = this.dependencySets.length
564
+ , i = 0
565
+ , qualifies = false;
566
+
567
+ // Loop through each DependencySet
568
+ for ( i; i < length; i += 1 ) {
569
+ if ( this.dependencySets[i].doesQualify() ) {
570
+ qualifies = true;
571
+ break;
572
+ }
573
+ }
574
+
575
+ if (qualifies) {
576
+ this.enable( firstRun );
577
+ return true;
578
+ } else {
579
+ this.disable( firstRun );
580
+ return false;
581
+ }
582
+ };
583
+
584
+
585
+ /**
586
+ * Plugin access point.
587
+ *
588
+ * @function dependsOn
589
+ * @param {Object} initialSet An object of key-value pairs of selectors and qualifiers
590
+ * representing the inital DependencySet.
591
+ * @param {Object} options An object for key-value pairs of options.
592
+ * @returns {DependencyCollection} The DependencyCollection object.
593
+ */
594
+ $.fn.dependsOn = function ( dependencies, options ) {
595
+ var dependencyCollection = new DependencyCollection( this, dependencies, options );
596
+
597
+ return dependencyCollection;
598
+
599
+ };
600
+
601
+ })( jQuery );
@@ -0,0 +1,19 @@
1
+ //= require dependsOn
2
+ window.prepareDependsOn = ->
3
+
4
+ for element in $('.depends-on')
5
+ field_to_check = $(element).data('id')
6
+ field_to_check = "##{field_to_check}"
7
+ type = ($(field_to_check).attr('type'))
8
+ switch type
9
+ when 'checkbox' then depend_type = 'checked'
10
+ when 'text', 'number', 'select' then depend_type = 'values'
11
+ value = $(element).data('value')
12
+ object = {}
13
+ object[field_to_check] = {
14
+ "#{depend_type}": value
15
+ }
16
+ $(element).dependsOn object
17
+
18
+ # ---
19
+ # generated by js2coffee 2.1.0
@@ -0,0 +1,6 @@
1
+ require "rails_depends_on/version"
2
+
3
+ module RailsDependsOn
4
+ class Engine < Rails::Engine
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ module RailsDependsOn
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rails_depends_on/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rails_depends_on"
8
+ spec.version = RailsDependsOn::VERSION
9
+ spec.authors = ["Francesco Brunetti"]
10
+ spec.email = ["francescob@gmail.com"]
11
+
12
+ spec.summary = "A jQuery plugin to facilitate the handling of form field dependencies."
13
+ spec.homepage = "https://github.com/francescob/rails_depends_on"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.10"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_dependency 'jquery-rails'
23
+ spec.add_dependency 'coffee-rails'
24
+ spec.add_dependency "railties", ">= 3.1"
25
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_depends_on
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Francesco Brunetti
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-09-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: jquery-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: coffee-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: railties
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '3.1'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '3.1'
83
+ description:
84
+ email:
85
+ - francescob@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".travis.yml"
92
+ - Gemfile
93
+ - LICENSE.txt
94
+ - README.md
95
+ - Rakefile
96
+ - app/assets/javascripts/dependsOn.js
97
+ - app/assets/javascripts/rails_depends_on.js.coffee
98
+ - lib/rails_depends_on.rb
99
+ - lib/rails_depends_on/version.rb
100
+ - rails_depends_on.gemspec
101
+ homepage: https://github.com/francescob/rails_depends_on
102
+ licenses:
103
+ - MIT
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 2.4.5
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: A jQuery plugin to facilitate the handling of form field dependencies.
125
+ test_files: []
126
+ has_rdoc: