diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valCustom.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valCustom.directive.js deleted file mode 100644 index dac010a97f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valCustom.directive.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - * General-purpose validator for ngModel. - * angular.js comes with several built-in validation mechanism for input fields (ngRequired, ngPattern etc.) but using - * an arbitrary validation function requires creation of a custom formatters and / or parsers. - * The ui-validate directive makes it easy to use any function(s) defined in scope as a validator function(s). - * A validator function will trigger validation on both model and input changes. - * - * @example - * @example - * @example - * @example - * - * @param val-custom {string|object literal} If strings is passed it should be a scope's function to be used as a validator. - * If an object literal is passed a key denotes a validation error key while a value should be a validator function. - * In both cases validator function should take a value to validate as its argument and should return true/false indicating a validation result. - */ - - /* - This code comes from the angular UI project, we had to change the directive name and module - but other then that its unmodified - */ -angular.module('umbraco.directives.validation') -.directive('valCustom', function () { - - return { - restrict: 'A', - require: 'ngModel', - link: function (scope, elm, attrs, ctrl) { - var validateFn, watch, validators = {}, - validateExpr = scope.$eval(attrs.valCustom); - - if (!validateExpr){ return;} - - if (angular.isString(validateExpr)) { - validateExpr = { validator: validateExpr }; - } - - angular.forEach(validateExpr, function (exprssn, key) { - validateFn = function (valueToValidate) { - var expression = scope.$eval(exprssn, { '$value' : valueToValidate }); - if (angular.isObject(expression) && angular.isFunction(expression.then)) { - // expression is a promise - expression.then(function(){ - ctrl.$setValidity(key, true); - }, function(){ - ctrl.$setValidity(key, false); - }); - return valueToValidate; - } else if (expression) { - // expression is true - ctrl.$setValidity(key, true); - return valueToValidate; - } else { - // expression is false - ctrl.$setValidity(key, false); - return undefined; - } - }; - validators[key] = validateFn; - - ctrl.$parsers.push(validateFn); - }); - - function apply_watch(watch) - { - //string - update all validators on expression change - if (angular.isString(watch)) - { - scope.$watch(watch, function(){ - angular.forEach(validators, function(validatorFn){ - validatorFn(ctrl.$modelValue); - }); - }); - return; - } - - //array - update all validators on change of any expression - if (angular.isArray(watch)) - { - angular.forEach(watch, function(expression){ - scope.$watch(expression, function() - { - angular.forEach(validators, function(validatorFn){ - validatorFn(ctrl.$modelValue); - }); - }); - }); - return; - } - - //object - update appropriate validator - if (angular.isObject(watch)) - { - angular.forEach(watch, function(expression, validatorKey) - { - //value is string - look after one expression - if (angular.isString(expression)) - { - scope.$watch(expression, function(){ - validators[validatorKey](ctrl.$modelValue); - }); - } - - //value is array - look after all expressions in array - if (angular.isArray(expression)) - { - angular.forEach(expression, function(intExpression) - { - scope.$watch(intExpression, function(){ - validators[validatorKey](ctrl.$modelValue); - }); - }); - } - }); - } - } - // Support for val-custom-watch - if (attrs.valCustomWatch){ - apply_watch( scope.$eval(attrs.valCustomWatch) ); - } - } - }; -}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valcompare.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valcompare.directive.js index fc419a0b97..82a539c0ce 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valcompare.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valcompare.directive.js @@ -9,14 +9,12 @@ angular.module('umbraco.directives.validation') var otherInput = formCtrl[attrs.valCompare]; - ctrl.$parsers.push(function(value) { - if(value === otherInput.$viewValue) { - ctrl.$setValidity("valCompare", true); - return value; - } - ctrl.$setValidity("valCompare", false); - }); + //normal validator on the original source + ctrl.$validators.valCompare = function(modelValue, viewValue) { + return viewValue === otherInput.$viewValue; + }; + //custom parser on the destination source with custom validation applied to the original source otherInput.$parsers.push(function(value) { ctrl.$setValidity("valCompare", value === ctrl.$viewValue); return value; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valemail.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valemail.directive.js index 273ab07593..c70fd5c589 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valemail.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valemail.directive.js @@ -10,36 +10,32 @@ function valEmail(valEmailExpression) { require: 'ngModel', restrict: "A", link: function (scope, elm, attrs, ctrl) { - - var patternValidator = function (viewValue) { + + function patternValidator(viewValue) { //NOTE: we don't validate on empty values, use required validator for that if (!viewValue || valEmailExpression.EMAIL_REGEXP.test(viewValue)) { - // it is valid - ctrl.$setValidity('valEmail', true); //assign a message to the validator ctrl.errorMsg = ""; - return viewValue; + return true; } else { - // it is invalid, return undefined (no model update) - ctrl.$setValidity('valEmail', false); //assign a message to the validator ctrl.errorMsg = "Invalid email"; - return undefined; + return false; } }; - //if there is an attribute: type="email" then we need to remove those formatters and parsers + //if there is an attribute: type="email" then we need to remove the built in validator + // this isn't totally required but it gives us the ability to completely control the validation syntax so we don't + // run into old problems like http://issues.umbraco.org/issue/U4-8445 if (attrs.type === "email") { - //we need to remove the existing parsers = the default angular one which is created by - // type="email", but this has a regex issue, so we'll remove that and add our custom one - ctrl.$parsers.pop(); - //we also need to remove the existing formatter - the default angular one will not render - // what it thinks is an invalid email address, so it will just be blank - ctrl.$formatters.pop(); + ctrl.$validators = {}; } - - ctrl.$parsers.push(patternValidator); + + ctrl.$validators.valEmail = function(modelValue, viewValue) { + return patternValidator(viewValue); + }; + } }; } @@ -51,4 +47,4 @@ angular.module('umbraco.directives.validation') return { EMAIL_REGEXP: emailRegex }; - }); \ No newline at end of file + }); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valrequirecomponent.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valrequirecomponent.directive.js index 565136608f..21e5ce5525 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valrequirecomponent.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valrequirecomponent.directive.js @@ -1,7 +1,7 @@ (function() { 'use strict'; - function ValRequireComponentDirective() { + function valRequireComponentDirective() { function link(scope, el, attr, ngModel) { @@ -33,6 +33,6 @@ return directive; } - angular.module('umbraco.directives').directive('valRequireComponent', ValRequireComponentDirective); + angular.module('umbraco.directives').directive('valRequireComponent', valRequireComponentDirective); })();