diff --git a/core/mappings.js b/core/mappings.js
index 34262758..89e215ad 100644
--- a/core/mappings.js
+++ b/core/mappings.js
@@ -73,6 +73,7 @@ mappings.cdn = {
'jQuery/jquery-{version}.': resources.jQuery,
'jquery/jquery-{version}.': resources.jQuery,
'jquery.validate/{version}/jquery.validate.': resources.jqueryValidationPlugin,
+ 'jquery.validation.unobtrusive/{version}/jquery.validate.unobtrusive.': resources.jQueryValidationUnobtrusive,
'modernizr/modernizr-{version}.': resources.modernizr,
'bootstrap/{version}/bootstrap.min.': resources.bootstrapJS
}
@@ -301,6 +302,7 @@ mappings.cdn = {
'jquery-modal/{version}/jquery.modal.css': resources.jQueryModalCSS,
'jquery-modal/{version}/jquery.modal.min.css': resources.jQueryModalCSS,
'jquery-mousewheel/{version}/jquery.mousewheel.min.js': resources.jqueryMousewheelJS,
+ 'jquery-validation-unobtrusive/{version}/jquery.validate.unobtrusive.': resources.jQueryValidationUnobtrusive,
'jScrollPane/{version}/script/jquery.jscrollpane.': resources.jScrollPane,
'js-cookie/{version}/js.cookie.min.js': resources.jscookie,
'knockout/{version}/knockout': resources.knockout,
diff --git a/core/resources.js b/core/resources.js
index 77a6e648..e8e5ddf0 100644
--- a/core/resources.js
+++ b/core/resources.js
@@ -578,6 +578,11 @@ var resources = {
'path': 'resources/jquery-mobile/{version}/jquery.mobile.min.jsm',
'type': 'application/javascript'
},
+ // jquery-validation-unobtrusive
+ 'jQueryValidationUnobtrusive': {
+ 'path': 'resources/jquery-validation-unobtrusive/{version}/jquery.validate.unobtrusive.min.jsm',
+ 'type': 'application/javascript'
+ },
// js-cookie [Deprecated]
'jscookie': {
'path': 'resources/js-cookie/{version}/js.cookie.min.jsm',
diff --git a/modules/internal/targets.js b/modules/internal/targets.js
index 389a9ac0..121fff1f 100644
--- a/modules/internal/targets.js
+++ b/modules/internal/targets.js
@@ -281,6 +281,8 @@ targets.setLastVersion = function (type, version) {
return '1.8.0';
} else if (type.startsWith('/jquery-jeditable/2.')) {
return '2.0.18';
+ } else if (type.startsWith('/jquery-validation-unobtrusive/3.')) {
+ return '3.2.11';
} else if (type.startsWith('tablesorter/2.')) {
return '2.31.3';
} else if (type.startsWith('/jquery-modal/0.')) {
@@ -484,6 +486,7 @@ targets.determineResourceName = function (filename) {
};
const ListOfFiles = {
+ 'jquery.validate.unobtrusive.min.jsm': 'jQuery Validate Unobtrusive',
'jquery.sliderPro.min.js': 'Slider Pro (JS)',
'knockout-latest.min.jsm': 'Knockout',
'bootstrap-multiselect.min.jsm': 'Bootstrap Multiselect',
diff --git a/pages/updates/updates.html b/pages/updates/updates.html
index 559bd8a9..c40e4fea 100644
--- a/pages/updates/updates.html
+++ b/pages/updates/updates.html
@@ -33,6 +33,7 @@
diff --git a/resources/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.jsm b/resources/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.jsm
new file mode 100644
index 00000000..553d4274
--- /dev/null
+++ b/resources/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.jsm
@@ -0,0 +1,5 @@
+// Unobtrusive validation support library for jQuery and jQuery Validate
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// @version v3.2.11
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("
").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function u(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=f.unobtrusive.options||{},u=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),u("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),u("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),u("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var m,f=a.validator,v="unobtrusiveValidation";return f.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=u(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){f.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=u(this);a&&a.attachValidation()})}},m=f.unobtrusive.adapters,m.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},m.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},m.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},m.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},f.addMethod("__dummy__",function(a,e,n){return!0}),f.addMethod("regex",function(a,e,n){var t;return!!this.optional(e)||(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),f.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),f.methods.extension?(m.addSingleVal("accept","mimtype"),m.addSingleVal("extension","extension")):m.addSingleVal("extension","extension","accept"),m.addSingleVal("regex","pattern"),m.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),m.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),m.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),m.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),m.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||e(a,"required",!0)}),m.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),m.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),m.add("fileextensions",["extensions"],function(a){e(a,"extension",a.params.extensions)}),a(function(){f.unobtrusive.parse(document)}),f.unobtrusive});