fomantic-ui 2.10.0-beta.8 → 2.10.0-beta.81
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.
- package/.eslintrc.js +6 -23
- package/.github/workflows/ci.yml +9 -9
- package/.github/workflows/depsreview.yml +1 -1
- package/.github/workflows/nightly.yml +7 -5
- package/.github/workflows/release.yml +2 -2
- package/.stylelintrc.js +1 -15
- package/CHANGELOG.md +5289 -2325
- package/README.md +8 -4
- package/changelog-setup.js +32 -10
- package/changelog-template.hbs +256 -251
- package/dist/components/accordion.css +1 -1
- package/dist/components/accordion.js +62 -73
- package/dist/components/accordion.min.css +1 -1
- package/dist/components/accordion.min.js +3 -3
- package/dist/components/ad.css +1 -1
- package/dist/components/ad.min.css +1 -1
- package/dist/components/api.js +101 -161
- package/dist/components/api.min.js +3 -3
- package/dist/components/breadcrumb.css +1 -1
- package/dist/components/breadcrumb.min.css +1 -1
- package/dist/components/button.css +5 -6
- package/dist/components/button.min.css +2 -2
- package/dist/components/calendar.css +3 -3
- package/dist/components/calendar.js +283 -332
- package/dist/components/calendar.min.css +2 -2
- package/dist/components/calendar.min.js +3 -3
- package/dist/components/card.css +1 -1
- package/dist/components/card.min.css +1 -1
- package/dist/components/checkbox.css +1 -1
- package/dist/components/checkbox.js +58 -79
- package/dist/components/checkbox.min.css +1 -1
- package/dist/components/checkbox.min.js +3 -3
- package/dist/components/comment.css +1 -1
- package/dist/components/comment.min.css +1 -1
- package/dist/components/container.css +1 -1
- package/dist/components/container.min.css +1 -1
- package/dist/components/dimmer.css +2 -2
- package/dist/components/dimmer.js +39 -52
- package/dist/components/dimmer.min.css +2 -2
- package/dist/components/dimmer.min.js +3 -3
- package/dist/components/divider.css +1 -1
- package/dist/components/divider.min.css +1 -1
- package/dist/components/dropdown.css +21 -35
- package/dist/components/dropdown.js +435 -531
- package/dist/components/dropdown.min.css +2 -2
- package/dist/components/dropdown.min.js +3 -3
- package/dist/components/embed.css +1 -1
- package/dist/components/embed.js +55 -68
- package/dist/components/embed.min.css +1 -1
- package/dist/components/embed.min.js +3 -3
- package/dist/components/emoji.css +3809 -7617
- package/dist/components/emoji.min.css +2 -2
- package/dist/components/feed.css +1 -1
- package/dist/components/feed.min.css +1 -1
- package/dist/components/flag.css +1 -1
- package/dist/components/flag.min.css +1 -1
- package/dist/components/flyout.css +1 -1
- package/dist/components/flyout.js +149 -168
- package/dist/components/flyout.min.css +1 -1
- package/dist/components/flyout.min.js +3 -3
- package/dist/components/form.css +3 -5
- package/dist/components/form.js +249 -269
- package/dist/components/form.min.css +2 -2
- package/dist/components/form.min.js +3 -3
- package/dist/components/grid.css +2 -2
- package/dist/components/grid.min.css +2 -2
- package/dist/components/header.css +6 -6
- package/dist/components/header.min.css +2 -2
- package/dist/components/icon.css +10 -37
- package/dist/components/icon.min.css +2 -2
- package/dist/components/image.css +1 -1
- package/dist/components/image.min.css +1 -1
- package/dist/components/input.css +284 -12
- package/dist/components/input.min.css +2 -2
- package/dist/components/item.css +1 -1
- package/dist/components/item.min.css +1 -1
- package/dist/components/label.css +6 -14
- package/dist/components/label.min.css +2 -2
- package/dist/components/list.css +3 -3
- package/dist/components/list.min.css +2 -2
- package/dist/components/loader.css +53 -53
- package/dist/components/loader.min.css +2 -2
- package/dist/components/menu.css +45 -60
- package/dist/components/menu.min.css +2 -2
- package/dist/components/message.css +2 -2
- package/dist/components/message.min.css +2 -2
- package/dist/components/modal.css +5 -5
- package/dist/components/modal.js +161 -170
- package/dist/components/modal.min.css +2 -2
- package/dist/components/modal.min.js +3 -3
- package/dist/components/nag.css +1 -1
- package/dist/components/nag.js +74 -88
- package/dist/components/nag.min.css +1 -1
- package/dist/components/nag.min.js +3 -3
- package/dist/components/placeholder.css +2 -2
- package/dist/components/placeholder.min.css +2 -2
- package/dist/components/popup.css +19 -73
- package/dist/components/popup.js +105 -138
- package/dist/components/popup.min.css +2 -2
- package/dist/components/popup.min.js +3 -3
- package/dist/components/progress.css +4 -13
- package/dist/components/progress.js +75 -97
- package/dist/components/progress.min.css +2 -2
- package/dist/components/progress.min.js +3 -3
- package/dist/components/rail.css +1 -1
- package/dist/components/rail.min.css +1 -1
- package/dist/components/rating.css +1 -1
- package/dist/components/rating.js +49 -61
- package/dist/components/rating.min.css +1 -1
- package/dist/components/rating.min.js +3 -3
- package/dist/components/reset.css +48 -208
- package/dist/components/reset.min.css +2 -2
- package/dist/components/reveal.css +2 -5
- package/dist/components/reveal.min.css +2 -2
- package/dist/components/search.css +2 -3
- package/dist/components/search.js +178 -198
- package/dist/components/search.min.css +2 -2
- package/dist/components/search.min.js +3 -3
- package/dist/components/segment.css +6 -6
- package/dist/components/segment.min.css +2 -2
- package/dist/components/shape.css +1 -1
- package/dist/components/shape.js +59 -69
- package/dist/components/shape.min.css +1 -1
- package/dist/components/shape.min.js +3 -3
- package/dist/components/sidebar.css +1 -1
- package/dist/components/sidebar.js +81 -101
- package/dist/components/sidebar.min.css +1 -1
- package/dist/components/sidebar.min.js +3 -3
- package/dist/components/site.css +1 -1
- package/dist/components/site.js +37 -58
- package/dist/components/site.min.css +1 -1
- package/dist/components/site.min.js +3 -3
- package/dist/components/slider.css +1 -1
- package/dist/components/slider.js +169 -183
- package/dist/components/slider.min.css +1 -1
- package/dist/components/slider.min.js +3 -3
- package/dist/components/state.js +45 -59
- package/dist/components/state.min.js +3 -3
- package/dist/components/statistic.css +1 -1
- package/dist/components/statistic.min.css +1 -1
- package/dist/components/step.css +4 -4
- package/dist/components/step.min.css +2 -2
- package/dist/components/sticky.css +1 -1
- package/dist/components/sticky.js +95 -117
- package/dist/components/sticky.min.css +1 -1
- package/dist/components/sticky.min.js +3 -3
- package/dist/components/tab.css +1 -1
- package/dist/components/tab.js +83 -115
- package/dist/components/tab.min.css +1 -1
- package/dist/components/tab.min.js +3 -3
- package/dist/components/table.css +8 -8
- package/dist/components/table.min.css +2 -2
- package/dist/components/text.css +1 -1
- package/dist/components/text.min.css +1 -1
- package/dist/components/toast.css +1 -1
- package/dist/components/toast.js +64 -74
- package/dist/components/toast.min.css +1 -1
- package/dist/components/toast.min.js +3 -3
- package/dist/components/transition.css +1 -1
- package/dist/components/transition.js +61 -85
- package/dist/components/transition.min.css +1 -1
- package/dist/components/transition.min.js +3 -3
- package/dist/components/visibility.js +120 -140
- package/dist/components/visibility.min.js +3 -3
- package/dist/semantic.css +4480 -8222
- package/dist/semantic.js +2886 -3485
- package/dist/semantic.min.css +3 -3
- package/dist/semantic.min.js +3 -3
- package/examples/attached.html +1 -1
- package/examples/components/menu.html +1 -1
- package/package.json +8 -5
- package/scripts/nightly-version.js +4 -4
- package/src/definitions/behaviors/api.js +100 -160
- package/src/definitions/behaviors/form.js +248 -268
- package/src/definitions/behaviors/state.js +44 -58
- package/src/definitions/behaviors/visibility.js +119 -139
- package/src/definitions/collections/breadcrumb.less +0 -1
- package/src/definitions/collections/form.less +3 -9
- package/src/definitions/collections/grid.less +1 -2
- package/src/definitions/collections/menu.less +106 -117
- package/src/definitions/collections/message.less +1 -2
- package/src/definitions/collections/table.less +7 -8
- package/src/definitions/elements/button.less +4 -6
- package/src/definitions/elements/container.less +0 -1
- package/src/definitions/elements/divider.less +1 -2
- package/src/definitions/elements/emoji.less +1 -1
- package/src/definitions/elements/flag.less +1 -1
- package/src/definitions/elements/header.less +4 -5
- package/src/definitions/elements/icon.less +10 -37
- package/src/definitions/elements/image.less +0 -1
- package/src/definitions/elements/input.less +4 -7
- package/src/definitions/elements/label.less +5 -14
- package/src/definitions/elements/list.less +2 -3
- package/src/definitions/elements/loader.less +10 -11
- package/src/definitions/elements/placeholder.less +1 -2
- package/src/definitions/elements/rail.less +0 -1
- package/src/definitions/elements/reveal.less +1 -5
- package/src/definitions/elements/segment.less +5 -6
- package/src/definitions/elements/step.less +3 -4
- package/src/definitions/elements/text.less +0 -1
- package/src/definitions/globals/reset.less +0 -1
- package/src/definitions/globals/site.js +36 -57
- package/src/definitions/globals/site.less +0 -1
- package/src/definitions/modules/accordion.js +61 -72
- package/src/definitions/modules/accordion.less +0 -1
- package/src/definitions/modules/calendar.js +282 -331
- package/src/definitions/modules/calendar.less +2 -3
- package/src/definitions/modules/checkbox.js +57 -78
- package/src/definitions/modules/checkbox.less +0 -1
- package/src/definitions/modules/dimmer.js +38 -51
- package/src/definitions/modules/dimmer.less +1 -2
- package/src/definitions/modules/dropdown.js +434 -530
- package/src/definitions/modules/dropdown.less +27 -38
- package/src/definitions/modules/embed.js +54 -67
- package/src/definitions/modules/embed.less +0 -1
- package/src/definitions/modules/flyout.js +148 -167
- package/src/definitions/modules/flyout.less +0 -1
- package/src/definitions/modules/modal.js +160 -169
- package/src/definitions/modules/modal.less +3 -4
- package/src/definitions/modules/nag.js +73 -87
- package/src/definitions/modules/nag.less +0 -1
- package/src/definitions/modules/popup.js +104 -137
- package/src/definitions/modules/popup.less +18 -73
- package/src/definitions/modules/progress.js +74 -96
- package/src/definitions/modules/progress.less +3 -13
- package/src/definitions/modules/rating.js +48 -60
- package/src/definitions/modules/rating.less +0 -1
- package/src/definitions/modules/search.js +177 -197
- package/src/definitions/modules/search.less +2 -4
- package/src/definitions/modules/shape.js +58 -68
- package/src/definitions/modules/shape.less +0 -1
- package/src/definitions/modules/sidebar.js +80 -100
- package/src/definitions/modules/sidebar.less +0 -1
- package/src/definitions/modules/slider.js +168 -182
- package/src/definitions/modules/slider.less +0 -1
- package/src/definitions/modules/sticky.js +94 -116
- package/src/definitions/modules/sticky.less +0 -1
- package/src/definitions/modules/tab.js +82 -114
- package/src/definitions/modules/tab.less +0 -1
- package/src/definitions/modules/toast.js +63 -73
- package/src/definitions/modules/toast.less +0 -1
- package/src/definitions/modules/transition.js +60 -84
- package/src/definitions/modules/transition.less +1 -2
- package/src/definitions/views/ad.less +0 -1
- package/src/definitions/views/card.less +0 -1
- package/src/definitions/views/comment.less +0 -1
- package/src/definitions/views/feed.less +0 -1
- package/src/definitions/views/item.less +0 -1
- package/src/definitions/views/statistic.less +0 -1
- package/src/semantic.less +1 -1
- package/src/themes/amazon/elements/button.overrides +1 -1
- package/src/themes/amazon/elements/button.variables +5 -6
- package/src/themes/amazon/globals/site.variables +2 -3
- package/src/themes/bookish/elements/header.variables +2 -2
- package/src/themes/bootstrap3/elements/button.variables +4 -5
- package/src/themes/chubby/collections/menu.variables +1 -1
- package/src/themes/chubby/elements/button.overrides +4 -4
- package/src/themes/chubby/modules/accordion.overrides +1 -1
- package/src/themes/chubby/views/comment.overrides +2 -2
- package/src/themes/chubby/views/comment.variables +2 -2
- package/src/themes/classic/collections/table.variables +2 -2
- package/src/themes/classic/elements/button.variables +11 -11
- package/src/themes/classic/modules/progress.variables +2 -2
- package/src/themes/classic/views/card.variables +2 -2
- package/src/themes/default/collections/form.variables +2 -3
- package/src/themes/default/collections/menu.variables +28 -28
- package/src/themes/default/collections/message.variables +1 -1
- package/src/themes/default/collections/table.variables +4 -4
- package/src/themes/default/elements/button.variables +9 -10
- package/src/themes/default/elements/divider.variables +1 -1
- package/src/themes/default/elements/icon.variables +2 -2
- package/src/themes/default/elements/image.variables +1 -1
- package/src/themes/default/elements/input.variables +2 -2
- package/src/themes/default/elements/label.variables +4 -4
- package/src/themes/default/elements/list.variables +1 -1
- package/src/themes/default/elements/placeholder.variables +6 -6
- package/src/themes/default/elements/segment.variables +8 -8
- package/src/themes/default/globals/reset.overrides +45 -201
- package/src/themes/default/globals/site.variables +50 -50
- package/src/themes/default/globals/variation.variables +3 -2
- package/src/themes/default/modules/accordion.variables +0 -1
- package/src/themes/default/modules/checkbox.variables +1 -1
- package/src/themes/default/modules/dimmer.variables +12 -12
- package/src/themes/default/modules/dropdown.variables +17 -16
- package/src/themes/default/modules/embed.variables +2 -2
- package/src/themes/default/modules/flyout.variables +3 -3
- package/src/themes/default/modules/modal.variables +14 -14
- package/src/themes/default/modules/nag.variables +1 -1
- package/src/themes/default/modules/rating.variables +1 -1
- package/src/themes/default/modules/search.variables +1 -1
- package/src/themes/default/modules/shape.variables +1 -1
- package/src/themes/default/modules/sidebar.variables +2 -2
- package/src/themes/default/modules/toast.variables +4 -4
- package/src/themes/default/views/card.variables +6 -7
- package/src/themes/default/views/feed.variables +4 -4
- package/src/themes/default/views/item.variables +2 -3
- package/src/themes/flat/collections/form.variables +1 -1
- package/src/themes/flat/globals/site.variables +9 -9
- package/src/themes/github/collections/form.overrides +3 -3
- package/src/themes/github/collections/form.variables +3 -3
- package/src/themes/github/collections/menu.overrides +1 -1
- package/src/themes/github/collections/menu.variables +10 -10
- package/src/themes/github/collections/message.variables +6 -6
- package/src/themes/github/elements/button.variables +17 -17
- package/src/themes/github/elements/input.variables +3 -3
- package/src/themes/github/elements/segment.variables +2 -2
- package/src/themes/github/elements/step.overrides +4 -4
- package/src/themes/github/elements/step.variables +3 -3
- package/src/themes/github/globals/site.variables +2 -2
- package/src/themes/github/modules/dropdown.variables +1 -3
- package/src/themes/gmail/collections/message.variables +2 -2
- package/src/themes/material/collections/menu.variables +1 -1
- package/src/themes/material/elements/button.overrides +4 -4
- package/src/themes/material/elements/button.variables +5 -5
- package/src/themes/material/modules/dropdown.variables +1 -1
- package/src/themes/material/modules/modal.variables +1 -1
- package/src/themes/raised/elements/button.variables +1 -1
- package/src/themes/round/elements/button.variables +12 -12
- package/src/themes/striped/modules/progress.overrides +3 -3
- package/src/themes/timeline/views/feed.variables +2 -2
- package/src/themes/twitter/elements/button.overrides +1 -1
- package/src/themes/twitter/elements/button.variables +4 -5
- package/tasks/admin/components/create.js +12 -15
- package/tasks/admin/components/init.js +11 -12
- package/tasks/admin/components/update.js +19 -20
- package/tasks/admin/distributions/create.js +30 -51
- package/tasks/admin/distributions/init.js +11 -12
- package/tasks/admin/distributions/update.js +18 -19
- package/tasks/admin/register.js +7 -7
- package/tasks/build/assets.js +1 -1
- package/tasks/build/css.js +5 -5
- package/tasks/build/javascript.js +1 -1
- package/tasks/config/admin/github.js +1 -1
- package/tasks/config/admin/templates/css-package.js +1 -1
- package/tasks/config/admin/templates/less-package.js +1 -1
- package/tasks/config/project/config.js +10 -10
- package/tasks/config/project/install.js +12 -12
- package/tasks/config/project/release.js +6 -12
- package/tasks/config/tasks.js +15 -11
- package/tasks/config/user.js +1 -4
- package/tasks/docs/metadata.js +18 -20
- package/tasks/install.js +14 -12
- package/test/meteor/assets.js +4 -4
- package/test/meteor/fonts.js +10 -11
- package/test/modules/module.spec.js +18 -18
package/dist/components/form.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* # Fomantic-UI 2.10.0-beta.
|
|
2
|
+
* # Fomantic-UI 2.10.0-beta.81+4f706c2 - Form Validation
|
|
3
3
|
* https://github.com/fomantic/Fomantic-UI/
|
|
4
4
|
*
|
|
5
5
|
*
|
|
@@ -19,20 +19,20 @@
|
|
|
19
19
|
? window
|
|
20
20
|
: globalThis;
|
|
21
21
|
|
|
22
|
-
$.fn.form = function (
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
$.fn.form = function (...args) {
|
|
23
|
+
const $allModules = $(this);
|
|
24
|
+
const $window = $(window);
|
|
25
25
|
|
|
26
26
|
let time = Date.now();
|
|
27
27
|
let performance = [];
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
const parameters = args[0];
|
|
30
|
+
const methodInvoked = typeof parameters === 'string';
|
|
31
|
+
const queryArguments = args.slice(1);
|
|
32
32
|
let returnedValue;
|
|
33
33
|
$allModules.each(function () {
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
const $module = $(this);
|
|
35
|
+
const element = this;
|
|
36
36
|
|
|
37
37
|
let formErrors = [];
|
|
38
38
|
let formErrorsTracker = {};
|
|
@@ -64,12 +64,11 @@
|
|
|
64
64
|
|
|
65
65
|
let submitting = false;
|
|
66
66
|
let dirty = false;
|
|
67
|
-
|
|
67
|
+
const history = ['clean', 'clean'];
|
|
68
68
|
|
|
69
69
|
let instance;
|
|
70
|
-
let module;
|
|
71
70
|
|
|
72
|
-
module = {
|
|
71
|
+
const module = {
|
|
73
72
|
|
|
74
73
|
initialize: function () {
|
|
75
74
|
// settings grabbed at run time
|
|
@@ -79,7 +78,7 @@
|
|
|
79
78
|
if (instance === undefined) {
|
|
80
79
|
module.instantiate();
|
|
81
80
|
}
|
|
82
|
-
module.invoke(
|
|
81
|
+
module.invoke(parameters);
|
|
83
82
|
} else {
|
|
84
83
|
if (instance !== undefined) {
|
|
85
84
|
instance.invoke('destroy');
|
|
@@ -162,9 +161,9 @@
|
|
|
162
161
|
$module.on('keydown' + eventNamespace, selector.field, module.event.field.keydown);
|
|
163
162
|
}
|
|
164
163
|
$field.each(function (index, el) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
164
|
+
const $input = $(el);
|
|
165
|
+
const type = $input.prop('type');
|
|
166
|
+
const inputEvent = module.get.changeEvent(type, $input);
|
|
168
167
|
$input.on(inputEvent + eventNamespace, module.event.field.change);
|
|
169
168
|
});
|
|
170
169
|
|
|
@@ -177,16 +176,16 @@
|
|
|
177
176
|
+ ' click' + eventNamespace
|
|
178
177
|
+ ' keyup' + eventNamespace
|
|
179
178
|
+ ' keydown' + eventNamespace
|
|
180
|
-
+ ' blur' + eventNamespace, function (
|
|
181
|
-
module.determine.isDirty();
|
|
179
|
+
+ ' blur' + eventNamespace, function (event) {
|
|
180
|
+
module.determine.isDirty(event);
|
|
182
181
|
});
|
|
183
182
|
|
|
184
|
-
$module.on('dirty' + eventNamespace, function (
|
|
185
|
-
settings.onDirty.call();
|
|
183
|
+
$module.on('dirty' + eventNamespace, function (event) {
|
|
184
|
+
settings.onDirty.call(element, event);
|
|
186
185
|
});
|
|
187
186
|
|
|
188
|
-
$module.on('clean' + eventNamespace, function (
|
|
189
|
-
settings.onClean.call();
|
|
187
|
+
$module.on('clean' + eventNamespace, function (event) {
|
|
188
|
+
settings.onClean.call(element, event);
|
|
190
189
|
});
|
|
191
190
|
if (attachEventsSelector) {
|
|
192
191
|
module.attachEvents(attachEventsSelector, attachEventsAction);
|
|
@@ -195,16 +194,16 @@
|
|
|
195
194
|
|
|
196
195
|
clear: function () {
|
|
197
196
|
$field.each(function (index, el) {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
197
|
+
const $field = $(el);
|
|
198
|
+
const $element = $field.parent();
|
|
199
|
+
const $fieldGroup = $field.closest($group);
|
|
200
|
+
const $prompt = $fieldGroup.find(selector.prompt);
|
|
201
|
+
const $calendar = $field.closest(selector.uiCalendar);
|
|
202
|
+
const defaultValue = $field.data(metadata.defaultValue) || '';
|
|
203
|
+
const isCheckbox = $field.is(selector.checkbox);
|
|
204
|
+
const isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown');
|
|
205
|
+
const isCalendar = $calendar.length > 0 && module.can.useElement('calendar');
|
|
206
|
+
const isErrored = $fieldGroup.hasClass(className.error);
|
|
208
207
|
if (isErrored) {
|
|
209
208
|
module.verbose('Resetting error on field', $fieldGroup);
|
|
210
209
|
$fieldGroup.removeClass(className.error);
|
|
@@ -227,17 +226,17 @@
|
|
|
227
226
|
|
|
228
227
|
reset: function () {
|
|
229
228
|
$field.each(function (index, el) {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
229
|
+
const $field = $(el);
|
|
230
|
+
const $element = $field.parent();
|
|
231
|
+
const $fieldGroup = $field.closest($group);
|
|
232
|
+
const $calendar = $field.closest(selector.uiCalendar);
|
|
233
|
+
const $prompt = $fieldGroup.find(selector.prompt);
|
|
234
|
+
const defaultValue = $field.data(metadata.defaultValue);
|
|
235
|
+
const isCheckbox = $field.is(selector.checkbox);
|
|
236
|
+
const isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown');
|
|
237
|
+
const isCalendar = $calendar.length > 0 && module.can.useElement('calendar');
|
|
238
|
+
const isFile = $field.is(selector.file);
|
|
239
|
+
const isErrored = $fieldGroup.hasClass(className.error);
|
|
241
240
|
if (defaultValue === undefined) {
|
|
242
241
|
return;
|
|
243
242
|
}
|
|
@@ -266,9 +265,9 @@
|
|
|
266
265
|
isValid: function () {
|
|
267
266
|
let allValid = true;
|
|
268
267
|
$field.each(function (index, el) {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
268
|
+
const $el = $(el);
|
|
269
|
+
const validation = module.get.validation($el) || {};
|
|
270
|
+
const identifier = module.get.identifier(validation, $el);
|
|
272
271
|
if (!module.validate.field(validation, identifier, true)) {
|
|
273
272
|
allValid = false;
|
|
274
273
|
}
|
|
@@ -276,15 +275,14 @@
|
|
|
276
275
|
|
|
277
276
|
return allValid;
|
|
278
277
|
},
|
|
279
|
-
isDirty: function (
|
|
278
|
+
isDirty: function (event) {
|
|
280
279
|
let formIsDirty = false;
|
|
281
280
|
|
|
282
281
|
$field.each(function (index, el) {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
let isDirty;
|
|
282
|
+
const $el = $(el);
|
|
283
|
+
const isCheckbox = $el.filter(selector.checkbox).length > 0;
|
|
286
284
|
|
|
287
|
-
isDirty = isCheckbox
|
|
285
|
+
const isDirty = isCheckbox
|
|
288
286
|
? module.is.checkboxDirty($el)
|
|
289
287
|
: module.is.fieldDirty($el);
|
|
290
288
|
|
|
@@ -361,10 +359,10 @@
|
|
|
361
359
|
currentValue = currentValue.toString();
|
|
362
360
|
}
|
|
363
361
|
// Boolean values can be encoded as "true/false" or "True/False" depending on underlying frameworks, so we need a case-insensitive comparison
|
|
364
|
-
|
|
365
|
-
|
|
362
|
+
const boolRegex = /^(true|false)$/i;
|
|
363
|
+
const isBoolValue = boolRegex.test(initialValue) && boolRegex.test(currentValue);
|
|
366
364
|
if (isBoolValue) {
|
|
367
|
-
|
|
365
|
+
const regex = new RegExp('^' + initialValue + '$', 'i');
|
|
368
366
|
|
|
369
367
|
return !regex.test(currentValue);
|
|
370
368
|
}
|
|
@@ -372,8 +370,8 @@
|
|
|
372
370
|
return currentValue !== initialValue;
|
|
373
371
|
},
|
|
374
372
|
checkboxDirty: function ($el) {
|
|
375
|
-
|
|
376
|
-
|
|
373
|
+
const initialValue = $el.data(metadata.defaultValue);
|
|
374
|
+
const currentValue = $el.is(':checked');
|
|
377
375
|
|
|
378
376
|
return initialValue !== currentValue;
|
|
379
377
|
},
|
|
@@ -401,12 +399,12 @@
|
|
|
401
399
|
event: {
|
|
402
400
|
field: {
|
|
403
401
|
keydown: function (event) {
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
402
|
+
const $field = $(this);
|
|
403
|
+
const key = event.which;
|
|
404
|
+
const isInput = $field.is(selector.input);
|
|
405
|
+
const isCheckbox = $field.is(selector.checkbox);
|
|
406
|
+
const isInDropdown = $field.closest(selector.uiDropdown).length > 0;
|
|
407
|
+
const keyCode = {
|
|
410
408
|
enter: 13,
|
|
411
409
|
escape: 27,
|
|
412
410
|
};
|
|
@@ -431,9 +429,9 @@
|
|
|
431
429
|
event.preventDefault();
|
|
432
430
|
},
|
|
433
431
|
blur: function (event) {
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
432
|
+
const $field = $(this);
|
|
433
|
+
const validationRules = module.get.validation($field) || {};
|
|
434
|
+
const identifier = module.get.identifier(validationRules, $field);
|
|
437
435
|
if (settings.on === 'blur' || (!$module.hasClass(className.initial) && settings.revalidate)) {
|
|
438
436
|
module.debug('Revalidating field', $field, validationRules);
|
|
439
437
|
module.validate.field(validationRules, identifier);
|
|
@@ -443,9 +441,9 @@
|
|
|
443
441
|
}
|
|
444
442
|
},
|
|
445
443
|
change: function (event) {
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
444
|
+
const $field = $(this);
|
|
445
|
+
const validationRules = module.get.validation($field) || {};
|
|
446
|
+
const identifier = module.get.identifier(validationRules, $field);
|
|
449
447
|
if (settings.on === 'change' || (!$module.hasClass(className.initial) && settings.revalidate)) {
|
|
450
448
|
clearTimeout(module.timer);
|
|
451
449
|
module.timer = setTimeout(function () {
|
|
@@ -492,10 +490,10 @@
|
|
|
492
490
|
return rule.type;
|
|
493
491
|
},
|
|
494
492
|
changeEvent: function (type, $input) {
|
|
495
|
-
return ['file', 'checkbox', 'radio', 'hidden'].
|
|
493
|
+
return ['file', 'checkbox', 'radio', 'hidden'].includes(type) || $input.is('select') ? 'change' : 'input';
|
|
496
494
|
},
|
|
497
495
|
fieldsFromShorthand: function (fields) {
|
|
498
|
-
|
|
496
|
+
const fullFields = {};
|
|
499
497
|
$.each(fields, function (name, rules) {
|
|
500
498
|
if (!Array.isArray(rules) && typeof rules === 'object') {
|
|
501
499
|
fullFields[name] = rules;
|
|
@@ -510,13 +508,6 @@
|
|
|
510
508
|
fullFields[name].rules.push({ type: rule });
|
|
511
509
|
});
|
|
512
510
|
}
|
|
513
|
-
|
|
514
|
-
$.each(fullFields[name].rules, function (index, rule) {
|
|
515
|
-
let ruleName = module.get.ruleName(rule);
|
|
516
|
-
if (ruleName === 'empty') {
|
|
517
|
-
module.warn('*** DEPRECATED *** : Rule "empty" for field "' + name + '" will be removed in a future version. -> Use "notEmpty" rule instead.');
|
|
518
|
-
}
|
|
519
|
-
});
|
|
520
511
|
});
|
|
521
512
|
|
|
522
513
|
return fullFields;
|
|
@@ -525,42 +516,42 @@
|
|
|
525
516
|
return validation.identifier || $el.attr('id') || $el.attr('name') || $el.data(metadata.validate);
|
|
526
517
|
},
|
|
527
518
|
prompt: function (rule, field) {
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
519
|
+
const ruleName = module.get.ruleName(rule);
|
|
520
|
+
const ancillary = module.get.ancillaryValue(rule);
|
|
521
|
+
const $field = module.get.field(field.identifier);
|
|
522
|
+
const value = $field.val();
|
|
523
|
+
const promptCheck = rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule;
|
|
533
524
|
let prompt = String(isFunction(promptCheck)
|
|
534
525
|
? promptCheck.call($field[0], value)
|
|
535
526
|
: promptCheck);
|
|
536
|
-
|
|
537
|
-
|
|
527
|
+
const requiresValue = prompt.search('{value}') !== -1;
|
|
528
|
+
const requiresName = prompt.search('{name}') !== -1;
|
|
538
529
|
let parts;
|
|
539
530
|
let suffixPrompt;
|
|
540
|
-
if (ancillary && ['integer', 'decimal', 'number', 'size'].
|
|
531
|
+
if (ancillary && ['integer', 'decimal', 'number', 'size'].includes(ruleName) && ancillary.includes('..')) {
|
|
541
532
|
parts = ancillary.split('..', 2);
|
|
542
533
|
if (!rule.prompt && ruleName !== 'size') {
|
|
543
534
|
suffixPrompt = parts[0] === ''
|
|
544
|
-
? settings.prompt.maxValue.
|
|
535
|
+
? settings.prompt.maxValue.replaceAll('{ruleValue}', '{max}')
|
|
545
536
|
: (parts[1] === ''
|
|
546
|
-
? settings.prompt.minValue.
|
|
537
|
+
? settings.prompt.minValue.replaceAll('{ruleValue}', '{min}')
|
|
547
538
|
: settings.prompt.range);
|
|
548
|
-
prompt += suffixPrompt.
|
|
539
|
+
prompt += suffixPrompt.replaceAll('{name}', ' ' + settings.text.and);
|
|
549
540
|
}
|
|
550
|
-
prompt = prompt.
|
|
551
|
-
prompt = prompt.
|
|
541
|
+
prompt = prompt.replaceAll('{min}', parts[0]);
|
|
542
|
+
prompt = prompt.replaceAll('{max}', parts[1]);
|
|
552
543
|
}
|
|
553
|
-
if (ancillary && ['match', 'different'].
|
|
554
|
-
prompt = prompt.
|
|
544
|
+
if (ancillary && ['match', 'different'].includes(ruleName)) {
|
|
545
|
+
prompt = prompt.replaceAll('{ruleValue}', module.get.fieldLabel(ancillary, true));
|
|
555
546
|
}
|
|
556
547
|
if (requiresValue) {
|
|
557
|
-
prompt = prompt.
|
|
548
|
+
prompt = prompt.replaceAll('{value}', $field.val());
|
|
558
549
|
}
|
|
559
550
|
if (requiresName) {
|
|
560
|
-
prompt = prompt.
|
|
551
|
+
prompt = prompt.replaceAll('{name}', module.get.fieldLabel($field));
|
|
561
552
|
}
|
|
562
|
-
prompt = prompt.
|
|
563
|
-
prompt = prompt.
|
|
553
|
+
prompt = prompt.replaceAll('{identifier}', field.identifier);
|
|
554
|
+
prompt = prompt.replaceAll('{ruleValue}', ancillary);
|
|
564
555
|
if (!rule.prompt) {
|
|
565
556
|
module.verbose('Using default validation prompt for type', prompt, ruleName);
|
|
566
557
|
}
|
|
@@ -631,10 +622,10 @@
|
|
|
631
622
|
return $fields;
|
|
632
623
|
},
|
|
633
624
|
fieldLabel: function (identifier, useIdAsFallback) {
|
|
634
|
-
|
|
625
|
+
const $field = typeof identifier === 'string'
|
|
635
626
|
? module.get.field(identifier)
|
|
636
627
|
: identifier;
|
|
637
|
-
|
|
628
|
+
const $label = $field.closest(selector.group).find('label:not(:empty)').eq(0);
|
|
638
629
|
|
|
639
630
|
return $label.length === 1
|
|
640
631
|
? $label.text()
|
|
@@ -661,30 +652,28 @@
|
|
|
661
652
|
return fieldValidation || false;
|
|
662
653
|
},
|
|
663
654
|
value: function (field, strict) {
|
|
664
|
-
|
|
665
|
-
let results;
|
|
666
|
-
let resultKeys;
|
|
655
|
+
const fields = [];
|
|
667
656
|
fields.push(field);
|
|
668
|
-
results = module.get.values.call(element, fields, strict);
|
|
669
|
-
resultKeys = Object.keys(results);
|
|
657
|
+
const results = module.get.values.call(element, fields, strict);
|
|
658
|
+
const resultKeys = Object.keys(results);
|
|
670
659
|
|
|
671
660
|
return resultKeys.length > 0 ? results[resultKeys[0]] : undefined;
|
|
672
661
|
},
|
|
673
662
|
values: function (fields, strict) {
|
|
674
|
-
|
|
663
|
+
const $fields = Array.isArray(fields) && fields.length > 0
|
|
675
664
|
? module.get.fields(fields, strict)
|
|
676
665
|
: $field;
|
|
677
|
-
|
|
666
|
+
const values = {};
|
|
678
667
|
$fields.each(function (index, field) {
|
|
679
|
-
|
|
680
|
-
|
|
668
|
+
const $field = $(field);
|
|
669
|
+
const $calendar = $field.closest(selector.uiCalendar);
|
|
681
670
|
let name = $field.prop('name') || $field.prop('id');
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
671
|
+
const value = $field.val();
|
|
672
|
+
const isCheckbox = $field.is(selector.checkbox);
|
|
673
|
+
const isRadio = $field.is(selector.radio);
|
|
674
|
+
const isMultiple = name.includes('[]');
|
|
675
|
+
const isCalendar = $calendar.length > 0 && module.can.useElement('calendar');
|
|
676
|
+
const isChecked = isCheckbox
|
|
688
677
|
? $field.is(':checked')
|
|
689
678
|
: false;
|
|
690
679
|
if (name) {
|
|
@@ -702,74 +691,73 @@
|
|
|
702
691
|
} else {
|
|
703
692
|
values[name].push(value);
|
|
704
693
|
}
|
|
705
|
-
} else {
|
|
706
|
-
if (
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
let date = $calendar.calendar('get date');
|
|
694
|
+
} else if (isRadio) {
|
|
695
|
+
if (values[name] === undefined || values[name] === false) {
|
|
696
|
+
values[name] = isChecked
|
|
697
|
+
? value || true
|
|
698
|
+
: false;
|
|
699
|
+
}
|
|
700
|
+
} else if (isCheckbox) {
|
|
701
|
+
values[name] = isChecked ? value || true : false;
|
|
702
|
+
} else if (isCalendar) {
|
|
703
|
+
const date = $calendar.calendar('get date');
|
|
716
704
|
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
705
|
+
if (date !== null) {
|
|
706
|
+
switch (settings.dateHandling) {
|
|
707
|
+
case 'date': {
|
|
708
|
+
values[name] = date;
|
|
721
709
|
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
710
|
+
break;
|
|
711
|
+
}
|
|
712
|
+
case 'input': {
|
|
713
|
+
values[name] = $calendar.calendar('get input date');
|
|
726
714
|
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
}
|
|
738
|
-
case 'datetime': {
|
|
739
|
-
values[name] = settings.formatter.datetime(date);
|
|
740
|
-
|
|
741
|
-
break;
|
|
742
|
-
}
|
|
743
|
-
case 'time': {
|
|
744
|
-
values[name] = settings.formatter.time(date);
|
|
745
|
-
|
|
746
|
-
break;
|
|
747
|
-
}
|
|
748
|
-
case 'month': {
|
|
749
|
-
values[name] = settings.formatter.month(date);
|
|
750
|
-
|
|
751
|
-
break;
|
|
752
|
-
}
|
|
753
|
-
case 'year': {
|
|
754
|
-
values[name] = settings.formatter.year(date);
|
|
755
|
-
|
|
756
|
-
break;
|
|
757
|
-
}
|
|
758
|
-
default: {
|
|
759
|
-
module.debug('Wrong calendar mode', $calendar, type);
|
|
760
|
-
values[name] = '';
|
|
761
|
-
}
|
|
715
|
+
break;
|
|
716
|
+
}
|
|
717
|
+
case 'formatter': {
|
|
718
|
+
const type = $calendar.calendar('setting', 'type');
|
|
719
|
+
|
|
720
|
+
switch (type) {
|
|
721
|
+
case 'date': {
|
|
722
|
+
values[name] = settings.formatter.date(date);
|
|
723
|
+
|
|
724
|
+
break;
|
|
762
725
|
}
|
|
726
|
+
case 'datetime': {
|
|
727
|
+
values[name] = settings.formatter.datetime(date);
|
|
763
728
|
|
|
764
|
-
|
|
729
|
+
break;
|
|
730
|
+
}
|
|
731
|
+
case 'time': {
|
|
732
|
+
values[name] = settings.formatter.time(date);
|
|
733
|
+
|
|
734
|
+
break;
|
|
735
|
+
}
|
|
736
|
+
case 'month': {
|
|
737
|
+
values[name] = settings.formatter.month(date);
|
|
738
|
+
|
|
739
|
+
break;
|
|
740
|
+
}
|
|
741
|
+
case 'year': {
|
|
742
|
+
values[name] = settings.formatter.year(date);
|
|
743
|
+
|
|
744
|
+
break;
|
|
745
|
+
}
|
|
746
|
+
default: {
|
|
747
|
+
module.debug('Wrong calendar mode', $calendar, type);
|
|
748
|
+
values[name] = '';
|
|
749
|
+
}
|
|
765
750
|
}
|
|
751
|
+
|
|
752
|
+
break;
|
|
766
753
|
}
|
|
767
|
-
|
|
768
|
-
values[name] = '';
|
|
754
|
+
// no default
|
|
769
755
|
}
|
|
770
756
|
} else {
|
|
771
|
-
values[name] =
|
|
757
|
+
values[name] = '';
|
|
772
758
|
}
|
|
759
|
+
} else {
|
|
760
|
+
values[name] = value;
|
|
773
761
|
}
|
|
774
762
|
}
|
|
775
763
|
});
|
|
@@ -832,7 +820,7 @@
|
|
|
832
820
|
rules: [],
|
|
833
821
|
};
|
|
834
822
|
}
|
|
835
|
-
|
|
823
|
+
const newValidation = {
|
|
836
824
|
rules: [],
|
|
837
825
|
};
|
|
838
826
|
if (module.is.shorthandRules(rules)) {
|
|
@@ -865,11 +853,11 @@
|
|
|
865
853
|
if (errors === false) {
|
|
866
854
|
return;
|
|
867
855
|
}
|
|
868
|
-
|
|
869
|
-
|
|
856
|
+
const $field = module.get.field(identifier);
|
|
857
|
+
const $fieldGroup = $field.closest($group);
|
|
870
858
|
let $prompt = $fieldGroup.children(selector.prompt);
|
|
871
859
|
let promptExists = $prompt.length > 0;
|
|
872
|
-
|
|
860
|
+
const canTransition = settings.transition && module.can.useElement('transition');
|
|
873
861
|
module.verbose('Adding field error state', identifier);
|
|
874
862
|
if (!internal) {
|
|
875
863
|
$fieldGroup
|
|
@@ -930,8 +918,8 @@
|
|
|
930
918
|
if (tempErrors !== false) {
|
|
931
919
|
$.each(tempErrors, function (index, tempError) {
|
|
932
920
|
customErrors.push(settings.prompt.addErrors
|
|
933
|
-
.
|
|
934
|
-
.
|
|
921
|
+
.replaceAll('{name}', module.get.fieldLabel(id))
|
|
922
|
+
.replaceAll('{error}', tempError));
|
|
935
923
|
});
|
|
936
924
|
}
|
|
937
925
|
}
|
|
@@ -960,7 +948,7 @@
|
|
|
960
948
|
module.determine.isDirty();
|
|
961
949
|
},
|
|
962
950
|
rule: function (field, rule) {
|
|
963
|
-
|
|
951
|
+
const rules = Array.isArray(rule)
|
|
964
952
|
? rule
|
|
965
953
|
: [rule];
|
|
966
954
|
if (validation[field] === undefined || !Array.isArray(validation[field].rules)) {
|
|
@@ -977,14 +965,14 @@
|
|
|
977
965
|
return;
|
|
978
966
|
}
|
|
979
967
|
$.each(validation[field].rules, function (index, rule) {
|
|
980
|
-
if (rule && rules.
|
|
968
|
+
if (rule && rules.includes(rule.type)) {
|
|
981
969
|
module.debug('Removed rule', rule.type);
|
|
982
970
|
validation[field].rules.splice(index, 1);
|
|
983
971
|
}
|
|
984
972
|
});
|
|
985
973
|
},
|
|
986
974
|
field: function (field) {
|
|
987
|
-
|
|
975
|
+
const fields = Array.isArray(field)
|
|
988
976
|
? field
|
|
989
977
|
: [field];
|
|
990
978
|
$.each(fields, function (index, field) {
|
|
@@ -1006,9 +994,9 @@
|
|
|
1006
994
|
module.remove.field(fields);
|
|
1007
995
|
},
|
|
1008
996
|
prompt: function (identifier) {
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
997
|
+
const $field = module.get.field(identifier);
|
|
998
|
+
const $fieldGroup = $field.closest($group);
|
|
999
|
+
const $prompt = $fieldGroup.children(selector.prompt);
|
|
1012
1000
|
$fieldGroup
|
|
1013
1001
|
.removeClass(className.error);
|
|
1014
1002
|
if (settings.inline && $prompt.is(':visible')) {
|
|
@@ -1035,13 +1023,13 @@
|
|
|
1035
1023
|
},
|
|
1036
1024
|
defaults: function () {
|
|
1037
1025
|
$field.each(function (index, el) {
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1026
|
+
const $el = $(el);
|
|
1027
|
+
const $parent = $el.parent();
|
|
1028
|
+
const isCheckbox = $el.filter(selector.checkbox).length > 0;
|
|
1029
|
+
const isDropdown = ($parent.is(selector.uiDropdown) || $el.is(selector.uiDropdown)) && module.can.useElement('dropdown');
|
|
1030
|
+
const $calendar = $el.closest(selector.uiCalendar);
|
|
1031
|
+
const isCalendar = $calendar.length > 0 && module.can.useElement('calendar');
|
|
1032
|
+
const value = isCheckbox
|
|
1045
1033
|
? $el.is(':checked')
|
|
1046
1034
|
: $el.val();
|
|
1047
1035
|
if (isDropdown) {
|
|
@@ -1063,7 +1051,7 @@
|
|
|
1063
1051
|
.addClass(className.error);
|
|
1064
1052
|
},
|
|
1065
1053
|
value: function (field, value) {
|
|
1066
|
-
|
|
1054
|
+
const fields = {};
|
|
1067
1055
|
fields[field] = value;
|
|
1068
1056
|
|
|
1069
1057
|
return module.set.values.call(element, fields);
|
|
@@ -1073,16 +1061,16 @@
|
|
|
1073
1061
|
return;
|
|
1074
1062
|
}
|
|
1075
1063
|
$.each(fields, function (key, value) {
|
|
1076
|
-
|
|
1064
|
+
const $field = module.get.field(key);
|
|
1077
1065
|
let $element = $field.parent();
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1066
|
+
const $calendar = $field.closest(selector.uiCalendar);
|
|
1067
|
+
const isFile = $field.is(selector.file);
|
|
1068
|
+
const isMultiple = Array.isArray(value);
|
|
1069
|
+
const isCheckbox = $element.is(selector.uiCheckbox) && module.can.useElement('checkbox');
|
|
1070
|
+
const isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown');
|
|
1071
|
+
const isRadio = $field.is(selector.radio) && isCheckbox;
|
|
1072
|
+
const isCalendar = $calendar.length > 0 && module.can.useElement('calendar');
|
|
1073
|
+
const fieldExists = $field.length > 0;
|
|
1086
1074
|
let $multipleField;
|
|
1087
1075
|
if (fieldExists) {
|
|
1088
1076
|
if (isMultiple && isCheckbox) {
|
|
@@ -1161,18 +1149,18 @@
|
|
|
1161
1149
|
});
|
|
1162
1150
|
}
|
|
1163
1151
|
$field.each(function (_index, el) {
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1152
|
+
const $el = $(el);
|
|
1153
|
+
const $elGroup = $el.closest($group);
|
|
1154
|
+
const isCheckbox = $el.filter(selector.checkbox).length > 0;
|
|
1155
|
+
const isRequired = $el.prop('required') || $elGroup.hasClass(className.required) || $elGroup.parent().hasClass(className.required);
|
|
1156
|
+
const isDisabled = $el.is(':disabled') || $elGroup.hasClass(className.disabled) || $elGroup.parent().hasClass(className.disabled);
|
|
1157
|
+
const validation = module.get.validation($el);
|
|
1158
|
+
const hasNotEmptyRule = validation
|
|
1171
1159
|
? $.grep(validation.rules, function (rule) {
|
|
1172
|
-
return ['notEmpty', 'checked'
|
|
1160
|
+
return ['notEmpty', 'checked'].includes(rule.type);
|
|
1173
1161
|
}).length > 0
|
|
1174
1162
|
: false;
|
|
1175
|
-
|
|
1163
|
+
const identifier = module.get.identifier(validation, $el);
|
|
1176
1164
|
if (isRequired && !isDisabled && !hasNotEmptyRule && identifier !== undefined) {
|
|
1177
1165
|
if (isCheckbox) {
|
|
1178
1166
|
module.verbose("Adding 'checked' rule on field", identifier);
|
|
@@ -1197,7 +1185,7 @@
|
|
|
1197
1185
|
validate: {
|
|
1198
1186
|
|
|
1199
1187
|
form: function (event, ignoreCallbacks) {
|
|
1200
|
-
|
|
1188
|
+
const values = module.get.values();
|
|
1201
1189
|
|
|
1202
1190
|
// input keydown event will fire submit repeatedly by browser default
|
|
1203
1191
|
if (keyHeldDown) {
|
|
@@ -1253,10 +1241,7 @@
|
|
|
1253
1241
|
},
|
|
1254
1242
|
|
|
1255
1243
|
// takes a validation object and returns whether field passes validation
|
|
1256
|
-
field: function (field, fieldName, showErrors) {
|
|
1257
|
-
showErrors = showErrors !== undefined
|
|
1258
|
-
? showErrors
|
|
1259
|
-
: true;
|
|
1244
|
+
field: function (field, fieldName, showErrors = true) {
|
|
1260
1245
|
if (typeof field === 'string') {
|
|
1261
1246
|
module.verbose('Validating field', field);
|
|
1262
1247
|
fieldName = field;
|
|
@@ -1267,17 +1252,22 @@
|
|
|
1267
1252
|
|
|
1268
1253
|
return true;
|
|
1269
1254
|
}
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1255
|
+
const identifier = field.identifier || fieldName;
|
|
1256
|
+
if (!identifier) {
|
|
1257
|
+
module.debug('No identifier given. Skipping');
|
|
1258
|
+
|
|
1259
|
+
return true;
|
|
1260
|
+
}
|
|
1261
|
+
const $field = module.get.field(identifier);
|
|
1262
|
+
const $fieldGroup = $field.closest($group);
|
|
1263
|
+
const $dependsField = field.depends
|
|
1274
1264
|
? module.get.field(field.depends)
|
|
1275
1265
|
: false;
|
|
1276
1266
|
let fieldValid = true;
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1267
|
+
const fieldErrors = [];
|
|
1268
|
+
const isDisabled = $field.filter(':not(:disabled)').length === 0 || $fieldGroup.hasClass(className.disabled) || $fieldGroup.parent().hasClass(className.disabled);
|
|
1269
|
+
const validationMessage = $field[0].validationMessage;
|
|
1270
|
+
const noNativeValidation = field.noNativeValidation || settings.noNativeValidation || $field.filter('[formnovalidate],[novalidate]').length > 0 || $module.filter('[novalidate]').length > 0;
|
|
1281
1271
|
let errorLimit;
|
|
1282
1272
|
if (!field.identifier) {
|
|
1283
1273
|
module.debug('Using field name as identifier', identifier);
|
|
@@ -1303,16 +1293,16 @@
|
|
|
1303
1293
|
errorLimit = field.errorLimit || settings.errorLimit;
|
|
1304
1294
|
$.each(field.rules, function (index, rule) {
|
|
1305
1295
|
if (module.has.field(identifier) && (!errorLimit || fieldErrors.length < errorLimit)) {
|
|
1306
|
-
|
|
1296
|
+
const invalidFields = module.validate.rule(field, rule, true) || [];
|
|
1307
1297
|
if (invalidFields.length > 0) {
|
|
1308
1298
|
module.debug('Field is invalid', identifier, rule.type);
|
|
1309
|
-
|
|
1299
|
+
const fieldError = module.get.prompt(rule, field);
|
|
1310
1300
|
if (!settings.inline) {
|
|
1311
1301
|
if (
|
|
1312
1302
|
// Always allow the first error prompt for new field identifiers
|
|
1313
1303
|
(!(identifier in formErrorsTracker)
|
|
1314
1304
|
// Also allow multiple error prompts per field identifier but make sure each prompt is unique
|
|
1315
|
-
|| formErrorsTracker[identifier].
|
|
1305
|
+
|| !formErrorsTracker[identifier].includes(fieldError))
|
|
1316
1306
|
// Limit the number of unique error prompts for every field identifier if specified
|
|
1317
1307
|
&& (!errorLimit || (formErrorsTracker[identifier] || []).length < errorLimit)
|
|
1318
1308
|
) {
|
|
@@ -1337,7 +1327,7 @@
|
|
|
1337
1327
|
}
|
|
1338
1328
|
} else {
|
|
1339
1329
|
if (showErrors && fieldErrors.length > 0) {
|
|
1340
|
-
formErrors = formErrors
|
|
1330
|
+
formErrors = [...formErrors, ...fieldErrors];
|
|
1341
1331
|
module.add.prompt(identifier, fieldErrors, true);
|
|
1342
1332
|
settings.onInvalid.call($field, fieldErrors);
|
|
1343
1333
|
}
|
|
@@ -1350,13 +1340,13 @@
|
|
|
1350
1340
|
|
|
1351
1341
|
// takes validation rule and returns whether field passes rule
|
|
1352
1342
|
rule: function (field, rule, internal) {
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1343
|
+
const $field = module.get.field(field.identifier);
|
|
1344
|
+
const ancillary = module.get.ancillaryValue(rule);
|
|
1345
|
+
const ruleName = module.get.ruleName(rule);
|
|
1346
|
+
const ruleFunction = settings.rules[ruleName];
|
|
1357
1347
|
let invalidFields = [];
|
|
1358
|
-
|
|
1359
|
-
|
|
1348
|
+
const isCheckbox = $field.is(selector.checkbox);
|
|
1349
|
+
const isValid = function (field) {
|
|
1360
1350
|
let value = isCheckbox ? $(field).filter(':checked').val() : $(field).val();
|
|
1361
1351
|
// cast to string avoiding encoding special values
|
|
1362
1352
|
value = value === undefined || value === '' || value === null
|
|
@@ -1406,36 +1396,36 @@
|
|
|
1406
1396
|
return module[name];
|
|
1407
1397
|
}
|
|
1408
1398
|
},
|
|
1409
|
-
debug: function () {
|
|
1399
|
+
debug: function (...args) {
|
|
1410
1400
|
if (!settings.silent && settings.debug) {
|
|
1411
1401
|
if (settings.performance) {
|
|
1412
|
-
module.performance.log(
|
|
1402
|
+
module.performance.log(args);
|
|
1413
1403
|
} else {
|
|
1414
1404
|
module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
|
|
1415
|
-
module.debug.apply(console,
|
|
1405
|
+
module.debug.apply(console, args);
|
|
1416
1406
|
}
|
|
1417
1407
|
}
|
|
1418
1408
|
},
|
|
1419
|
-
verbose: function () {
|
|
1409
|
+
verbose: function (...args) {
|
|
1420
1410
|
if (!settings.silent && settings.verbose && settings.debug) {
|
|
1421
1411
|
if (settings.performance) {
|
|
1422
|
-
module.performance.log(
|
|
1412
|
+
module.performance.log(args);
|
|
1423
1413
|
} else {
|
|
1424
1414
|
module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
|
|
1425
|
-
module.verbose.apply(console,
|
|
1415
|
+
module.verbose.apply(console, args);
|
|
1426
1416
|
}
|
|
1427
1417
|
}
|
|
1428
1418
|
},
|
|
1429
|
-
error: function () {
|
|
1419
|
+
error: function (...args) {
|
|
1430
1420
|
if (!settings.silent) {
|
|
1431
1421
|
module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
|
|
1432
|
-
module.error.apply(console,
|
|
1422
|
+
module.error.apply(console, args);
|
|
1433
1423
|
}
|
|
1434
1424
|
},
|
|
1435
|
-
warn: function () {
|
|
1425
|
+
warn: function (...args) {
|
|
1436
1426
|
if (!settings.silent) {
|
|
1437
1427
|
module.warn = Function.prototype.bind.call(console.warn, console, settings.name + ':');
|
|
1438
|
-
module.warn.apply(console,
|
|
1428
|
+
module.warn.apply(console, args);
|
|
1439
1429
|
}
|
|
1440
1430
|
},
|
|
1441
1431
|
performance: {
|
|
@@ -1450,7 +1440,7 @@
|
|
|
1450
1440
|
time = currentTime;
|
|
1451
1441
|
performance.push({
|
|
1452
1442
|
Name: message[0],
|
|
1453
|
-
Arguments:
|
|
1443
|
+
Arguments: message.slice(1),
|
|
1454
1444
|
Element: element,
|
|
1455
1445
|
'Execution Time': executionTime,
|
|
1456
1446
|
});
|
|
@@ -1474,30 +1464,22 @@
|
|
|
1474
1464
|
}
|
|
1475
1465
|
if (performance.length > 0) {
|
|
1476
1466
|
console.groupCollapsed(title);
|
|
1477
|
-
|
|
1478
|
-
console.table(performance);
|
|
1479
|
-
} else {
|
|
1480
|
-
$.each(performance, function (index, data) {
|
|
1481
|
-
console.log(data.Name + ': ' + data['Execution Time'] + 'ms');
|
|
1482
|
-
});
|
|
1483
|
-
}
|
|
1467
|
+
console.table(performance);
|
|
1484
1468
|
console.groupEnd();
|
|
1485
1469
|
}
|
|
1486
1470
|
performance = [];
|
|
1487
1471
|
},
|
|
1488
1472
|
},
|
|
1489
|
-
invoke: function (query, passedArguments, context) {
|
|
1473
|
+
invoke: function (query, passedArguments = queryArguments, context = element) {
|
|
1490
1474
|
let object = instance;
|
|
1491
1475
|
let maxDepth;
|
|
1492
1476
|
let found;
|
|
1493
1477
|
let response;
|
|
1494
|
-
passedArguments = passedArguments || queryArguments;
|
|
1495
|
-
context = context || element;
|
|
1496
1478
|
if (typeof query === 'string' && object !== undefined) {
|
|
1497
1479
|
query = query.split(/[ .]/);
|
|
1498
1480
|
maxDepth = query.length - 1;
|
|
1499
1481
|
$.each(query, function (depth, value) {
|
|
1500
|
-
|
|
1482
|
+
const camelCaseValue = depth !== maxDepth
|
|
1501
1483
|
? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
|
|
1502
1484
|
: query;
|
|
1503
1485
|
if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {
|
|
@@ -1613,7 +1595,6 @@
|
|
|
1613
1595
|
range: '{name} must be in a range from {min} to {max}',
|
|
1614
1596
|
maxValue: '{name} must have a maximum value of {ruleValue}',
|
|
1615
1597
|
minValue: '{name} must have a minimum value of {ruleValue}',
|
|
1616
|
-
empty: '{name} must have a value',
|
|
1617
1598
|
notEmpty: '{name} must have a value',
|
|
1618
1599
|
checked: '{name} must be checked',
|
|
1619
1600
|
email: '{name} must be a valid e-mail',
|
|
@@ -1646,7 +1627,7 @@
|
|
|
1646
1627
|
selector: {
|
|
1647
1628
|
checkbox: 'input[type="checkbox"], input[type="radio"]',
|
|
1648
1629
|
clear: '.clear',
|
|
1649
|
-
field: 'input:not(.search
|
|
1630
|
+
field: 'input:not(.search, [type="reset"], [type="button"], [type="submit"]), textarea, select',
|
|
1650
1631
|
file: 'input[type="file"]',
|
|
1651
1632
|
group: '.field',
|
|
1652
1633
|
input: 'input',
|
|
@@ -1767,7 +1748,7 @@
|
|
|
1767
1748
|
if (regExp instanceof RegExp) {
|
|
1768
1749
|
return value.match(regExp);
|
|
1769
1750
|
}
|
|
1770
|
-
|
|
1751
|
+
const regExpParts = regExp.match($.fn.form.settings.regExp.flags);
|
|
1771
1752
|
let flags;
|
|
1772
1753
|
// regular expression specified as /baz/gi (flags)
|
|
1773
1754
|
if (regExpParts) {
|
|
@@ -1801,10 +1782,10 @@
|
|
|
1801
1782
|
let min;
|
|
1802
1783
|
let max;
|
|
1803
1784
|
let parts;
|
|
1804
|
-
if (!range || ['', '..'].
|
|
1785
|
+
if (!range || ['', '..'].includes(range)) {
|
|
1805
1786
|
|
|
1806
1787
|
// do nothing
|
|
1807
|
-
} else if (range.
|
|
1788
|
+
} else if (!range.includes('..')) {
|
|
1808
1789
|
if (regExp.test(range)) {
|
|
1809
1790
|
min = range - 0;
|
|
1810
1791
|
max = min;
|
|
@@ -1926,7 +1907,7 @@
|
|
|
1926
1907
|
|
|
1927
1908
|
// matches another field
|
|
1928
1909
|
match: function (value, identifier, module) {
|
|
1929
|
-
|
|
1910
|
+
const matchingValue = module.get.value(identifier, true);
|
|
1930
1911
|
|
|
1931
1912
|
return matchingValue !== undefined
|
|
1932
1913
|
? value.toString() === matchingValue.toString()
|
|
@@ -1935,7 +1916,7 @@
|
|
|
1935
1916
|
|
|
1936
1917
|
// different from another field
|
|
1937
1918
|
different: function (value, identifier, module) {
|
|
1938
|
-
|
|
1919
|
+
const matchingValue = module.get.value(identifier, true);
|
|
1939
1920
|
|
|
1940
1921
|
return matchingValue !== undefined
|
|
1941
1922
|
? value.toString() !== matchingValue.toString()
|
|
@@ -1943,7 +1924,7 @@
|
|
|
1943
1924
|
},
|
|
1944
1925
|
|
|
1945
1926
|
creditCard: function (cardNumber, cardTypes) {
|
|
1946
|
-
|
|
1927
|
+
const cards = {
|
|
1947
1928
|
visa: {
|
|
1948
1929
|
pattern: /^4/,
|
|
1949
1930
|
length: [16],
|
|
@@ -1987,10 +1968,9 @@
|
|
|
1987
1968
|
};
|
|
1988
1969
|
let valid = {};
|
|
1989
1970
|
let validCard = false;
|
|
1990
|
-
|
|
1971
|
+
const requiredTypes = typeof cardTypes === 'string'
|
|
1991
1972
|
? cardTypes.split(',')
|
|
1992
1973
|
: false;
|
|
1993
|
-
let unionPay;
|
|
1994
1974
|
let validation;
|
|
1995
1975
|
|
|
1996
1976
|
if (typeof cardNumber !== 'string' || cardNumber.length === 0) {
|
|
@@ -2007,7 +1987,7 @@
|
|
|
2007
1987
|
validation = cards[type];
|
|
2008
1988
|
if (validation) {
|
|
2009
1989
|
valid = {
|
|
2010
|
-
length:
|
|
1990
|
+
length: validation.length.includes(cardNumber.length),
|
|
2011
1991
|
pattern: cardNumber.search(validation.pattern) !== -1,
|
|
2012
1992
|
};
|
|
2013
1993
|
if (valid.length > 0 && valid.pattern) {
|
|
@@ -2022,8 +2002,8 @@
|
|
|
2022
2002
|
}
|
|
2023
2003
|
|
|
2024
2004
|
// skip luhn for UnionPay
|
|
2025
|
-
unionPay = {
|
|
2026
|
-
number:
|
|
2005
|
+
const unionPay = {
|
|
2006
|
+
number: cards.unionPay.length.includes(cardNumber.length),
|
|
2027
2007
|
pattern: cardNumber.search(cards.unionPay.pattern) !== -1,
|
|
2028
2008
|
};
|
|
2029
2009
|
if (unionPay.number && unionPay.pattern) {
|
|
@@ -2033,13 +2013,13 @@
|
|
|
2033
2013
|
// verify luhn, adapted from <https://gist.github.com/2134376>
|
|
2034
2014
|
let length = cardNumber.length;
|
|
2035
2015
|
let multiple = 0;
|
|
2036
|
-
|
|
2016
|
+
const producedValue = [
|
|
2037
2017
|
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
2038
2018
|
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9],
|
|
2039
2019
|
];
|
|
2040
2020
|
let sum = 0;
|
|
2041
2021
|
while (length--) {
|
|
2042
|
-
sum += producedValue[multiple][parseInt(cardNumber.charAt(length), 10)];
|
|
2022
|
+
sum += producedValue[multiple][Number.parseInt(cardNumber.charAt(length), 10)];
|
|
2043
2023
|
multiple ^= 1; // eslint-disable-line no-bitwise
|
|
2044
2024
|
}
|
|
2045
2025
|
|