foundation-rails 6.1.2.0 → 6.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +7 -6
- data/README.md +1 -1
- data/Rakefile +5 -1
- data/bower.json +3 -3
- data/foundation-rails.gemspec +1 -0
- data/lib/foundation-rails.rb +1 -0
- data/lib/foundation/rails/version.rb +1 -1
- data/lib/generators/foundation/templates/foundation_and_overrides.scss +2 -2
- data/vendor/assets/js/foundation.abide.js.es6 +462 -0
- data/vendor/assets/js/{foundation.accordion.js → foundation.accordion.js.es6} +55 -47
- data/vendor/assets/js/{foundation.accordionMenu.js → foundation.accordionMenu.js.es6} +46 -35
- data/vendor/assets/js/{foundation.core.js → foundation.core.js.es6} +10 -8
- data/vendor/assets/js/{foundation.drilldown.js → foundation.drilldown.js.es6} +75 -49
- data/vendor/assets/js/{foundation.dropdown.js → foundation.dropdown.js.es6} +100 -88
- data/vendor/assets/js/{foundation.dropdownMenu.js → foundation.dropdownMenu.js.es6} +134 -128
- data/vendor/assets/js/{foundation.equalizer.js → foundation.equalizer.js.es6} +72 -61
- data/vendor/assets/js/{foundation.interchange.js → foundation.interchange.js.es6} +44 -45
- data/vendor/assets/js/{foundation.js → foundation.js.es6} +0 -0
- data/vendor/assets/js/{foundation.magellan.js → foundation.magellan.js.es6} +80 -83
- data/vendor/assets/js/foundation.offcanvas.js.es6 +395 -0
- data/vendor/assets/js/foundation.orbit.js.es6 +445 -0
- data/vendor/assets/js/{foundation.responsiveMenu.js → foundation.responsiveMenu.js.es6} +37 -31
- data/vendor/assets/js/foundation.responsiveToggle.js.es6 +112 -0
- data/vendor/assets/js/foundation.reveal.js.es6 +544 -0
- data/vendor/assets/js/{foundation.slider.js → foundation.slider.js.es6} +235 -184
- data/vendor/assets/js/{foundation.sticky.js → foundation.sticky.js.es6} +177 -166
- data/vendor/assets/js/{foundation.tabs.js → foundation.tabs.js.es6} +138 -118
- data/vendor/assets/js/{foundation.toggler.js → foundation.toggler.js.es6} +34 -37
- data/vendor/assets/js/{foundation.tooltip.js → foundation.tooltip.js.es6} +162 -153
- data/vendor/assets/js/foundation.util.box.js.es6 +183 -0
- data/vendor/assets/js/{foundation.util.keyboard.js → foundation.util.keyboard.js.es6} +54 -54
- data/vendor/assets/js/{foundation.util.mediaQuery.js → foundation.util.mediaQuery.js.es6} +46 -46
- data/vendor/assets/js/{foundation.util.motion.js → foundation.util.motion.js.es6} +58 -48
- data/vendor/assets/js/foundation.util.nest.js.es6 +76 -0
- data/vendor/assets/js/foundation.util.timerAndImageLoader.js.es6 +86 -0
- data/vendor/assets/js/{foundation.util.touch.js → foundation.util.touch.js.es6} +2 -2
- data/vendor/assets/js/foundation.util.triggers.js.es6 +239 -0
- data/vendor/assets/scss/_global.scss +28 -27
- data/vendor/assets/scss/components/_badge.scss +1 -1
- data/vendor/assets/scss/components/_button-group.scss +77 -26
- data/vendor/assets/scss/components/_button.scss +8 -8
- data/vendor/assets/scss/components/_callout.scss +2 -2
- data/vendor/assets/scss/components/_drilldown.scss +4 -0
- data/vendor/assets/scss/components/_dropdown-menu.scss +104 -54
- data/vendor/assets/scss/components/_flex.scss +28 -0
- data/vendor/assets/scss/components/_label.scss +1 -1
- data/vendor/assets/scss/components/_media-object.scss +37 -7
- data/vendor/assets/scss/components/_menu-icon.scss +9 -0
- data/vendor/assets/scss/components/_menu.scss +127 -29
- data/vendor/assets/scss/components/_off-canvas.scss +1 -0
- data/vendor/assets/scss/components/_pagination.scss +3 -3
- data/vendor/assets/scss/components/_progress-bar.scss +1 -25
- data/vendor/assets/scss/components/_reveal.scss +12 -6
- data/vendor/assets/scss/components/_slider.scss +3 -35
- data/vendor/assets/scss/components/_table.scss +8 -0
- data/vendor/assets/scss/components/_tabs.scss +5 -10
- data/vendor/assets/scss/components/_title-bar.scss +27 -10
- data/vendor/assets/scss/components/_tooltip.scss +0 -4
- data/vendor/assets/scss/components/_top-bar.scss +93 -21
- data/vendor/assets/scss/components/_visibility.scss +1 -1
- data/vendor/assets/scss/forms/_checkbox.scss +1 -1
- data/vendor/assets/scss/forms/_error.scss +7 -5
- data/vendor/assets/scss/forms/_forms.scss +3 -0
- data/vendor/assets/scss/forms/_help-text.scss +1 -1
- data/vendor/assets/scss/forms/_input-group.scss +44 -9
- data/vendor/assets/scss/forms/_meter.scss +109 -0
- data/vendor/assets/scss/forms/_progress.scss +85 -0
- data/vendor/assets/scss/forms/_range.scss +144 -0
- data/vendor/assets/scss/forms/_select.scss +1 -1
- data/vendor/assets/scss/forms/_text.scss +10 -1
- data/vendor/assets/scss/foundation.scss +16 -5
- data/vendor/assets/scss/grid/_classes.scss +5 -18
- data/vendor/assets/scss/grid/_column.scss +13 -11
- data/vendor/assets/scss/grid/_flex-grid.scss +54 -80
- data/vendor/assets/scss/grid/_grid.scss +22 -10
- data/vendor/assets/scss/grid/_layout.scss +18 -0
- data/vendor/assets/scss/grid/_row.scss +11 -15
- data/vendor/assets/scss/motion-ui/_classes.scss +10 -3
- data/vendor/assets/scss/motion-ui/effects/_fade.scss +4 -1
- data/vendor/assets/scss/motion-ui/effects/_zoom.scss +1 -1
- data/vendor/assets/scss/motion-ui/transitions/_slide.scss +1 -1
- data/vendor/assets/scss/motion-ui/util/_transition.scss +1 -1
- data/vendor/assets/scss/settings/_settings.scss +64 -47
- data/vendor/assets/scss/typography/_base.scss +4 -0
- data/vendor/assets/scss/typography/_print.scss +9 -5
- data/vendor/assets/scss/util/_breakpoint.scss +31 -25
- data/vendor/assets/scss/util/_color.scss +19 -0
- data/vendor/assets/scss/util/_flex.scss +68 -0
- data/vendor/assets/scss/util/_mixins.scss +13 -7
- data/vendor/assets/scss/util/_util.scss +1 -5
- data/vendor/assets/scss/util/_value.scss +9 -28
- metadata +51 -31
- data/vendor/assets/js/foundation.abide.js +0 -418
- data/vendor/assets/js/foundation.offcanvas.js +0 -376
- data/vendor/assets/js/foundation.orbit.js +0 -421
- data/vendor/assets/js/foundation.responsiveToggle.js +0 -106
- data/vendor/assets/js/foundation.reveal.js +0 -514
- data/vendor/assets/js/foundation.util.box.js +0 -169
- data/vendor/assets/js/foundation.util.nest.js +0 -63
- data/vendor/assets/js/foundation.util.timerAndImageLoader.js +0 -82
- data/vendor/assets/js/foundation.util.triggers.js +0 -224
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0e800e7f84c9ace7a2767a6677a1993432ceea09
|
|
4
|
+
data.tar.gz: 0efe5e8e6af396f6be490843bb86d3a14d248353
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d38c86ffa3166653c19e198a94a2beec8471ca7747a4c1417c62fc17d0faa5d5a9104d0ab111d6ac054a2982cc7690841e81243bfe16c398e6b64f8a0244e1a9
|
|
7
|
+
data.tar.gz: c5fbe45e7d4268ee45e2b20cd00359893ca658050b7dcf152eff5755ae93da2649a96210e4e59d1aa7cb11627ea2b2246a23815aac0b07546a63923ec5b2ec3a
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://badge.fury.io/rb/foundation-rails)
|
|
4
4
|
|
|
5
|
-
Foundation::Rails is a gem that makes it super easy to use Foundation in your upcoming Rails project.
|
|
5
|
+
**Foundation::Rails** is a gem that makes it super easy to use Foundation in your upcoming Rails project.
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
data/Rakefile
CHANGED
|
@@ -21,7 +21,11 @@ namespace :assets do
|
|
|
21
21
|
manifest = js_files.map { |file| "//= require #{File.basename(file)}" }.join("\n")
|
|
22
22
|
File.write('vendor/assets/js/foundation.js', manifest)
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Dir['vendor/assets/js/*.js'].each do |file|
|
|
25
|
+
sh "mv #{file} #{file}.es6"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
puts "\n*********************\n** ASSETS UPDATED! **\n*********************\n"
|
|
25
29
|
end
|
|
26
30
|
|
|
27
31
|
desc 'Remove old Foundation for Sites assets'
|
data/bower.json
CHANGED
data/foundation-rails.gemspec
CHANGED
|
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
|
20
20
|
|
|
21
21
|
spec.add_dependency "sass", [">= 3.3.0", "< 3.5"]
|
|
22
22
|
spec.add_dependency "railties", [">= 3.1.0"]
|
|
23
|
+
spec.add_dependency "sprockets-es6", [">= 0.9.0"]
|
|
23
24
|
|
|
24
25
|
spec.add_development_dependency "bundler", "~> 1.3"
|
|
25
26
|
spec.add_development_dependency "capybara"
|
data/lib/foundation-rails.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
@import 'settings';
|
|
4
4
|
@import 'foundation';
|
|
5
5
|
|
|
6
|
-
// If you'd like to include motion-ui, you need to install the motion-ui sass package.
|
|
6
|
+
// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package.
|
|
7
7
|
//
|
|
8
8
|
// @import 'motion-ui/motion-ui';
|
|
9
9
|
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
@include foundation-tooltip;
|
|
46
46
|
@include foundation-top-bar;
|
|
47
47
|
|
|
48
|
-
// If you'd like to include motion-ui, you need to install the motion-ui sass package.
|
|
48
|
+
// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package.
|
|
49
49
|
//
|
|
50
50
|
// @include motion-ui-transitions;
|
|
51
51
|
// @include motion-ui-animations;
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
!function($) {
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Abide module.
|
|
7
|
+
* @module foundation.abide
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
class Abide {
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new instance of Abide.
|
|
13
|
+
* @class
|
|
14
|
+
* @fires Abide#init
|
|
15
|
+
* @param {Object} element - jQuery object to add the trigger to.
|
|
16
|
+
* @param {Object} options - Overrides to the default plugin settings.
|
|
17
|
+
*/
|
|
18
|
+
constructor(element, options = {}) {
|
|
19
|
+
this.$element = element;
|
|
20
|
+
this.options = $.extend({}, Abide.defaults, this.$element.data(), options);
|
|
21
|
+
|
|
22
|
+
this._init();
|
|
23
|
+
|
|
24
|
+
Foundation.registerPlugin(this, 'Abide');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Initializes the Abide plugin and calls functions to get Abide functioning on load.
|
|
29
|
+
* @private
|
|
30
|
+
*/
|
|
31
|
+
_init() {
|
|
32
|
+
this.$inputs = this.$element.find('input, textarea, select').not('[data-abide-ignore]');
|
|
33
|
+
|
|
34
|
+
this._events();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Initializes events for Abide.
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
41
|
+
_events() {
|
|
42
|
+
this.$element.off('.abide')
|
|
43
|
+
.on('reset.zf.abide', () => {
|
|
44
|
+
this.resetForm();
|
|
45
|
+
})
|
|
46
|
+
.on('submit.zf.abide', () => {
|
|
47
|
+
return this.validateForm();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
if (this.options.validateOn === 'fieldChange') {
|
|
51
|
+
this.$inputs
|
|
52
|
+
.off('change.zf.abide')
|
|
53
|
+
.on('change.zf.abide', (e) => {
|
|
54
|
+
this.validateInput($(e.target));
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (this.options.liveValidate) {
|
|
59
|
+
this.$inputs
|
|
60
|
+
.off('input.zf.abide')
|
|
61
|
+
.on('input.zf.abide', (e) => {
|
|
62
|
+
this.validateInput($(e.target));
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Calls necessary functions to update Abide upon DOM change
|
|
69
|
+
* @private
|
|
70
|
+
*/
|
|
71
|
+
_reflow() {
|
|
72
|
+
this._init();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Checks whether or not a form element has the required attribute and if it's checked or not
|
|
77
|
+
* @param {Object} element - jQuery object to check for required attribute
|
|
78
|
+
* @returns {Boolean} Boolean value depends on whether or not attribute is checked or empty
|
|
79
|
+
*/
|
|
80
|
+
requiredCheck($el) {
|
|
81
|
+
if (!$el.attr('required')) return true;
|
|
82
|
+
|
|
83
|
+
var isGood = true;
|
|
84
|
+
|
|
85
|
+
switch ($el[0].type) {
|
|
86
|
+
case 'checkbox':
|
|
87
|
+
case 'radio':
|
|
88
|
+
isGood = $el[0].checked;
|
|
89
|
+
break;
|
|
90
|
+
|
|
91
|
+
case 'select':
|
|
92
|
+
case 'select-one':
|
|
93
|
+
case 'select-multiple':
|
|
94
|
+
var opt = $el.find('option:selected');
|
|
95
|
+
if (!opt.length || !opt.val()) isGood = false;
|
|
96
|
+
break;
|
|
97
|
+
|
|
98
|
+
default:
|
|
99
|
+
if(!$el.val() || !$el.val().length) isGood = false;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return isGood;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Based on $el, get the first element with selector in this order:
|
|
107
|
+
* 1. The element's direct sibling('s).
|
|
108
|
+
* 3. The element's parent's children.
|
|
109
|
+
*
|
|
110
|
+
* This allows for multiple form errors per input, though if none are found, no form errors will be shown.
|
|
111
|
+
*
|
|
112
|
+
* @param {Object} $el - jQuery object to use as reference to find the form error selector.
|
|
113
|
+
* @returns {Object} jQuery object with the selector.
|
|
114
|
+
*/
|
|
115
|
+
findFormError($el) {
|
|
116
|
+
var $error = $el.siblings(this.options.formErrorSelector);
|
|
117
|
+
|
|
118
|
+
if (!$error.length) {
|
|
119
|
+
$error = $el.parent().find(this.options.formErrorSelector);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return $error;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Get the first element in this order:
|
|
127
|
+
* 2. The <label> with the attribute `[for="someInputId"]`
|
|
128
|
+
* 3. The `.closest()` <label>
|
|
129
|
+
*
|
|
130
|
+
* @param {Object} $el - jQuery object to check for required attribute
|
|
131
|
+
* @returns {Boolean} Boolean value depends on whether or not attribute is checked or empty
|
|
132
|
+
*/
|
|
133
|
+
findLabel($el) {
|
|
134
|
+
var id = $el[0].id;
|
|
135
|
+
var $label = this.$element.find(`label[for="${id}"]`);
|
|
136
|
+
|
|
137
|
+
if (!$label.length) {
|
|
138
|
+
return $el.closest('label');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return $label;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Adds the CSS error class as specified by the Abide settings to the label, input, and the form
|
|
146
|
+
* @param {Object} $el - jQuery object to add the class to
|
|
147
|
+
*/
|
|
148
|
+
addErrorClasses($el) {
|
|
149
|
+
var $label = this.findLabel($el);
|
|
150
|
+
var $formError = this.findFormError($el);
|
|
151
|
+
|
|
152
|
+
if ($label.length) {
|
|
153
|
+
$label.addClass(this.options.labelErrorClass);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if ($formError.length) {
|
|
157
|
+
$formError.addClass(this.options.formErrorClass);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
$el.addClass(this.options.inputErrorClass).attr('data-invalid', '');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Removes CSS error class as specified by the Abide settings from the label, input, and the form
|
|
165
|
+
* @param {Object} $el - jQuery object to remove the class from
|
|
166
|
+
*/
|
|
167
|
+
removeErrorClasses($el) {
|
|
168
|
+
var $label = this.findLabel($el);
|
|
169
|
+
var $formError = this.findFormError($el);
|
|
170
|
+
|
|
171
|
+
if ($label.length) {
|
|
172
|
+
$label.removeClass(this.options.labelErrorClass);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if ($formError.length) {
|
|
176
|
+
$formError.removeClass(this.options.formErrorClass);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
$el.removeClass(this.options.inputErrorClass).removeAttr('data-invalid');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Goes through a form to find inputs and proceeds to validate them in ways specific to their type
|
|
184
|
+
* @fires Abide#invalid
|
|
185
|
+
* @fires Abide#valid
|
|
186
|
+
* @param {Object} element - jQuery object to validate, should be an HTML input
|
|
187
|
+
* @returns {Boolean} goodToGo - If the input is valid or not.
|
|
188
|
+
*/
|
|
189
|
+
validateInput($el) {
|
|
190
|
+
var clearRequire = this.requiredCheck($el),
|
|
191
|
+
validated = false,
|
|
192
|
+
customValidator = true,
|
|
193
|
+
validator = $el.attr('data-validator'),
|
|
194
|
+
equalTo = true;
|
|
195
|
+
|
|
196
|
+
switch ($el[0].type) {
|
|
197
|
+
case 'radio':
|
|
198
|
+
validated = this.validateRadio($el.attr('name'));
|
|
199
|
+
break;
|
|
200
|
+
|
|
201
|
+
case 'checkbox':
|
|
202
|
+
validated = clearRequire;
|
|
203
|
+
break;
|
|
204
|
+
|
|
205
|
+
case 'select':
|
|
206
|
+
case 'select-one':
|
|
207
|
+
case 'select-multiple':
|
|
208
|
+
validated = clearRequire;
|
|
209
|
+
break;
|
|
210
|
+
|
|
211
|
+
default:
|
|
212
|
+
validated = this.validateText($el);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (validator) {
|
|
216
|
+
customValidator = this.matchValidation($el, validator, $el.attr('required'));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if ($el.attr('data-equalto')) {
|
|
220
|
+
equalTo = this.options.validators.equalTo($el);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
var goodToGo = [clearRequire, validated, customValidator, equalTo].indexOf(false) === -1;
|
|
224
|
+
var message = (goodToGo ? 'valid' : 'invalid') + '.zf.abide';
|
|
225
|
+
|
|
226
|
+
this[goodToGo ? 'removeErrorClasses' : 'addErrorClasses']($el);
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Fires when the input is done checking for validation. Event trigger is either `valid.zf.abide` or `invalid.zf.abide`
|
|
230
|
+
* Trigger includes the DOM element of the input.
|
|
231
|
+
* @event Abide#valid
|
|
232
|
+
* @event Abide#invalid
|
|
233
|
+
*/
|
|
234
|
+
$el.trigger(message, [$el]);
|
|
235
|
+
|
|
236
|
+
return goodToGo;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Goes through a form and if there are any invalid inputs, it will display the form error element
|
|
241
|
+
* @returns {Boolean} noError - true if no errors were detected...
|
|
242
|
+
* @fires Abide#formvalid
|
|
243
|
+
* @fires Abide#forminvalid
|
|
244
|
+
*/
|
|
245
|
+
validateForm() {
|
|
246
|
+
var acc = [];
|
|
247
|
+
var _this = this;
|
|
248
|
+
|
|
249
|
+
this.$inputs.each(function() {
|
|
250
|
+
acc.push(_this.validateInput($(this)));
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
var noError = acc.indexOf(false) === -1;
|
|
254
|
+
|
|
255
|
+
this.$element.find('[data-abide-error]').css('display', (noError ? 'none' : 'block'));
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Fires when the form is finished validating. Event trigger is either `formvalid.zf.abide` or `forminvalid.zf.abide`.
|
|
259
|
+
* Trigger includes the element of the form.
|
|
260
|
+
* @event Abide#formvalid
|
|
261
|
+
* @event Abide#forminvalid
|
|
262
|
+
*/
|
|
263
|
+
this.$element.trigger((noError ? 'formvalid' : 'forminvalid') + '.zf.abide', [this.$element]);
|
|
264
|
+
|
|
265
|
+
return noError;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Determines whether or a not a text input is valid based on the pattern specified in the attribute. If no matching pattern is found, returns true.
|
|
270
|
+
* @param {Object} $el - jQuery object to validate, should be a text input HTML element
|
|
271
|
+
* @param {String} pattern - string value of one of the RegEx patterns in Abide.options.patterns
|
|
272
|
+
* @returns {Boolean} Boolean value depends on whether or not the input value matches the pattern specified
|
|
273
|
+
*/
|
|
274
|
+
validateText($el, pattern) {
|
|
275
|
+
// pattern = pattern ? pattern : $el.attr('pattern') ? $el.attr('pattern') : $el.attr('type');
|
|
276
|
+
pattern = (pattern || $el.attr('pattern') || $el.attr('type'));
|
|
277
|
+
var inputText = $el.val();
|
|
278
|
+
|
|
279
|
+
// if text, check if the pattern exists, if so, test it, if no text or no pattern, return true.
|
|
280
|
+
return inputText.length ?
|
|
281
|
+
this.options.patterns.hasOwnProperty(pattern) ? this.options.patterns[pattern].test(inputText) :
|
|
282
|
+
pattern && pattern !== $el.attr('type') ?
|
|
283
|
+
new RegExp(pattern).test(inputText) :
|
|
284
|
+
true :
|
|
285
|
+
true;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Determines whether or a not a radio input is valid based on whether or not it is required and selected
|
|
290
|
+
* @param {String} groupName - A string that specifies the name of a radio button group
|
|
291
|
+
* @returns {Boolean} Boolean value depends on whether or not at least one radio input has been selected (if it's required)
|
|
292
|
+
*/
|
|
293
|
+
validateRadio(groupName) {
|
|
294
|
+
var $group = this.$element.find(`:radio[name="${groupName}"]`),
|
|
295
|
+
counter = [],
|
|
296
|
+
_this = this;
|
|
297
|
+
|
|
298
|
+
$group.each(function(){
|
|
299
|
+
var rdio = $(this),
|
|
300
|
+
clear = _this.requiredCheck(rdio);
|
|
301
|
+
counter.push(clear);
|
|
302
|
+
if(clear) _this.removeErrorClasses(rdio);
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
return counter.indexOf(false) === -1;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Determines if a selected input passes a custom validation function. Multiple validations can be used, if passed to the element with `data-validator="foo bar baz"` in a space separated listed.
|
|
310
|
+
* @param {Object} $el - jQuery input element.
|
|
311
|
+
* @param {String} validators - a string of function names matching functions in the Abide.options.validators object.
|
|
312
|
+
* @param {Boolean} required - self explanatory?
|
|
313
|
+
* @returns {Boolean} - true if validations passed.
|
|
314
|
+
*/
|
|
315
|
+
matchValidation($el, validators, required) {
|
|
316
|
+
required = required ? true : false;
|
|
317
|
+
|
|
318
|
+
var clear = validators.split(' ').map((v) => {
|
|
319
|
+
return this.options.validators[v]($el, required, $el.parent());
|
|
320
|
+
});
|
|
321
|
+
return clear.indexOf(false) === -1;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Resets form inputs and styles
|
|
326
|
+
* @fires Abide#formreset
|
|
327
|
+
*/
|
|
328
|
+
resetForm() {
|
|
329
|
+
var $form = this.$element,
|
|
330
|
+
opts = this.options;
|
|
331
|
+
|
|
332
|
+
$(`.${opts.labelErrorClass}`, $form).not('small').removeClass(opts.labelErrorClass);
|
|
333
|
+
$(`.${opts.inputErrorClass}`, $form).not('small').removeClass(opts.inputErrorClass);
|
|
334
|
+
$(`${opts.formErrorSelector}.${opts.formErrorClass}`).removeClass(opts.formErrorClass);
|
|
335
|
+
$form.find('[data-abide-error]').css('display', 'none');
|
|
336
|
+
$(':input', $form).not(':button, :submit, :reset, :hidden, [data-abide-ignore]').val('').removeAttr('data-invalid');
|
|
337
|
+
/**
|
|
338
|
+
* Fires when the form has been reset.
|
|
339
|
+
* @event Abide#formreset
|
|
340
|
+
*/
|
|
341
|
+
$form.trigger('formreset.zf.abide', [$form]);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Destroys an instance of Abide.
|
|
346
|
+
* Removes error styles and classes from elements, without resetting their values.
|
|
347
|
+
*/
|
|
348
|
+
destroy() {
|
|
349
|
+
var _this = this;
|
|
350
|
+
this.$element
|
|
351
|
+
.off('.abide')
|
|
352
|
+
.find('[data-abide-error]')
|
|
353
|
+
.css('display', 'none');
|
|
354
|
+
|
|
355
|
+
this.$inputs
|
|
356
|
+
.off('.abide')
|
|
357
|
+
.each(function() {
|
|
358
|
+
_this.removeErrorClasses($(this));
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
Foundation.unregisterPlugin(this);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Default settings for plugin
|
|
367
|
+
*/
|
|
368
|
+
Abide.defaults = {
|
|
369
|
+
/**
|
|
370
|
+
* The default event to validate inputs. Checkboxes and radios validate immediately.
|
|
371
|
+
* Remove or change this value for manual validation.
|
|
372
|
+
* @option
|
|
373
|
+
* @example 'fieldChange'
|
|
374
|
+
*/
|
|
375
|
+
validateOn: 'fieldChange',
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Class to be applied to input labels on failed validation.
|
|
379
|
+
* @option
|
|
380
|
+
* @example 'is-invalid-label'
|
|
381
|
+
*/
|
|
382
|
+
labelErrorClass: 'is-invalid-label',
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Class to be applied to inputs on failed validation.
|
|
386
|
+
* @option
|
|
387
|
+
* @example 'is-invalid-input'
|
|
388
|
+
*/
|
|
389
|
+
inputErrorClass: 'is-invalid-input',
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Class selector to use to target Form Errors for show/hide.
|
|
393
|
+
* @option
|
|
394
|
+
* @example '.form-error'
|
|
395
|
+
*/
|
|
396
|
+
formErrorSelector: '.form-error',
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Class added to Form Errors on failed validation.
|
|
400
|
+
* @option
|
|
401
|
+
* @example 'is-visible'
|
|
402
|
+
*/
|
|
403
|
+
formErrorClass: 'is-visible',
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Set to true to validate text inputs on any value change.
|
|
407
|
+
* @option
|
|
408
|
+
* @example false
|
|
409
|
+
*/
|
|
410
|
+
liveValidate: false,
|
|
411
|
+
|
|
412
|
+
patterns: {
|
|
413
|
+
alpha : /^[a-zA-Z]+$/,
|
|
414
|
+
alpha_numeric : /^[a-zA-Z0-9]+$/,
|
|
415
|
+
integer : /^[-+]?\d+$/,
|
|
416
|
+
number : /^[-+]?\d*(?:[\.\,]\d+)?$/,
|
|
417
|
+
|
|
418
|
+
// amex, visa, diners
|
|
419
|
+
card : /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,
|
|
420
|
+
cvv : /^([0-9]){3,4}$/,
|
|
421
|
+
|
|
422
|
+
// http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
|
|
423
|
+
email : /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,
|
|
424
|
+
|
|
425
|
+
url : /^(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/,
|
|
426
|
+
// abc.de
|
|
427
|
+
domain : /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,
|
|
428
|
+
|
|
429
|
+
datetime : /^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,
|
|
430
|
+
// YYYY-MM-DD
|
|
431
|
+
date : /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,
|
|
432
|
+
// HH:MM:SS
|
|
433
|
+
time : /^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,
|
|
434
|
+
dateISO : /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,
|
|
435
|
+
// MM/DD/YYYY
|
|
436
|
+
month_day_year : /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,
|
|
437
|
+
// DD/MM/YYYY
|
|
438
|
+
day_month_year : /^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,
|
|
439
|
+
|
|
440
|
+
// #FFF or #FFFFFF
|
|
441
|
+
color : /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/
|
|
442
|
+
},
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Optional validation functions to be used. `equalTo` being the only default included function.
|
|
446
|
+
* Functions should return only a boolean if the input is valid or not. Functions are given the following arguments:
|
|
447
|
+
* el : The jQuery element to validate.
|
|
448
|
+
* required : Boolean value of the required attribute be present or not.
|
|
449
|
+
* parent : The direct parent of the input.
|
|
450
|
+
* @option
|
|
451
|
+
*/
|
|
452
|
+
validators: {
|
|
453
|
+
equalTo: function (el, required, parent) {
|
|
454
|
+
return $(`#${el.attr('data-equalto')}`).val() === el.val();
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// Window exports
|
|
460
|
+
Foundation.plugin(Abide, 'Abide');
|
|
461
|
+
|
|
462
|
+
}(jQuery);
|