fomantic-ui 2.10.0-beta.1 → 2.10.0-beta.10
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/.all-contributorsrc +9 -0
- package/.eslintrc.js +0 -10
- package/CONTRIBUTING.md +4 -1
- package/CONTRIBUTORS.md +1 -0
- package/FAQ.md +7 -2
- package/README.md +5 -9
- package/ROADMAP.md +4 -4
- package/SECURITY.md +8 -7
- package/changelog-setup.js +64 -70
- package/dist/components/accordion.css +1 -1
- package/dist/components/accordion.js +103 -142
- package/dist/components/accordion.min.css +1 -1
- package/dist/components/accordion.min.js +2 -2
- package/dist/components/ad.css +1 -1
- package/dist/components/ad.min.css +1 -1
- package/dist/components/api.js +157 -210
- package/dist/components/api.min.js +2 -2
- package/dist/components/breadcrumb.css +1 -1
- package/dist/components/breadcrumb.min.css +1 -1
- package/dist/components/button.css +1 -2
- package/dist/components/button.min.css +2 -2
- package/dist/components/calendar.css +1 -2
- package/dist/components/calendar.js +314 -352
- package/dist/components/calendar.min.css +2 -2
- package/dist/components/calendar.min.js +2 -2
- package/dist/components/card.css +1 -1
- package/dist/components/card.min.css +1 -1
- package/dist/components/checkbox.css +1 -2
- package/dist/components/checkbox.js +85 -135
- package/dist/components/checkbox.min.css +2 -2
- package/dist/components/checkbox.min.js +2 -2
- package/dist/components/comment.css +1 -1
- package/dist/components/comment.min.css +1 -1
- package/dist/components/container.css +2 -4
- package/dist/components/container.min.css +2 -2
- package/dist/components/dimmer.css +1 -11
- package/dist/components/dimmer.js +61 -94
- package/dist/components/dimmer.min.css +2 -2
- package/dist/components/dimmer.min.js +2 -2
- package/dist/components/divider.css +1 -2
- package/dist/components/divider.min.css +2 -2
- package/dist/components/dropdown.css +30 -51
- package/dist/components/dropdown.js +736 -1055
- package/dist/components/dropdown.min.css +2 -2
- package/dist/components/dropdown.min.js +2 -2
- package/dist/components/embed.css +1 -1
- package/dist/components/embed.js +85 -114
- package/dist/components/embed.min.css +1 -1
- package/dist/components/embed.min.js +2 -2
- 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 +2 -3
- package/dist/components/flyout.js +226 -355
- package/dist/components/flyout.min.css +2 -2
- package/dist/components/flyout.min.js +2 -2
- package/dist/components/form.css +5 -95
- package/dist/components/form.js +335 -444
- package/dist/components/form.min.css +2 -2
- package/dist/components/form.min.js +2 -2
- package/dist/components/grid.css +2 -58
- package/dist/components/grid.min.css +2 -2
- package/dist/components/header.css +1 -1
- package/dist/components/header.min.css +1 -1
- package/dist/components/icon.css +4 -4
- 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 +1 -536
- 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 +1 -1
- package/dist/components/label.min.css +1 -1
- package/dist/components/list.css +1 -3
- package/dist/components/list.min.css +2 -2
- package/dist/components/loader.css +1 -1
- package/dist/components/loader.min.css +1 -1
- package/dist/components/menu.css +1 -9
- package/dist/components/menu.min.css +2 -2
- package/dist/components/message.css +1 -1
- package/dist/components/message.min.css +1 -1
- package/dist/components/modal.css +5 -9
- package/dist/components/modal.js +261 -384
- package/dist/components/modal.min.css +2 -2
- package/dist/components/modal.min.js +2 -2
- package/dist/components/nag.css +1 -1
- package/dist/components/nag.js +68 -98
- package/dist/components/nag.min.css +1 -1
- package/dist/components/nag.min.js +2 -2
- package/dist/components/placeholder.css +1 -1
- package/dist/components/placeholder.min.css +1 -1
- package/dist/components/popup.css +1 -2
- package/dist/components/popup.js +198 -271
- package/dist/components/popup.min.css +2 -2
- package/dist/components/popup.min.js +2 -2
- package/dist/components/progress.css +1 -1
- package/dist/components/progress.js +109 -144
- package/dist/components/progress.min.css +1 -1
- package/dist/components/progress.min.js +2 -2
- 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 +91 -123
- package/dist/components/rating.min.css +1 -1
- package/dist/components/rating.min.js +2 -2
- package/dist/components/reset.css +1 -1
- package/dist/components/reset.min.css +1 -1
- package/dist/components/reveal.css +1 -1
- package/dist/components/reveal.min.css +1 -1
- package/dist/components/search.css +2 -9
- package/dist/components/search.js +277 -379
- package/dist/components/search.min.css +2 -2
- package/dist/components/search.min.js +2 -2
- package/dist/components/segment.css +2 -7
- package/dist/components/segment.min.css +2 -2
- package/dist/components/shape.css +1 -2
- package/dist/components/shape.js +158 -224
- package/dist/components/shape.min.css +2 -2
- package/dist/components/shape.min.js +2 -2
- package/dist/components/sidebar.css +2 -3
- package/dist/components/sidebar.js +124 -206
- package/dist/components/sidebar.min.css +2 -2
- package/dist/components/sidebar.min.js +2 -2
- package/dist/components/site.css +9 -25
- package/dist/components/site.js +38 -57
- package/dist/components/site.min.css +2 -2
- package/dist/components/site.min.js +2 -2
- package/dist/components/slider.css +1 -1
- package/dist/components/slider.js +246 -329
- package/dist/components/slider.min.css +1 -1
- package/dist/components/slider.min.js +2 -2
- package/dist/components/state.js +70 -100
- package/dist/components/state.min.js +2 -2
- package/dist/components/statistic.css +1 -1
- package/dist/components/statistic.min.css +1 -1
- package/dist/components/step.css +1 -1
- package/dist/components/step.min.css +1 -1
- package/dist/components/sticky.css +1 -1
- package/dist/components/sticky.js +135 -180
- package/dist/components/sticky.min.css +1 -1
- package/dist/components/sticky.min.js +2 -2
- package/dist/components/tab.css +1 -1
- package/dist/components/tab.js +176 -244
- package/dist/components/tab.min.css +1 -1
- package/dist/components/tab.min.js +2 -2
- package/dist/components/table.css +3 -37
- 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 -3
- package/dist/components/toast.js +109 -147
- package/dist/components/toast.min.css +1 -1
- package/dist/components/toast.min.js +2 -2
- package/dist/components/transition.css +1 -1
- package/dist/components/transition.js +91 -146
- package/dist/components/transition.min.css +1 -1
- package/dist/components/transition.min.js +2 -2
- package/dist/components/visibility.js +146 -224
- package/dist/components/visibility.min.js +2 -2
- package/dist/semantic.css +3906 -8720
- package/dist/semantic.js +4397 -6155
- package/dist/semantic.min.css +2 -2
- package/dist/semantic.min.js +2 -2
- package/examples/assets/show-examples.js +2 -4
- package/gulpfile.js +5 -7
- package/package.json +3 -5
- package/scripts/nightly-version.js +7 -10
- package/src/README.md +3 -3
- package/src/definitions/behaviors/api.js +156 -209
- package/src/definitions/behaviors/form.js +334 -443
- package/src/definitions/behaviors/state.js +69 -99
- package/src/definitions/behaviors/visibility.js +145 -223
- package/src/definitions/collections/form.less +1 -13
- package/src/definitions/collections/grid.less +1 -61
- package/src/definitions/collections/menu.less +0 -11
- package/src/definitions/collections/table.less +1 -35
- package/src/definitions/elements/input.less +1 -61
- package/src/definitions/elements/segment.less +0 -6
- package/src/definitions/globals/site.js +37 -56
- package/src/definitions/globals/site.less +2 -18
- package/src/definitions/modules/accordion.js +102 -141
- package/src/definitions/modules/calendar.js +313 -351
- package/src/definitions/modules/checkbox.js +84 -134
- package/src/definitions/modules/dimmer.js +60 -93
- package/src/definitions/modules/dimmer.less +0 -9
- package/src/definitions/modules/dropdown.js +735 -1054
- package/src/definitions/modules/dropdown.less +31 -47
- package/src/definitions/modules/embed.js +84 -113
- package/src/definitions/modules/flyout.js +225 -354
- package/src/definitions/modules/modal.js +260 -383
- package/src/definitions/modules/modal.less +1 -1
- package/src/definitions/modules/nag.js +67 -97
- package/src/definitions/modules/popup.js +197 -270
- package/src/definitions/modules/progress.js +108 -143
- package/src/definitions/modules/rating.js +90 -122
- package/src/definitions/modules/search.js +276 -378
- package/src/definitions/modules/search.less +0 -3
- package/src/definitions/modules/shape.js +157 -223
- package/src/definitions/modules/sidebar.js +123 -205
- package/src/definitions/modules/slider.js +245 -328
- package/src/definitions/modules/slider.less +1 -1
- package/src/definitions/modules/sticky.js +134 -179
- package/src/definitions/modules/tab.js +175 -243
- package/src/definitions/modules/toast.js +108 -146
- package/src/definitions/modules/toast.less +1 -1
- package/src/definitions/modules/transition.js +90 -145
- package/src/theme.less +0 -13
- package/src/themes/basic/elements/icon.variables +1 -1
- package/src/themes/default/collections/grid.variables +0 -30
- package/src/themes/default/collections/table.variables +1 -5
- package/src/themes/default/elements/icon.variables +3 -3
- package/src/themes/default/globals/site.variables +8 -15
- package/src/themes/default/globals/variation.variables +1 -2
- package/src/themes/default/modules/dropdown.variables +1 -0
- package/src/themes/default/modules/slider.variables +1 -1
- package/src/themes/github/elements/icon.variables +1 -1
- package/src/themes/material/elements/icon.variables +1 -1
- package/tasks/README.md +1 -1
- package/tasks/admin/components/create.js +89 -122
- package/tasks/admin/components/init.js +34 -65
- package/tasks/admin/components/update.js +50 -61
- package/tasks/admin/distributions/create.js +71 -111
- package/tasks/admin/distributions/init.js +32 -63
- package/tasks/admin/distributions/update.js +49 -57
- package/tasks/admin/publish.js +1 -1
- package/tasks/admin/register.js +14 -19
- package/tasks/admin/release.js +2 -2
- package/tasks/build/assets.js +14 -18
- package/tasks/build/css.js +59 -68
- package/tasks/build/javascript.js +48 -56
- package/tasks/build.js +4 -6
- package/tasks/check-install.js +5 -8
- package/tasks/clean.js +5 -7
- package/tasks/collections/admin.js +14 -16
- package/tasks/collections/build.js +6 -8
- package/tasks/collections/docs.js +4 -6
- package/tasks/collections/install.js +2 -4
- package/tasks/collections/rtl.js +2 -4
- package/tasks/collections/various.js +2 -4
- package/tasks/config/admin/github.js +9 -19
- package/tasks/config/admin/templates/README.md +2 -2
- package/tasks/config/admin/templates/bower.json +2 -4
- package/tasks/config/admin/templates/composer.json +1 -1
- package/tasks/config/admin/templates/css-package.js +1 -4
- package/tasks/config/admin/templates/less-package.js +1 -3
- package/tasks/config/defaults.js +0 -1
- package/tasks/config/npm/gulpfile.js +4 -6
- package/tasks/config/project/config.js +27 -35
- package/tasks/config/project/install.js +64 -82
- package/tasks/config/project/release.js +7 -9
- package/tasks/config/tasks.js +10 -21
- package/tasks/config/user.js +14 -20
- package/tasks/docs/build.js +26 -31
- package/tasks/docs/metadata.js +30 -39
- package/tasks/docs/serve.js +23 -27
- package/tasks/install.js +94 -128
- package/tasks/rtl/build.js +2 -4
- package/tasks/rtl/watch.js +3 -5
- package/tasks/watch.js +13 -13
- package/test/meteor/fonts.js +1 -2
- package/test/modules/module.spec.js +16 -18
- package/types/fomantic-ui-calendar.d.ts +1 -1
- package/types/fomantic-ui-dropdown.d.ts +45 -1
- package/types/fomantic-ui-embed.d.ts +1 -1
- package/types/fomantic-ui-flyout.d.ts +1 -1
- package/types/fomantic-ui-form.d.ts +0 -7
- package/types/fomantic-ui-modal.d.ts +1 -1
- package/types/fomantic-ui-search.d.ts +12 -6
- package/types/fomantic-ui-toast.d.ts +1 -1
- package/src/themes/basic/assets/fonts/icons.woff +0 -0
- package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
- package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
- package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
- package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
- package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
- package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
- package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
- package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
- package/src/themes/default/assets/fonts/brand-icons.woff +0 -0
- package/src/themes/default/assets/fonts/icons.woff +0 -0
- package/src/themes/default/assets/fonts/outline-icons.woff +0 -0
- package/src/themes/github/assets/fonts/octicons.woff +0 -0
- package/src/themes/material/assets/fonts/icons.woff +0 -0
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.10+3ca268e - Form Validation
|
3
3
|
* https://github.com/fomantic/Fomantic-UI/
|
4
4
|
*
|
5
5
|
*
|
@@ -20,58 +20,54 @@
|
|
20
20
|
: globalThis;
|
21
21
|
|
22
22
|
$.fn.form = function (parameters) {
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
returnedValue
|
34
|
-
;
|
23
|
+
let $allModules = $(this);
|
24
|
+
let $window = $(window);
|
25
|
+
|
26
|
+
let time = Date.now();
|
27
|
+
let performance = [];
|
28
|
+
|
29
|
+
let query = arguments[0];
|
30
|
+
let methodInvoked = typeof query === 'string';
|
31
|
+
let queryArguments = [].slice.call(arguments, 1);
|
32
|
+
let returnedValue;
|
35
33
|
$allModules.each(function () {
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
module
|
74
|
-
;
|
34
|
+
let $module = $(this);
|
35
|
+
let element = this;
|
36
|
+
|
37
|
+
let formErrors = [];
|
38
|
+
let formErrorsTracker = {};
|
39
|
+
let keyHeldDown = false;
|
40
|
+
|
41
|
+
// set at run-time
|
42
|
+
let $field;
|
43
|
+
let $group;
|
44
|
+
let $message;
|
45
|
+
let $prompt;
|
46
|
+
let $submit;
|
47
|
+
let $clear;
|
48
|
+
let $reset;
|
49
|
+
|
50
|
+
let settings;
|
51
|
+
let validation;
|
52
|
+
|
53
|
+
let metadata;
|
54
|
+
let selector;
|
55
|
+
let className;
|
56
|
+
let regExp;
|
57
|
+
let error;
|
58
|
+
|
59
|
+
let namespace;
|
60
|
+
let moduleNamespace;
|
61
|
+
let eventNamespace;
|
62
|
+
let attachEventsSelector;
|
63
|
+
let attachEventsAction;
|
64
|
+
|
65
|
+
let submitting = false;
|
66
|
+
let dirty = false;
|
67
|
+
let history = ['clean', 'clean'];
|
68
|
+
|
69
|
+
let instance;
|
70
|
+
let module;
|
75
71
|
|
76
72
|
module = {
|
77
73
|
|
@@ -103,16 +99,14 @@
|
|
103
99
|
module.verbose('Storing instance of module', module);
|
104
100
|
instance = module;
|
105
101
|
$module
|
106
|
-
.data(moduleNamespace, module)
|
107
|
-
;
|
102
|
+
.data(moduleNamespace, module);
|
108
103
|
},
|
109
104
|
|
110
105
|
destroy: function () {
|
111
106
|
module.verbose('Destroying previous module', instance);
|
112
107
|
module.removeEvents();
|
113
108
|
$module
|
114
|
-
.removeData(moduleNamespace)
|
115
|
-
;
|
109
|
+
.removeData(moduleNamespace);
|
116
110
|
},
|
117
111
|
|
118
112
|
refresh: function () {
|
@@ -162,18 +156,15 @@
|
|
162
156
|
.on('blur' + eventNamespace, selector.field, module.event.field.blur)
|
163
157
|
.on('click' + eventNamespace, selector.submit, module.submit)
|
164
158
|
.on('click' + eventNamespace, selector.reset, module.reset)
|
165
|
-
.on('click' + eventNamespace, selector.clear, module.clear)
|
166
|
-
;
|
159
|
+
.on('click' + eventNamespace, selector.clear, module.clear);
|
167
160
|
$field.on('invalid' + eventNamespace, module.event.field.invalid);
|
168
161
|
if (settings.keyboardShortcuts) {
|
169
162
|
$module.on('keydown' + eventNamespace, selector.field, module.event.field.keydown);
|
170
163
|
}
|
171
164
|
$field.each(function (index, el) {
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
inputEvent = module.get.changeEvent(type, $input)
|
176
|
-
;
|
165
|
+
let $input = $(el);
|
166
|
+
let type = $input.prop('type');
|
167
|
+
let inputEvent = module.get.changeEvent(type, $input);
|
177
168
|
$input.on(inputEvent + eventNamespace, module.event.field.change);
|
178
169
|
});
|
179
170
|
|
@@ -204,18 +195,16 @@
|
|
204
195
|
|
205
196
|
clear: function () {
|
206
197
|
$field.each(function (index, el) {
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
isErrored = $fieldGroup.hasClass(className.error)
|
218
|
-
;
|
198
|
+
let $field = $(el);
|
199
|
+
let $element = $field.parent();
|
200
|
+
let $fieldGroup = $field.closest($group);
|
201
|
+
let $prompt = $fieldGroup.find(selector.prompt);
|
202
|
+
let $calendar = $field.closest(selector.uiCalendar);
|
203
|
+
let defaultValue = $field.data(metadata.defaultValue) || '';
|
204
|
+
let isCheckbox = $field.is(selector.checkbox);
|
205
|
+
let isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown');
|
206
|
+
let isCalendar = $calendar.length > 0 && module.can.useElement('calendar');
|
207
|
+
let isErrored = $fieldGroup.hasClass(className.error);
|
219
208
|
if (isErrored) {
|
220
209
|
module.verbose('Resetting error on field', $fieldGroup);
|
221
210
|
$fieldGroup.removeClass(className.error);
|
@@ -238,19 +227,17 @@
|
|
238
227
|
|
239
228
|
reset: function () {
|
240
229
|
$field.each(function (index, el) {
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
isErrored = $fieldGroup.hasClass(className.error)
|
253
|
-
;
|
230
|
+
let $field = $(el);
|
231
|
+
let $element = $field.parent();
|
232
|
+
let $fieldGroup = $field.closest($group);
|
233
|
+
let $calendar = $field.closest(selector.uiCalendar);
|
234
|
+
let $prompt = $fieldGroup.find(selector.prompt);
|
235
|
+
let defaultValue = $field.data(metadata.defaultValue);
|
236
|
+
let isCheckbox = $field.is(selector.checkbox);
|
237
|
+
let isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown');
|
238
|
+
let isCalendar = $calendar.length > 0 && module.can.useElement('calendar');
|
239
|
+
let isFile = $field.is(selector.file);
|
240
|
+
let isErrored = $fieldGroup.hasClass(className.error);
|
254
241
|
if (defaultValue === undefined) {
|
255
242
|
return;
|
256
243
|
}
|
@@ -277,14 +264,11 @@
|
|
277
264
|
|
278
265
|
determine: {
|
279
266
|
isValid: function () {
|
280
|
-
|
281
|
-
allValid = true
|
282
|
-
;
|
267
|
+
let allValid = true;
|
283
268
|
$field.each(function (index, el) {
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
;
|
269
|
+
let $el = $(el);
|
270
|
+
let validation = module.get.validation($el) || {};
|
271
|
+
let identifier = module.get.identifier(validation, $el);
|
288
272
|
if (!module.validate.field(validation, identifier, true)) {
|
289
273
|
allValid = false;
|
290
274
|
}
|
@@ -293,14 +277,12 @@
|
|
293
277
|
return allValid;
|
294
278
|
},
|
295
279
|
isDirty: function (e) {
|
296
|
-
|
280
|
+
let formIsDirty = false;
|
297
281
|
|
298
282
|
$field.each(function (index, el) {
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
isDirty
|
303
|
-
;
|
283
|
+
let $el = $(el);
|
284
|
+
let isCheckbox = $el.filter(selector.checkbox).length > 0;
|
285
|
+
let isDirty;
|
304
286
|
|
305
287
|
isDirty = isCheckbox
|
306
288
|
? module.is.checkboxDirty($el)
|
@@ -341,9 +323,7 @@
|
|
341
323
|
return String($field.val()).trim() === '';
|
342
324
|
},
|
343
325
|
valid: function (field, showErrors) {
|
344
|
-
|
345
|
-
allValid = true
|
346
|
-
;
|
326
|
+
let allValid = true;
|
347
327
|
if (field) {
|
348
328
|
module.verbose('Checking if field is valid', field);
|
349
329
|
|
@@ -366,25 +346,25 @@
|
|
366
346
|
return !dirty;
|
367
347
|
},
|
368
348
|
fieldDirty: function ($el) {
|
369
|
-
|
349
|
+
let initialValue = $el.data(metadata.defaultValue);
|
370
350
|
// Explicitly check for undefined/null here as value may be `false`, so ($el.data(dataInitialValue) || '') would not work
|
371
351
|
if (initialValue === undefined || initialValue === null) {
|
372
352
|
initialValue = '';
|
373
353
|
} else if (Array.isArray(initialValue)) {
|
374
354
|
initialValue = initialValue.toString();
|
375
355
|
}
|
376
|
-
|
356
|
+
let currentValue = $el.val();
|
377
357
|
if (currentValue === undefined || currentValue === null) {
|
378
358
|
currentValue = '';
|
379
359
|
} else if (Array.isArray(currentValue)) {
|
380
|
-
// multiple select values are returned as arrays which are never equal, so do string conversion first
|
360
|
+
// multiple select values are returned as arrays which are never equal, so do the string conversion first
|
381
361
|
currentValue = currentValue.toString();
|
382
362
|
}
|
383
|
-
// Boolean values can be encoded as "true/false" or "True/False" depending on underlying frameworks so we need a case
|
384
|
-
|
385
|
-
|
363
|
+
// Boolean values can be encoded as "true/false" or "True/False" depending on underlying frameworks, so we need a case-insensitive comparison
|
364
|
+
let boolRegex = /^(true|false)$/i;
|
365
|
+
let isBoolValue = boolRegex.test(initialValue) && boolRegex.test(currentValue);
|
386
366
|
if (isBoolValue) {
|
387
|
-
|
367
|
+
let regex = new RegExp('^' + initialValue + '$', 'i');
|
388
368
|
|
389
369
|
return !regex.test(currentValue);
|
390
370
|
}
|
@@ -392,8 +372,8 @@
|
|
392
372
|
return currentValue !== initialValue;
|
393
373
|
},
|
394
374
|
checkboxDirty: function ($el) {
|
395
|
-
|
396
|
-
|
375
|
+
let initialValue = $el.data(metadata.defaultValue);
|
376
|
+
let currentValue = $el.is(':checked');
|
397
377
|
|
398
378
|
return initialValue !== currentValue;
|
399
379
|
},
|
@@ -421,22 +401,19 @@
|
|
421
401
|
event: {
|
422
402
|
field: {
|
423
403
|
keydown: function (event) {
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
}
|
434
|
-
;
|
404
|
+
let $field = $(this);
|
405
|
+
let key = event.which;
|
406
|
+
let isInput = $field.is(selector.input);
|
407
|
+
let isCheckbox = $field.is(selector.checkbox);
|
408
|
+
let isInDropdown = $field.closest(selector.uiDropdown).length > 0;
|
409
|
+
let keyCode = {
|
410
|
+
enter: 13,
|
411
|
+
escape: 27,
|
412
|
+
};
|
435
413
|
if (key === keyCode.escape) {
|
436
414
|
module.verbose('Escape key pressed blurring field');
|
437
415
|
$field[0]
|
438
|
-
.blur()
|
439
|
-
;
|
416
|
+
.blur();
|
440
417
|
}
|
441
418
|
if (!event.ctrlKey && key === keyCode.enter && isInput && !isInDropdown && !isCheckbox) {
|
442
419
|
if (!keyHeldDown) {
|
@@ -454,11 +431,9 @@
|
|
454
431
|
event.preventDefault();
|
455
432
|
},
|
456
433
|
blur: function (event) {
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
identifier = module.get.identifier(validationRules, $field)
|
461
|
-
;
|
434
|
+
let $field = $(this);
|
435
|
+
let validationRules = module.get.validation($field) || {};
|
436
|
+
let identifier = module.get.identifier(validationRules, $field);
|
462
437
|
if (settings.on === 'blur' || (!$module.hasClass(className.initial) && settings.revalidate)) {
|
463
438
|
module.debug('Revalidating field', $field, validationRules);
|
464
439
|
module.validate.field(validationRules, identifier);
|
@@ -468,11 +443,9 @@
|
|
468
443
|
}
|
469
444
|
},
|
470
445
|
change: function (event) {
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
identifier = module.get.identifier(validationRules, $field)
|
475
|
-
;
|
446
|
+
let $field = $(this);
|
447
|
+
let validationRules = module.get.validation($field) || {};
|
448
|
+
let identifier = module.get.identifier(validationRules, $field);
|
476
449
|
if (settings.on === 'change' || (!$module.hasClass(className.initial) && settings.revalidate)) {
|
477
450
|
clearTimeout(module.timer);
|
478
451
|
module.timer = setTimeout(function () {
|
@@ -494,7 +467,7 @@
|
|
494
467
|
event.returnValue = settings.text.leavingMessage;
|
495
468
|
}
|
496
469
|
|
497
|
-
// For
|
470
|
+
// For older...
|
498
471
|
return settings.text.leavingMessage;
|
499
472
|
}
|
500
473
|
},
|
@@ -522,9 +495,7 @@
|
|
522
495
|
return ['file', 'checkbox', 'radio', 'hidden'].indexOf(type) >= 0 || $input.is('select') ? 'change' : 'input';
|
523
496
|
},
|
524
497
|
fieldsFromShorthand: function (fields) {
|
525
|
-
|
526
|
-
fullFields = {}
|
527
|
-
;
|
498
|
+
let fullFields = {};
|
528
499
|
$.each(fields, function (name, rules) {
|
529
500
|
if (!Array.isArray(rules) && typeof rules === 'object') {
|
530
501
|
fullFields[name] = rules;
|
@@ -541,7 +512,7 @@
|
|
541
512
|
}
|
542
513
|
|
543
514
|
$.each(fullFields[name].rules, function (index, rule) {
|
544
|
-
|
515
|
+
let ruleName = module.get.ruleName(rule);
|
545
516
|
if (ruleName === 'empty') {
|
546
517
|
module.warn('*** DEPRECATED *** : Rule "empty" for field "' + name + '" will be removed in a future version. -> Use "notEmpty" rule instead.');
|
547
518
|
}
|
@@ -554,20 +525,18 @@
|
|
554
525
|
return validation.identifier || $el.attr('id') || $el.attr('name') || $el.data(metadata.validate);
|
555
526
|
},
|
556
527
|
prompt: function (rule, field) {
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
suffixPrompt
|
570
|
-
;
|
528
|
+
let ruleName = module.get.ruleName(rule);
|
529
|
+
let ancillary = module.get.ancillaryValue(rule);
|
530
|
+
let $field = module.get.field(field.identifier);
|
531
|
+
let value = $field.val();
|
532
|
+
let promptCheck = rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule;
|
533
|
+
let prompt = String(isFunction(promptCheck)
|
534
|
+
? promptCheck.call($field[0], value)
|
535
|
+
: promptCheck);
|
536
|
+
let requiresValue = prompt.search('{value}') !== -1;
|
537
|
+
let requiresName = prompt.search('{name}') !== -1;
|
538
|
+
let parts;
|
539
|
+
let suffixPrompt;
|
571
540
|
if (ancillary && ['integer', 'decimal', 'number', 'size'].indexOf(ruleName) >= 0 && ancillary.indexOf('..') >= 0) {
|
572
541
|
parts = ancillary.split('..', 2);
|
573
542
|
if (!rule.prompt && ruleName !== 'size') {
|
@@ -630,21 +599,20 @@
|
|
630
599
|
},
|
631
600
|
field: function (identifier, strict, ignoreMissing) {
|
632
601
|
module.verbose('Finding field with identifier', identifier);
|
633
|
-
|
634
|
-
|
635
|
-
t = $field.filter('#' + identifier);
|
602
|
+
let t;
|
603
|
+
t = $field.filter('#' + CSS.escape(identifier));
|
636
604
|
if (t.length > 0) {
|
637
605
|
return t;
|
638
606
|
}
|
639
|
-
t = $field.filter('[name="' + identifier + '"]');
|
607
|
+
t = $field.filter('[name="' + CSS.escape(identifier) + '"]');
|
640
608
|
if (t.length > 0) {
|
641
609
|
return t;
|
642
610
|
}
|
643
|
-
t = $field.filter('[name="' + identifier + '[]"]');
|
611
|
+
t = $field.filter('[name="' + CSS.escape(identifier) + '[]"]');
|
644
612
|
if (t.length > 0) {
|
645
613
|
return t;
|
646
614
|
}
|
647
|
-
t = $field.filter('[data-' + metadata.validate + '="' + identifier + '"]');
|
615
|
+
t = $field.filter('[data-' + metadata.validate + '="' + CSS.escape(identifier) + '"]');
|
648
616
|
if (t.length > 0) {
|
649
617
|
return t;
|
650
618
|
}
|
@@ -655,9 +623,7 @@
|
|
655
623
|
return strict ? $() : $('<input/>');
|
656
624
|
},
|
657
625
|
fields: function (fields, strict) {
|
658
|
-
|
659
|
-
$fields = $()
|
660
|
-
;
|
626
|
+
let $fields = $();
|
661
627
|
$.each(fields, function (index, name) {
|
662
628
|
$fields = $fields.add(module.get.field(name, strict));
|
663
629
|
});
|
@@ -665,21 +631,18 @@
|
|
665
631
|
return $fields;
|
666
632
|
},
|
667
633
|
fieldLabel: function (identifier, useIdAsFallback) {
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
;
|
634
|
+
let $field = typeof identifier === 'string'
|
635
|
+
? module.get.field(identifier)
|
636
|
+
: identifier;
|
637
|
+
let $label = $field.closest(selector.group).find('label:not(:empty)').eq(0);
|
673
638
|
|
674
639
|
return $label.length === 1
|
675
640
|
? $label.text()
|
676
641
|
: $field.prop('placeholder') || (useIdAsFallback ? identifier : settings.text.unspecifiedField);
|
677
642
|
},
|
678
643
|
validation: function ($field) {
|
679
|
-
|
680
|
-
|
681
|
-
identifier
|
682
|
-
;
|
644
|
+
let fieldValidation;
|
645
|
+
let identifier;
|
683
646
|
if (!validation) {
|
684
647
|
return false;
|
685
648
|
}
|
@@ -698,11 +661,9 @@
|
|
698
661
|
return fieldValidation || false;
|
699
662
|
},
|
700
663
|
value: function (field, strict) {
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
resultKeys
|
705
|
-
;
|
664
|
+
let fields = [];
|
665
|
+
let results;
|
666
|
+
let resultKeys;
|
706
667
|
fields.push(field);
|
707
668
|
results = module.get.values.call(element, fields, strict);
|
708
669
|
resultKeys = Object.keys(results);
|
@@ -710,26 +671,22 @@
|
|
710
671
|
return resultKeys.length > 0 ? results[resultKeys[0]] : undefined;
|
711
672
|
},
|
712
673
|
values: function (fields, strict) {
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
values = {}
|
718
|
-
;
|
674
|
+
let $fields = Array.isArray(fields) && fields.length > 0
|
675
|
+
? module.get.fields(fields, strict)
|
676
|
+
: $field;
|
677
|
+
let values = {};
|
719
678
|
$fields.each(function (index, field) {
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
: false
|
732
|
-
;
|
679
|
+
let $field = $(field);
|
680
|
+
let $calendar = $field.closest(selector.uiCalendar);
|
681
|
+
let name = $field.prop('name') || $field.prop('id');
|
682
|
+
let value = $field.val();
|
683
|
+
let isCheckbox = $field.is(selector.checkbox);
|
684
|
+
let isRadio = $field.is(selector.radio);
|
685
|
+
let isMultiple = name.indexOf('[]') !== -1;
|
686
|
+
let isCalendar = $calendar.length > 0 && module.can.useElement('calendar');
|
687
|
+
let isChecked = isCheckbox
|
688
|
+
? $field.is(':checked')
|
689
|
+
: false;
|
733
690
|
if (name) {
|
734
691
|
if (isMultiple) {
|
735
692
|
name = name.replace('[]', '');
|
@@ -755,7 +712,7 @@
|
|
755
712
|
} else if (isCheckbox) {
|
756
713
|
values[name] = isChecked ? value || true : false;
|
757
714
|
} else if (isCalendar) {
|
758
|
-
|
715
|
+
let date = $calendar.calendar('get date');
|
759
716
|
|
760
717
|
if (date !== null) {
|
761
718
|
switch (settings.dateHandling) {
|
@@ -770,7 +727,7 @@
|
|
770
727
|
break;
|
771
728
|
}
|
772
729
|
case 'formatter': {
|
773
|
-
|
730
|
+
let type = $calendar.calendar('setting', 'type');
|
774
731
|
|
775
732
|
switch (type) {
|
776
733
|
case 'date': {
|
@@ -847,14 +804,6 @@
|
|
847
804
|
},
|
848
805
|
},
|
849
806
|
|
850
|
-
escape: {
|
851
|
-
string: function (text) {
|
852
|
-
text = String(text);
|
853
|
-
|
854
|
-
return text.replace(regExp.escape, '\\$&');
|
855
|
-
},
|
856
|
-
},
|
857
|
-
|
858
807
|
checkErrors: function (errors, internal) {
|
859
808
|
if (!errors || errors.length === 0) {
|
860
809
|
if (!internal) {
|
@@ -883,11 +832,9 @@
|
|
883
832
|
rules: [],
|
884
833
|
};
|
885
834
|
}
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
}
|
890
|
-
;
|
835
|
+
let newValidation = {
|
836
|
+
rules: [],
|
837
|
+
};
|
891
838
|
if (module.is.shorthandRules(rules)) {
|
892
839
|
rules = Array.isArray(rules)
|
893
840
|
? rules
|
@@ -918,18 +865,15 @@
|
|
918
865
|
if (errors === false) {
|
919
866
|
return;
|
920
867
|
}
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
canTransition = settings.transition && module.can.useElement('transition')
|
927
|
-
;
|
868
|
+
let $field = module.get.field(identifier);
|
869
|
+
let $fieldGroup = $field.closest($group);
|
870
|
+
let $prompt = $fieldGroup.children(selector.prompt);
|
871
|
+
let promptExists = $prompt.length > 0;
|
872
|
+
let canTransition = settings.transition && module.can.useElement('transition');
|
928
873
|
module.verbose('Adding field error state', identifier);
|
929
874
|
if (!internal) {
|
930
875
|
$fieldGroup
|
931
|
-
.addClass(className.error)
|
932
|
-
;
|
876
|
+
.addClass(className.error);
|
933
877
|
}
|
934
878
|
if (settings.inline) {
|
935
879
|
if (promptExists) {
|
@@ -949,12 +893,10 @@
|
|
949
893
|
$prompt.css('display', 'none');
|
950
894
|
}
|
951
895
|
$prompt
|
952
|
-
.appendTo($fieldGroup.filter('.' + className.error))
|
953
|
-
;
|
896
|
+
.appendTo($fieldGroup.filter('.' + className.error));
|
954
897
|
}
|
955
898
|
$prompt
|
956
|
-
.html(settings.templates.prompt(errors))
|
957
|
-
;
|
899
|
+
.html(settings.templates.prompt(errors));
|
958
900
|
if (!promptExists) {
|
959
901
|
if (canTransition) {
|
960
902
|
module.verbose('Displaying error with css transition', settings.transition);
|
@@ -962,8 +904,7 @@
|
|
962
904
|
} else {
|
963
905
|
module.verbose('Displaying error with fallback javascript animation');
|
964
906
|
$prompt
|
965
|
-
.fadeIn(settings.duration)
|
966
|
-
;
|
907
|
+
.fadeIn(settings.duration);
|
967
908
|
}
|
968
909
|
}
|
969
910
|
} else {
|
@@ -977,9 +918,8 @@
|
|
977
918
|
}
|
978
919
|
module.debug('Adding form error messages', errors);
|
979
920
|
module.set.error();
|
980
|
-
|
981
|
-
|
982
|
-
;
|
921
|
+
let customErrors = [];
|
922
|
+
let tempErrors;
|
983
923
|
if ($.isPlainObject(errors)) {
|
984
924
|
$.each(Object.keys(errors), function (i, id) {
|
985
925
|
if (module.checkErrors(errors[id], true) !== false) {
|
@@ -1002,8 +942,7 @@
|
|
1002
942
|
}
|
1003
943
|
if (customErrors.length > 0) {
|
1004
944
|
$message
|
1005
|
-
.html(settings.templates.error(customErrors))
|
1006
|
-
;
|
945
|
+
.html(settings.templates.error(customErrors));
|
1007
946
|
}
|
1008
947
|
},
|
1009
948
|
},
|
@@ -1021,11 +960,9 @@
|
|
1021
960
|
module.determine.isDirty();
|
1022
961
|
},
|
1023
962
|
rule: function (field, rule) {
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
: [rule]
|
1028
|
-
;
|
963
|
+
let rules = Array.isArray(rule)
|
964
|
+
? rule
|
965
|
+
: [rule];
|
1029
966
|
if (validation[field] === undefined || !Array.isArray(validation[field].rules)) {
|
1030
967
|
return;
|
1031
968
|
}
|
@@ -1047,11 +984,9 @@
|
|
1047
984
|
});
|
1048
985
|
},
|
1049
986
|
field: function (field) {
|
1050
|
-
|
1051
|
-
|
1052
|
-
|
1053
|
-
: [field]
|
1054
|
-
;
|
987
|
+
let fields = Array.isArray(field)
|
988
|
+
? field
|
989
|
+
: [field];
|
1055
990
|
$.each(fields, function (index, field) {
|
1056
991
|
module.remove.rule(field);
|
1057
992
|
});
|
@@ -1071,14 +1006,11 @@
|
|
1071
1006
|
module.remove.field(fields);
|
1072
1007
|
},
|
1073
1008
|
prompt: function (identifier) {
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
$prompt = $fieldGroup.children(selector.prompt)
|
1078
|
-
;
|
1009
|
+
let $field = module.get.field(identifier);
|
1010
|
+
let $fieldGroup = $field.closest($group);
|
1011
|
+
let $prompt = $fieldGroup.children(selector.prompt);
|
1079
1012
|
$fieldGroup
|
1080
|
-
.removeClass(className.error)
|
1081
|
-
;
|
1013
|
+
.removeClass(className.error);
|
1082
1014
|
if (settings.inline && $prompt.is(':visible')) {
|
1083
1015
|
module.verbose('Removing prompt for field', identifier);
|
1084
1016
|
if (settings.transition && module.can.useElement('transition')) {
|
@@ -1089,8 +1021,7 @@
|
|
1089
1021
|
$prompt
|
1090
1022
|
.fadeOut(settings.duration, function () {
|
1091
1023
|
$prompt.remove();
|
1092
|
-
})
|
1093
|
-
;
|
1024
|
+
});
|
1094
1025
|
}
|
1095
1026
|
}
|
1096
1027
|
},
|
@@ -1100,22 +1031,19 @@
|
|
1100
1031
|
success: function () {
|
1101
1032
|
$module
|
1102
1033
|
.removeClass(className.error)
|
1103
|
-
.addClass(className.success)
|
1104
|
-
;
|
1034
|
+
.addClass(className.success);
|
1105
1035
|
},
|
1106
1036
|
defaults: function () {
|
1107
1037
|
$field.each(function (index, el) {
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1117
|
-
: $el.val()
|
1118
|
-
;
|
1038
|
+
let $el = $(el);
|
1039
|
+
let $parent = $el.parent();
|
1040
|
+
let isCheckbox = $el.filter(selector.checkbox).length > 0;
|
1041
|
+
let isDropdown = ($parent.is(selector.uiDropdown) || $el.is(selector.uiDropdown)) && module.can.useElement('dropdown');
|
1042
|
+
let $calendar = $el.closest(selector.uiCalendar);
|
1043
|
+
let isCalendar = $calendar.length > 0 && module.can.useElement('calendar');
|
1044
|
+
let value = isCheckbox
|
1045
|
+
? $el.is(':checked')
|
1046
|
+
: $el.val();
|
1119
1047
|
if (isDropdown) {
|
1120
1048
|
if ($parent.is(selector.uiDropdown)) {
|
1121
1049
|
$parent.dropdown('save defaults');
|
@@ -1132,13 +1060,10 @@
|
|
1132
1060
|
error: function () {
|
1133
1061
|
$module
|
1134
1062
|
.removeClass(className.success)
|
1135
|
-
.addClass(className.error)
|
1136
|
-
;
|
1063
|
+
.addClass(className.error);
|
1137
1064
|
},
|
1138
1065
|
value: function (field, value) {
|
1139
|
-
|
1140
|
-
fields = {}
|
1141
|
-
;
|
1066
|
+
let fields = {};
|
1142
1067
|
fields[field] = value;
|
1143
1068
|
|
1144
1069
|
return module.set.values.call(element, fields);
|
@@ -1148,25 +1073,23 @@
|
|
1148
1073
|
return;
|
1149
1074
|
}
|
1150
1075
|
$.each(fields, function (key, value) {
|
1151
|
-
|
1152
|
-
|
1153
|
-
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
$multipleField
|
1163
|
-
;
|
1076
|
+
let $field = module.get.field(key);
|
1077
|
+
let $element = $field.parent();
|
1078
|
+
let $calendar = $field.closest(selector.uiCalendar);
|
1079
|
+
let isFile = $field.is(selector.file);
|
1080
|
+
let isMultiple = Array.isArray(value);
|
1081
|
+
let isCheckbox = $element.is(selector.uiCheckbox) && module.can.useElement('checkbox');
|
1082
|
+
let isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown');
|
1083
|
+
let isRadio = $field.is(selector.radio) && isCheckbox;
|
1084
|
+
let isCalendar = $calendar.length > 0 && module.can.useElement('calendar');
|
1085
|
+
let fieldExists = $field.length > 0;
|
1086
|
+
let $multipleField;
|
1164
1087
|
if (fieldExists) {
|
1165
1088
|
if (isMultiple && isCheckbox) {
|
1166
1089
|
module.verbose('Selecting multiple', value, $field);
|
1167
1090
|
$element.checkbox('uncheck');
|
1168
1091
|
$.each(value, function (index, value) {
|
1169
|
-
$multipleField = $field.filter('[value="' + value + '"]');
|
1092
|
+
$multipleField = $field.filter('[value="' + CSS.escape(value) + '"]');
|
1170
1093
|
$element = $multipleField.parent();
|
1171
1094
|
if ($multipleField.length > 0) {
|
1172
1095
|
$element.checkbox('check');
|
@@ -1174,10 +1097,9 @@
|
|
1174
1097
|
});
|
1175
1098
|
} else if (isRadio) {
|
1176
1099
|
module.verbose('Selecting radio value', value, $field);
|
1177
|
-
$field.filter('[value="' + value + '"]')
|
1100
|
+
$field.filter('[value="' + CSS.escape(value) + '"]')
|
1178
1101
|
.parent(selector.uiCheckbox)
|
1179
|
-
.checkbox('check')
|
1180
|
-
;
|
1102
|
+
.checkbox('check');
|
1181
1103
|
} else if (isCheckbox) {
|
1182
1104
|
module.verbose('Setting checkbox value', value, $element);
|
1183
1105
|
if (value === true || value === 1 || value === 'on') {
|
@@ -1239,20 +1161,18 @@
|
|
1239
1161
|
});
|
1240
1162
|
}
|
1241
1163
|
$field.each(function (_index, el) {
|
1242
|
-
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
1251
|
-
|
1252
|
-
|
1253
|
-
|
1254
|
-
identifier = module.get.identifier(validation, $el)
|
1255
|
-
;
|
1164
|
+
let $el = $(el);
|
1165
|
+
let $elGroup = $el.closest($group);
|
1166
|
+
let isCheckbox = $el.filter(selector.checkbox).length > 0;
|
1167
|
+
let isRequired = $el.prop('required') || $elGroup.hasClass(className.required) || $elGroup.parent().hasClass(className.required);
|
1168
|
+
let isDisabled = $el.is(':disabled') || $elGroup.hasClass(className.disabled) || $elGroup.parent().hasClass(className.disabled);
|
1169
|
+
let validation = module.get.validation($el);
|
1170
|
+
let hasNotEmptyRule = validation
|
1171
|
+
? $.grep(validation.rules, function (rule) {
|
1172
|
+
return ['notEmpty', 'checked', 'empty'].indexOf(rule.type) >= 0;
|
1173
|
+
}).length > 0
|
1174
|
+
: false;
|
1175
|
+
let identifier = module.get.identifier(validation, $el);
|
1256
1176
|
if (isRequired && !isDisabled && !hasNotEmptyRule && identifier !== undefined) {
|
1257
1177
|
if (isCheckbox) {
|
1258
1178
|
module.verbose("Adding 'checked' rule on field", identifier);
|
@@ -1277,7 +1197,7 @@
|
|
1277
1197
|
validate: {
|
1278
1198
|
|
1279
1199
|
form: function (event, ignoreCallbacks) {
|
1280
|
-
|
1200
|
+
let values = module.get.values();
|
1281
1201
|
|
1282
1202
|
// input keydown event will fire submit repeatedly by browser default
|
1283
1203
|
if (keyHeldDown) {
|
@@ -1308,14 +1228,12 @@
|
|
1308
1228
|
event.stopImmediatePropagation();
|
1309
1229
|
}
|
1310
1230
|
if (settings.errorFocus && ignoreCallbacks !== true) {
|
1311
|
-
|
1312
|
-
|
1313
|
-
hasTabIndex = true
|
1314
|
-
;
|
1231
|
+
let $focusElement;
|
1232
|
+
let hasTabIndex = true;
|
1315
1233
|
if (typeof settings.errorFocus === 'string') {
|
1316
1234
|
$focusElement = $(document).find(settings.errorFocus);
|
1317
1235
|
hasTabIndex = $focusElement.is('[tabindex]');
|
1318
|
-
// to be able to focus/scroll into non
|
1236
|
+
// to be able to focus/scroll into non-input elements, we need a tabindex
|
1319
1237
|
if (!hasTabIndex) {
|
1320
1238
|
$focusElement.attr('tabindex', -1);
|
1321
1239
|
}
|
@@ -1349,20 +1267,18 @@
|
|
1349
1267
|
|
1350
1268
|
return true;
|
1351
1269
|
}
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1362
|
-
|
1363
|
-
|
1364
|
-
errorLimit
|
1365
|
-
;
|
1270
|
+
let identifier = field.identifier || fieldName;
|
1271
|
+
let $field = module.get.field(identifier);
|
1272
|
+
let $fieldGroup = $field.closest($group);
|
1273
|
+
let $dependsField = field.depends
|
1274
|
+
? module.get.field(field.depends)
|
1275
|
+
: false;
|
1276
|
+
let fieldValid = true;
|
1277
|
+
let fieldErrors = [];
|
1278
|
+
let isDisabled = $field.filter(':not(:disabled)').length === 0 || $fieldGroup.hasClass(className.disabled) || $fieldGroup.parent().hasClass(className.disabled);
|
1279
|
+
let validationMessage = $field[0].validationMessage;
|
1280
|
+
let noNativeValidation = field.noNativeValidation || settings.noNativeValidation || $field.filter('[formnovalidate],[novalidate]').length > 0 || $module.filter('[novalidate]').length > 0;
|
1281
|
+
let errorLimit;
|
1366
1282
|
if (!field.identifier) {
|
1367
1283
|
module.debug('Using field name as identifier', identifier);
|
1368
1284
|
field.identifier = identifier;
|
@@ -1387,10 +1303,10 @@
|
|
1387
1303
|
errorLimit = field.errorLimit || settings.errorLimit;
|
1388
1304
|
$.each(field.rules, function (index, rule) {
|
1389
1305
|
if (module.has.field(identifier) && (!errorLimit || fieldErrors.length < errorLimit)) {
|
1390
|
-
|
1306
|
+
let invalidFields = module.validate.rule(field, rule, true) || [];
|
1391
1307
|
if (invalidFields.length > 0) {
|
1392
1308
|
module.debug('Field is invalid', identifier, rule.type);
|
1393
|
-
|
1309
|
+
let fieldError = module.get.prompt(rule, field);
|
1394
1310
|
if (!settings.inline) {
|
1395
1311
|
if (
|
1396
1312
|
// Always allow the first error prompt for new field identifiers
|
@@ -1434,25 +1350,23 @@
|
|
1434
1350
|
|
1435
1351
|
// takes validation rule and returns whether field passes rule
|
1436
1352
|
rule: function (field, rule, internal) {
|
1437
|
-
|
1438
|
-
|
1439
|
-
|
1440
|
-
|
1441
|
-
|
1442
|
-
|
1443
|
-
|
1444
|
-
|
1445
|
-
|
1446
|
-
|
1447
|
-
|
1448
|
-
|
1449
|
-
|
1450
|
-
|
1451
|
-
|
1452
|
-
|
1453
|
-
|
1454
|
-
}
|
1455
|
-
;
|
1353
|
+
let $field = module.get.field(field.identifier);
|
1354
|
+
let ancillary = module.get.ancillaryValue(rule);
|
1355
|
+
let ruleName = module.get.ruleName(rule);
|
1356
|
+
let ruleFunction = settings.rules[ruleName];
|
1357
|
+
let invalidFields = [];
|
1358
|
+
let isCheckbox = $field.is(selector.checkbox);
|
1359
|
+
let isValid = function (field) {
|
1360
|
+
let value = isCheckbox ? $(field).filter(':checked').val() : $(field).val();
|
1361
|
+
// cast to string avoiding encoding special values
|
1362
|
+
value = value === undefined || value === '' || value === null
|
1363
|
+
? ''
|
1364
|
+
: ((settings.shouldTrim && rule.shouldTrim !== false) || rule.shouldTrim
|
1365
|
+
? String(value + '').trim()
|
1366
|
+
: String(value + ''));
|
1367
|
+
|
1368
|
+
return ruleFunction.call(field, value, ancillary, module);
|
1369
|
+
};
|
1456
1370
|
if (!isFunction(ruleFunction)) {
|
1457
1371
|
module.error(error.noRule, ruleName);
|
1458
1372
|
|
@@ -1526,11 +1440,9 @@
|
|
1526
1440
|
},
|
1527
1441
|
performance: {
|
1528
1442
|
log: function (message) {
|
1529
|
-
|
1530
|
-
|
1531
|
-
|
1532
|
-
previousTime
|
1533
|
-
;
|
1443
|
+
let currentTime;
|
1444
|
+
let executionTime;
|
1445
|
+
let previousTime;
|
1534
1446
|
if (settings.performance) {
|
1535
1447
|
currentTime = Date.now();
|
1536
1448
|
previousTime = time || currentTime;
|
@@ -1549,10 +1461,8 @@
|
|
1549
1461
|
}, 500);
|
1550
1462
|
},
|
1551
1463
|
display: function () {
|
1552
|
-
|
1553
|
-
|
1554
|
-
totalTime = 0
|
1555
|
-
;
|
1464
|
+
let title = settings.name + ':';
|
1465
|
+
let totalTime = 0;
|
1556
1466
|
time = false;
|
1557
1467
|
clearTimeout(module.performance.timer);
|
1558
1468
|
$.each(performance, function (index, data) {
|
@@ -1577,19 +1487,17 @@
|
|
1577
1487
|
},
|
1578
1488
|
},
|
1579
1489
|
invoke: function (query, passedArguments, context) {
|
1580
|
-
|
1581
|
-
|
1582
|
-
|
1583
|
-
|
1584
|
-
response
|
1585
|
-
;
|
1490
|
+
let object = instance;
|
1491
|
+
let maxDepth;
|
1492
|
+
let found;
|
1493
|
+
let response;
|
1586
1494
|
passedArguments = passedArguments || queryArguments;
|
1587
1495
|
context = context || element;
|
1588
1496
|
if (typeof query === 'string' && object !== undefined) {
|
1589
1497
|
query = query.split(/[ .]/);
|
1590
1498
|
maxDepth = query.length - 1;
|
1591
1499
|
$.each(query, function (depth, value) {
|
1592
|
-
|
1500
|
+
let camelCaseValue = depth !== maxDepth
|
1593
1501
|
? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
|
1594
1502
|
: query;
|
1595
1503
|
if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {
|
@@ -1774,9 +1682,7 @@
|
|
1774
1682
|
|
1775
1683
|
// template that produces error message
|
1776
1684
|
error: function (errors) {
|
1777
|
-
|
1778
|
-
html = '<ul class="list">'
|
1779
|
-
;
|
1685
|
+
let html = '<ul class="list">';
|
1780
1686
|
$.each(errors, function (index, value) {
|
1781
1687
|
html += '<li>' + value + '</li>';
|
1782
1688
|
});
|
@@ -1790,9 +1696,7 @@
|
|
1790
1696
|
if (errors.length === 1) {
|
1791
1697
|
return errors[0];
|
1792
1698
|
}
|
1793
|
-
|
1794
|
-
html = '<ul class="ui list">'
|
1795
|
-
;
|
1699
|
+
let html = '<ul class="ui list">';
|
1796
1700
|
$.each(errors, function (index, value) {
|
1797
1701
|
html += '<li>' + value + '</li>';
|
1798
1702
|
});
|
@@ -1843,11 +1747,6 @@
|
|
1843
1747
|
return !(value === undefined || value === '' || (Array.isArray(value) && value.length === 0));
|
1844
1748
|
},
|
1845
1749
|
|
1846
|
-
/* Deprecated */
|
1847
|
-
empty: function (value) {
|
1848
|
-
return $.fn.form.settings.rules.notEmpty(value);
|
1849
|
-
},
|
1850
|
-
|
1851
1750
|
// checkbox checked
|
1852
1751
|
checked: function () {
|
1853
1752
|
return $(this).filter(':checked').length > 0;
|
@@ -1858,7 +1757,7 @@
|
|
1858
1757
|
return $.fn.form.settings.regExp.email.test(value);
|
1859
1758
|
},
|
1860
1759
|
|
1861
|
-
// value is most likely url
|
1760
|
+
// value is most likely the url
|
1862
1761
|
url: function (value) {
|
1863
1762
|
return $.fn.form.settings.regExp.url.test(value);
|
1864
1763
|
},
|
@@ -1868,10 +1767,8 @@
|
|
1868
1767
|
if (regExp instanceof RegExp) {
|
1869
1768
|
return value.match(regExp);
|
1870
1769
|
}
|
1871
|
-
|
1872
|
-
|
1873
|
-
flags
|
1874
|
-
;
|
1770
|
+
let regExpParts = regExp.match($.fn.form.settings.regExp.flags);
|
1771
|
+
let flags;
|
1875
1772
|
// regular expression specified as /baz/gi (flags)
|
1876
1773
|
if (regExpParts) {
|
1877
1774
|
regExp = regExpParts.length >= 2
|
@@ -1901,11 +1798,9 @@
|
|
1901
1798
|
if (!(regExp instanceof RegExp)) {
|
1902
1799
|
regExp = $.fn.form.settings.regExp.integer;
|
1903
1800
|
}
|
1904
|
-
|
1905
|
-
|
1906
|
-
|
1907
|
-
parts
|
1908
|
-
;
|
1801
|
+
let min;
|
1802
|
+
let max;
|
1803
|
+
let parts;
|
1909
1804
|
if (!range || ['', '..'].indexOf(range) !== -1) {
|
1910
1805
|
|
1911
1806
|
// do nothing
|
@@ -1934,7 +1829,7 @@
|
|
1934
1829
|
);
|
1935
1830
|
},
|
1936
1831
|
|
1937
|
-
// is valid number (with decimal)
|
1832
|
+
// is it a valid number (with decimal)
|
1938
1833
|
decimal: function (value, range) {
|
1939
1834
|
return $.fn.form.settings.rules.range(value, range, 'decimal');
|
1940
1835
|
},
|
@@ -1944,7 +1839,7 @@
|
|
1944
1839
|
return $.fn.form.settings.rules.range(value, range, 'number');
|
1945
1840
|
},
|
1946
1841
|
|
1947
|
-
// is value (case
|
1842
|
+
// is value (case-insensitive)
|
1948
1843
|
is: function (value, text) {
|
1949
1844
|
text = typeof text === 'string'
|
1950
1845
|
? text.toLowerCase()
|
@@ -1961,7 +1856,7 @@
|
|
1961
1856
|
return value == text;
|
1962
1857
|
},
|
1963
1858
|
|
1964
|
-
// value is not another value (case
|
1859
|
+
// value is not another value (case-insensitive)
|
1965
1860
|
not: function (value, notValue) {
|
1966
1861
|
value = typeof value === 'string'
|
1967
1862
|
? value.toLowerCase()
|
@@ -1973,7 +1868,7 @@
|
|
1973
1868
|
return value != notValue;
|
1974
1869
|
},
|
1975
1870
|
|
1976
|
-
// value is not another value (case
|
1871
|
+
// value is not another value (case-sensitive)
|
1977
1872
|
notExactly: function (value, notValue) {
|
1978
1873
|
return value != notValue;
|
1979
1874
|
},
|
@@ -2031,16 +1926,16 @@
|
|
2031
1926
|
|
2032
1927
|
// matches another field
|
2033
1928
|
match: function (value, identifier, module) {
|
2034
|
-
|
1929
|
+
let matchingValue = module.get.value(identifier, true);
|
2035
1930
|
|
2036
1931
|
return matchingValue !== undefined
|
2037
1932
|
? value.toString() === matchingValue.toString()
|
2038
1933
|
: false;
|
2039
1934
|
},
|
2040
1935
|
|
2041
|
-
// different
|
1936
|
+
// different from another field
|
2042
1937
|
different: function (value, identifier, module) {
|
2043
|
-
|
1938
|
+
let matchingValue = module.get.value(identifier, true);
|
2044
1939
|
|
2045
1940
|
return matchingValue !== undefined
|
2046
1941
|
? value.toString() !== matchingValue.toString()
|
@@ -2048,57 +1943,55 @@
|
|
2048
1943
|
},
|
2049
1944
|
|
2050
1945
|
creditCard: function (cardNumber, cardTypes) {
|
2051
|
-
|
2052
|
-
|
2053
|
-
|
2054
|
-
|
2055
|
-
|
2056
|
-
|
2057
|
-
|
2058
|
-
|
2059
|
-
|
2060
|
-
|
2061
|
-
|
2062
|
-
|
2063
|
-
length: [16],
|
2064
|
-
},
|
2065
|
-
discover: {
|
2066
|
-
pattern: /^(6011|622(12[6-9]|1[3-9]\d|[2-8]\d{2}|9[01]\d|92[0-5]|64[4-9])|65)/,
|
2067
|
-
length: [16],
|
2068
|
-
},
|
2069
|
-
unionPay: {
|
2070
|
-
pattern: /^(62|88)/,
|
2071
|
-
length: [16, 17, 18, 19],
|
2072
|
-
},
|
2073
|
-
jcb: {
|
2074
|
-
pattern: /^35(2[89]|[3-8]\d)/,
|
2075
|
-
length: [16],
|
2076
|
-
},
|
2077
|
-
maestro: {
|
2078
|
-
pattern: /^(5018|5020|5038|6304|6759|676[1-3])/,
|
2079
|
-
length: [12, 13, 14, 15, 16, 17, 18, 19],
|
2080
|
-
},
|
2081
|
-
dinersClub: {
|
2082
|
-
pattern: /^(30[0-5]|^36)/,
|
2083
|
-
length: [14],
|
2084
|
-
},
|
2085
|
-
laser: {
|
2086
|
-
pattern: /^(6304|670[69]|6771)/,
|
2087
|
-
length: [16, 17, 18, 19],
|
2088
|
-
},
|
2089
|
-
visaElectron: {
|
2090
|
-
pattern: /^(4026|417500|4508|4844|491(3|7))/,
|
2091
|
-
length: [16],
|
2092
|
-
},
|
1946
|
+
let cards = {
|
1947
|
+
visa: {
|
1948
|
+
pattern: /^4/,
|
1949
|
+
length: [16],
|
1950
|
+
},
|
1951
|
+
amex: {
|
1952
|
+
pattern: /^3[47]/,
|
1953
|
+
length: [15],
|
1954
|
+
},
|
1955
|
+
mastercard: {
|
1956
|
+
pattern: /^5[1-5]/,
|
1957
|
+
length: [16],
|
2093
1958
|
},
|
2094
|
-
|
2095
|
-
|
2096
|
-
|
2097
|
-
|
2098
|
-
|
2099
|
-
|
2100
|
-
|
2101
|
-
|
1959
|
+
discover: {
|
1960
|
+
pattern: /^(6011|622(12[6-9]|1[3-9]\d|[2-8]\d{2}|9[01]\d|92[0-5]|64[4-9])|65)/,
|
1961
|
+
length: [16],
|
1962
|
+
},
|
1963
|
+
unionPay: {
|
1964
|
+
pattern: /^(62|88)/,
|
1965
|
+
length: [16, 17, 18, 19],
|
1966
|
+
},
|
1967
|
+
jcb: {
|
1968
|
+
pattern: /^35(2[89]|[3-8]\d)/,
|
1969
|
+
length: [16],
|
1970
|
+
},
|
1971
|
+
maestro: {
|
1972
|
+
pattern: /^(5018|5020|5038|6304|6759|676[1-3])/,
|
1973
|
+
length: [12, 13, 14, 15, 16, 17, 18, 19],
|
1974
|
+
},
|
1975
|
+
dinersClub: {
|
1976
|
+
pattern: /^(30[0-5]|^36)/,
|
1977
|
+
length: [14],
|
1978
|
+
},
|
1979
|
+
laser: {
|
1980
|
+
pattern: /^(6304|670[69]|6771)/,
|
1981
|
+
length: [16, 17, 18, 19],
|
1982
|
+
},
|
1983
|
+
visaElectron: {
|
1984
|
+
pattern: /^(4026|417500|4508|4844|491(3|7))/,
|
1985
|
+
length: [16],
|
1986
|
+
},
|
1987
|
+
};
|
1988
|
+
let valid = {};
|
1989
|
+
let validCard = false;
|
1990
|
+
let requiredTypes = typeof cardTypes === 'string'
|
1991
|
+
? cardTypes.split(',')
|
1992
|
+
: false;
|
1993
|
+
let unionPay;
|
1994
|
+
let validation;
|
2102
1995
|
|
2103
1996
|
if (typeof cardNumber !== 'string' || cardNumber.length === 0) {
|
2104
1997
|
return;
|
@@ -2138,15 +2031,13 @@
|
|
2138
2031
|
}
|
2139
2032
|
|
2140
2033
|
// verify luhn, adapted from <https://gist.github.com/2134376>
|
2141
|
-
|
2142
|
-
|
2143
|
-
|
2144
|
-
|
2145
|
-
|
2146
|
-
|
2147
|
-
|
2148
|
-
sum = 0
|
2149
|
-
;
|
2034
|
+
let length = cardNumber.length;
|
2035
|
+
let multiple = 0;
|
2036
|
+
let producedValue = [
|
2037
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
|
2038
|
+
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9],
|
2039
|
+
];
|
2040
|
+
let sum = 0;
|
2150
2041
|
while (length--) {
|
2151
2042
|
sum += producedValue[multiple][parseInt(cardNumber.charAt(length), 10)];
|
2152
2043
|
multiple ^= 1; // eslint-disable-line no-bitwise
|