From 32cc8a053146d42875ac60eb04c35669a3302bb3 Mon Sep 17 00:00:00 2001 From: tlastad Date: Tue, 31 Mar 2015 16:31:22 +0200 Subject: [PATCH 1/7] temp commit to own repository Easter holiday, cant keep this code locked up in the office for a week... --- src/validation-common.js | 13 ++++++++----- src/validation-rules.js | 7 +++++++ src/validation-service.js | 20 +++++++++++++------- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/validation-common.js b/src/validation-common.js index 8877b3d..eacbba7 100644 --- a/src/validation-common.js +++ b/src/validation-common.js @@ -53,7 +53,10 @@ angular //---- // Public functions declaration //---------------------------------- - + + function isValidationRequired(validations) { + return validations.indexOf("required") >= 0 || validations.indexOf("requiredselection") >= 0; + } function defineValidation() { var self = this; var customUserRegEx = {}; @@ -91,8 +94,7 @@ angular var validations = rules.split('|'); if(validations) { - self.bFieldRequired = (validations.indexOf("required") >= 0) ? true : false; - + self.bFieldRequired = isValidationRequired(validations) ? true : false; // loop through all validators of the element for(var i = 0, ln = validations.length; i < ln; i++) { var params = validations[i].split(':'); // params[0] is the rule, [1] is the rule extra params @@ -125,7 +127,8 @@ angular * @param string message: error message to display */ function updateErrorMsg(message, attrs) { - var self = this; + // attrs.obj if set should be a commonObj + var self = (!!attrs && attrs.obj) ? attrs.obj : this; // element name could be defined in the `attrs` or in the self object var elm = (!!attrs && attrs.elm) ? attrs.elm : self.elm; @@ -297,7 +300,7 @@ angular if(index >= 0 && message === '') { validationSummary.splice(index, 1); }else if(message !== '') { - var errorObj = { field: elmName, message: message }; + var errorObj = { field: elmName, message: message, obj: self}; // if error already exist then refresh the error object inside the array, else push it to the array if(index >= 0) { diff --git a/src/validation-rules.js b/src/validation-rules.js index c13826d..b1cd304 100644 --- a/src/validation-rules.js +++ b/src/validation-rules.js @@ -538,6 +538,13 @@ angular type: "regex" }; break; + case "requiredselection": + validator = { + pattern: "\\S+", + message: "INVALID_REQUIREDSELECTION", + type: "regex" + }; + break; } // switch() return validator; diff --git a/src/validation-service.js b/src/validation-service.js index 4b1511a..6f2deb4 100644 --- a/src/validation-service.js +++ b/src/validation-service.js @@ -27,6 +27,7 @@ angular validationService.prototype.addValidator = addValidator; validationService.prototype.checkFormValidity = checkFormValidity; validationService.prototype.removeValidator = removeValidator; + validationService.prototype.clearValidationSummary = clearValidationSummary; validationService.prototype.setGlobalOptions = setGlobalOptions; return validationService; @@ -73,7 +74,7 @@ angular attrs = mergeObjects(self.validationAttrs, attrs); // watch the element for any value change, validate it once that happen - attrs.scope.$watch(attrs.elmName, function (newVal, oldVal) { + attrs.scope.$watch(attrs.elmName, function (newVal, oldVal) { if(newVal === undefined && oldVal !== undefined) { self.commonObj.updateErrorMsg("INVALID_KEY_CHAR", {valid: false, translate: true}); return; @@ -84,11 +85,17 @@ angular self.commonObj.initialize(attrs.scope, attrs.elm, attrs, attrs.ctrl); attemptToValidate(self, newVal); - }, true); // $watch() + }, true); // $watch() return self; - } // addValidator() + } // addValidator() + function clearValidationSummary(obj) { + if (typeof obj === "undefined" || typeof obj.$validationSummary === "undefined") { + throw 'checkFormValidity() requires a valid Angular Form or $scope object passed as argument to function properly (ex.: $scope.form1 OR $scope).'; + } + obj.$validationSummary = []; + } /** Is the Form all valid? Loop through Validation Summary to get the answer, if any errors are there then display them and return false * @param object Angular Form or Scope Object * @return bool isFormValid @@ -103,13 +110,12 @@ angular // loop through $validationSummary and display errors when found on each field for(var i = 0, ln = obj.$validationSummary.length; i < ln; i++) { isValid = false; - elmName = obj.$validationSummary[i].field; - elm = angular.element(document.querySelector('[name="'+elmName+'"]:not([disabled]):not([ng-disabled]')); - ctrl = angular.element(elm).controller('ngModel'); + elm = obj.$validationSummary[i].obj.elm; + ctrl = obj.$validationSummary[i].obj.ctrl; if(!!elm && elm.length > 0) { ctrl.$setTouched(); // make the element as it was touched for CSS - self.commonObj.updateErrorMsg(obj.$validationSummary[i].message, {valid: false, elm: elm, submitted: true}); + self.commonObj.updateErrorMsg(obj.$validationSummary[i].message, { valid: false, obj: obj.$validationSummary[i].obj, submitted: true }); } } return isValid; From 988be73b5f8953171377a114b7bd5d175f5a5a9c Mon Sep 17 00:00:00 2001 From: tlastad Date: Tue, 31 Mar 2015 16:39:41 +0200 Subject: [PATCH 2/7] Translation + new key Added norwegian translation, and added a new key: INVALID_REQUIREDSELECTION. French and spanish have not been translated for new key. --- locales/validation/en.json | 1 + locales/validation/es.json | 1 + locales/validation/fr.json | 1 + locales/validation/no.json | 80 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 locales/validation/no.json diff --git a/locales/validation/en.json b/locales/validation/en.json index 35c8e10..419ed9e 100644 --- a/locales/validation/en.json +++ b/locales/validation/en.json @@ -51,6 +51,7 @@ "INVALID_REQUIRED": "Field is required. ", "INVALID_URL": "Must be a valid URL. ", "INVALID_TIME": "Must be a valid time format (hh:mm) OR (hh:mm:ss). ", + "INVALID_REQUIREDSELECTION": "Must choose an option", "AREA1": "TextArea: Alphanumeric + Minimum(15) + Required", "ERRORS": "Errors", diff --git a/locales/validation/es.json b/locales/validation/es.json index 34a9927..27819fa 100644 --- a/locales/validation/es.json +++ b/locales/validation/es.json @@ -51,6 +51,7 @@ "INVALID_REQUIRED": "El campo es requerido. ", "INVALID_URL": "Debe contener una dirección URL valida. ", "INVALID_TIME": "Debe contener un formato de tiempo valido (hh:mm) ó (hh:mm:ss). ", + "INVALID_REQUIREDSELECTION": "Must choose an option", "AREA1": "Area de texto: Alfanúmerica + Minimo(15) + Requerido", "ERRORS": "Errores", diff --git a/locales/validation/fr.json b/locales/validation/fr.json index dc4d574..a4b2a10 100644 --- a/locales/validation/fr.json +++ b/locales/validation/fr.json @@ -51,6 +51,7 @@ "INVALID_REQUIRED": "Le champ est requis. ", "INVALID_URL": "Doit être un URL valide. ", "INVALID_TIME": "Doit être un format de date valide (hh:mm) OU (hh:mm:ss). ", + "INVALID_REQUIREDSELECTION": "Must choose an option", "AREA1": "TextArea: Alphanumérique + Minimum(15) + Required", "ERRORS": "Erreurs", diff --git a/locales/validation/no.json b/locales/validation/no.json new file mode 100644 index 0000000..b6b245b --- /dev/null +++ b/locales/validation/no.json @@ -0,0 +1,80 @@ +{ + "INVALID_ALPHA": "Kan bare inneholde bokstaver. ", + "INVALID_ALPHA_SPACE": "Kan bare inneholde bokstaver og mellomrom. ", + "INVALID_ALPHA_NUM": "Kan bare inneholde bokstaver og tall. ", + "INVALID_ALPHA_NUM_SPACE": "Kan bare inneholde bokstaver, tall og mellomrom. ", + "INVALID_ALPHA_DASH": "Kan bare inneholde bokstaver, tall og bindestrek. ", + "INVALID_ALPHA_DASH_SPACE": "Kan bare inneholde bokstaver, tall, bindestrek og mellomrom. ", + "INVALID_BETWEEN_CHAR": "Teksten må være mellom :param og :param tegn lang. ", + "INVALID_BETWEEN_NUM": "Det må være en numerisk verdi, mellom :param og :param. ", + "INVALID_BOOLEAN": "Kan bare inneholde en sann eller usann verdi. ", + "INVALID_CREDIT_CARD": "Må være et gyldig kredittkortnummer. ", + "INVALID_DATE_EURO_LONG": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy). ", + "INVALID_DATE_EURO_LONG_BETWEEN": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy) mellom :param and :param. ", + "INVALID_DATE_EURO_LONG_MAX": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy), lik eller før :param. ", + "INVALID_DATE_EURO_LONG_MIN": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy), lik eller etter :param. ", + "INVALID_DATE_EURO_SHORT": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy). ", + "INVALID_DATE_EURO_SHORT_BETWEEN": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy) mellom :param and :param. ", + "INVALID_DATE_EURO_SHORT_MAX": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy), lik eller før :param. ", + "INVALID_DATE_EURO_SHORT_MIN": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy), lik eller etter :param. ", + "INVALID_DATE_ISO": "Må være et gyldig datoformat (yyyy-mm-dd). ", + "INVALID_DATE_ISO_BETWEEN": "Må være et gyldig datoformat (yyyy-mm-dd) mellom :param and :param. ", + "INVALID_DATE_ISO_MAX": "Må være et gyldig datoformat (yyyy-mm-dd), lik eller før :param. ", + "INVALID_DATE_ISO_MIN": "Må være et gyldig datoformat (yyyy-mm-dd), lik eller etter :param. ", + "INVALID_DATE_US_LONG": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy). ", + "INVALID_DATE_US_LONG_BETWEEN": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy) mellom :param and :param. ", + "INVALID_DATE_US_LONG_MAX": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy), lik eller før :param. ", + "INVALID_DATE_US_LONG_MIN": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy), lik eller etter :param. ", + "INVALID_DATE_US_SHORT": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy). ", + "INVALID_DATE_US_SHORT_BETWEEN": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy) between :param and :param. ", + "INVALID_DATE_US_SHORT_MAX": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy), lik eller før :param. ", + "INVALID_DATE_US_SHORT_MIN": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy), lik eller etter :param. ", + "INVALID_EMAIL": "Må være en gyldig epostadresse. ", + "INVALID_EXACT_LEN": "Må være nøyaktig :param tegn lang. ", + "INVALID_FLOAT": "Kan bare inneholde en positiv flyttalsverdi (heltall ekskludert). ", + "INVALID_FLOAT_SIGNED": "Kan bare inneholde en positiv eller negativ flyttalsverdi (heltall ekskludert). ", + "INVALID_IBAN": "Må være en gyldig IBAN. ", + "INVALID_INPUT_MATCH": "Bekreftelsesfeltet er ikke likt spesifisert felt \":param\". ", + "INVALID_INTEGER": "Må være et positivt heltall. ", + "INVALID_INTEGER_SIGNED": "Må være et positivt eller negativt heltall. ", + "INVALID_IPV4": "Må være en gyldig IP-adresse (IPV4). ", + "INVALID_IPV6": "Må være en gyldig IP-adresse (IPV6). ", + "INVALID_IPV6_HEX": "Må være en gyldig IP-adresse (IPV6 Hex). ", + "INVALID_KEY_CHAR": "Ugyldig tastaturoppføring på felt av type \"number\". ", + "INVALID_MAX_CHAR": "Kan ikke være større enn :param characters. ", + "INVALID_MAX_NUM": "Må være en numerisk verdi, lik, eller mindre enn :param. ", + "INVALID_MIN_CHAR": "Må være minst :param tegn. ", + "INVALID_MIN_NUM": "Må være en numerisk verdi, lik, eller større enn :param. ", + "INVALID_NUMERIC": "Må være et positivt tall. ", + "INVALID_NUMERIC_SIGNED": "Må være et positivt eller negativt tall. ", + "INVALID_PATTERN": "Må være på følgende format: :param. ", + "INVALID_REQUIRED": "Feltet er påkrevd. ", + "INVALID_URL": "Må være en gyldig URL. ", + "INVALID_TIME": "Må være et gyldig tidsformat (tt:mm) OR (tt:mm:ss). ", + "INVALID_REQUIREDSELECTION": "Du må velge et alternativ", + + "AREA1": "TextArea: Alfanumerisk + Minimum(15) + Påkrevd", + "ERRORS": "Feil", + "CHANGE_LANGUAGE": "Endre språk.", + "INPUT2": "Positivt eller negativt nummer -- input type=\"number\" -- Feil på ikke-numeriske tegn ", + "INPUT3": "Flyttalssutvalg (heltall ekskludert) -- between_num:x,y eller min_num:x|max_num:y ", + "INPUT4": "Multiple Valideringer + Tilpasset Regex av dato kode (YYWW)", + "INPUT5": "Epost", + "INPUT6": "URL", + "INPUT7": "IP (IPV4)", + "INPUT8": "Kredittkort", + "INPUT9": "Mellom(2,6) Tegn", + "INPUT10": "ISO dato (yyyy-mm-dd)", + "INPUT11": "US LONG dato (mm/dd/yyyy)", + "INPUT12": "Tid (hh:mm eller hh:mm:ss) -- IKKE Påkrevd", + "INPUT13": "AlphaDashSpaces + Påkrevd + Minimum(5) Tegn -- MÅ BRUKE: validation-error-to=\" \"", + "INPUT14": "Alfanumerisk + Påkrevd -- NG-DISABLED", + "INPUT15": "Passord", + "INPUT16": "Passord bekreftelse", + "INPUT17": "Alfanumerisk + Nøyaktig(3) + Påkrevd -- debounce(5sec)", + "INPUT18": "ISO dato (yyyy-mm-dd) -- minimum >= 2001-01-01 ", + "INPUT19": "US SHORT dato (mm/dd/yy) -- mellom 12/01/99 og 12/31/15", + "SAVE": "Lagre", + "SELECT1": "Påkrevd (select) -- validering med (blur) EVENT", + "SHOW_VALIDATION_SUMMARY": "Vis Valideringsoppsummering" +} \ No newline at end of file From f3445b0a7f2eb18e70603118bc5f4fe69c377b3d Mon Sep 17 00:00:00 2001 From: tlastad Date: Tue, 7 Apr 2015 12:25:18 +0200 Subject: [PATCH 3/7] Revert "Translation + new key" This reverts commit 988be73b5f8953171377a114b7bd5d175f5a5a9c. --- locales/validation/en.json | 1 - locales/validation/es.json | 1 - locales/validation/fr.json | 1 - locales/validation/no.json | 80 -------------------------------------- 4 files changed, 83 deletions(-) delete mode 100644 locales/validation/no.json diff --git a/locales/validation/en.json b/locales/validation/en.json index 419ed9e..35c8e10 100644 --- a/locales/validation/en.json +++ b/locales/validation/en.json @@ -51,7 +51,6 @@ "INVALID_REQUIRED": "Field is required. ", "INVALID_URL": "Must be a valid URL. ", "INVALID_TIME": "Must be a valid time format (hh:mm) OR (hh:mm:ss). ", - "INVALID_REQUIREDSELECTION": "Must choose an option", "AREA1": "TextArea: Alphanumeric + Minimum(15) + Required", "ERRORS": "Errors", diff --git a/locales/validation/es.json b/locales/validation/es.json index 27819fa..34a9927 100644 --- a/locales/validation/es.json +++ b/locales/validation/es.json @@ -51,7 +51,6 @@ "INVALID_REQUIRED": "El campo es requerido. ", "INVALID_URL": "Debe contener una dirección URL valida. ", "INVALID_TIME": "Debe contener un formato de tiempo valido (hh:mm) ó (hh:mm:ss). ", - "INVALID_REQUIREDSELECTION": "Must choose an option", "AREA1": "Area de texto: Alfanúmerica + Minimo(15) + Requerido", "ERRORS": "Errores", diff --git a/locales/validation/fr.json b/locales/validation/fr.json index a4b2a10..dc4d574 100644 --- a/locales/validation/fr.json +++ b/locales/validation/fr.json @@ -51,7 +51,6 @@ "INVALID_REQUIRED": "Le champ est requis. ", "INVALID_URL": "Doit être un URL valide. ", "INVALID_TIME": "Doit être un format de date valide (hh:mm) OU (hh:mm:ss). ", - "INVALID_REQUIREDSELECTION": "Must choose an option", "AREA1": "TextArea: Alphanumérique + Minimum(15) + Required", "ERRORS": "Erreurs", diff --git a/locales/validation/no.json b/locales/validation/no.json deleted file mode 100644 index b6b245b..0000000 --- a/locales/validation/no.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "INVALID_ALPHA": "Kan bare inneholde bokstaver. ", - "INVALID_ALPHA_SPACE": "Kan bare inneholde bokstaver og mellomrom. ", - "INVALID_ALPHA_NUM": "Kan bare inneholde bokstaver og tall. ", - "INVALID_ALPHA_NUM_SPACE": "Kan bare inneholde bokstaver, tall og mellomrom. ", - "INVALID_ALPHA_DASH": "Kan bare inneholde bokstaver, tall og bindestrek. ", - "INVALID_ALPHA_DASH_SPACE": "Kan bare inneholde bokstaver, tall, bindestrek og mellomrom. ", - "INVALID_BETWEEN_CHAR": "Teksten må være mellom :param og :param tegn lang. ", - "INVALID_BETWEEN_NUM": "Det må være en numerisk verdi, mellom :param og :param. ", - "INVALID_BOOLEAN": "Kan bare inneholde en sann eller usann verdi. ", - "INVALID_CREDIT_CARD": "Må være et gyldig kredittkortnummer. ", - "INVALID_DATE_EURO_LONG": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy). ", - "INVALID_DATE_EURO_LONG_BETWEEN": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy) mellom :param and :param. ", - "INVALID_DATE_EURO_LONG_MAX": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy), lik eller før :param. ", - "INVALID_DATE_EURO_LONG_MIN": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy), lik eller etter :param. ", - "INVALID_DATE_EURO_SHORT": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy). ", - "INVALID_DATE_EURO_SHORT_BETWEEN": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy) mellom :param and :param. ", - "INVALID_DATE_EURO_SHORT_MAX": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy), lik eller før :param. ", - "INVALID_DATE_EURO_SHORT_MIN": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy), lik eller etter :param. ", - "INVALID_DATE_ISO": "Må være et gyldig datoformat (yyyy-mm-dd). ", - "INVALID_DATE_ISO_BETWEEN": "Må være et gyldig datoformat (yyyy-mm-dd) mellom :param and :param. ", - "INVALID_DATE_ISO_MAX": "Må være et gyldig datoformat (yyyy-mm-dd), lik eller før :param. ", - "INVALID_DATE_ISO_MIN": "Må være et gyldig datoformat (yyyy-mm-dd), lik eller etter :param. ", - "INVALID_DATE_US_LONG": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy). ", - "INVALID_DATE_US_LONG_BETWEEN": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy) mellom :param and :param. ", - "INVALID_DATE_US_LONG_MAX": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy), lik eller før :param. ", - "INVALID_DATE_US_LONG_MIN": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy), lik eller etter :param. ", - "INVALID_DATE_US_SHORT": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy). ", - "INVALID_DATE_US_SHORT_BETWEEN": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy) between :param and :param. ", - "INVALID_DATE_US_SHORT_MAX": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy), lik eller før :param. ", - "INVALID_DATE_US_SHORT_MIN": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy), lik eller etter :param. ", - "INVALID_EMAIL": "Må være en gyldig epostadresse. ", - "INVALID_EXACT_LEN": "Må være nøyaktig :param tegn lang. ", - "INVALID_FLOAT": "Kan bare inneholde en positiv flyttalsverdi (heltall ekskludert). ", - "INVALID_FLOAT_SIGNED": "Kan bare inneholde en positiv eller negativ flyttalsverdi (heltall ekskludert). ", - "INVALID_IBAN": "Må være en gyldig IBAN. ", - "INVALID_INPUT_MATCH": "Bekreftelsesfeltet er ikke likt spesifisert felt \":param\". ", - "INVALID_INTEGER": "Må være et positivt heltall. ", - "INVALID_INTEGER_SIGNED": "Må være et positivt eller negativt heltall. ", - "INVALID_IPV4": "Må være en gyldig IP-adresse (IPV4). ", - "INVALID_IPV6": "Må være en gyldig IP-adresse (IPV6). ", - "INVALID_IPV6_HEX": "Må være en gyldig IP-adresse (IPV6 Hex). ", - "INVALID_KEY_CHAR": "Ugyldig tastaturoppføring på felt av type \"number\". ", - "INVALID_MAX_CHAR": "Kan ikke være større enn :param characters. ", - "INVALID_MAX_NUM": "Må være en numerisk verdi, lik, eller mindre enn :param. ", - "INVALID_MIN_CHAR": "Må være minst :param tegn. ", - "INVALID_MIN_NUM": "Må være en numerisk verdi, lik, eller større enn :param. ", - "INVALID_NUMERIC": "Må være et positivt tall. ", - "INVALID_NUMERIC_SIGNED": "Må være et positivt eller negativt tall. ", - "INVALID_PATTERN": "Må være på følgende format: :param. ", - "INVALID_REQUIRED": "Feltet er påkrevd. ", - "INVALID_URL": "Må være en gyldig URL. ", - "INVALID_TIME": "Må være et gyldig tidsformat (tt:mm) OR (tt:mm:ss). ", - "INVALID_REQUIREDSELECTION": "Du må velge et alternativ", - - "AREA1": "TextArea: Alfanumerisk + Minimum(15) + Påkrevd", - "ERRORS": "Feil", - "CHANGE_LANGUAGE": "Endre språk.", - "INPUT2": "Positivt eller negativt nummer -- input type=\"number\" -- Feil på ikke-numeriske tegn ", - "INPUT3": "Flyttalssutvalg (heltall ekskludert) -- between_num:x,y eller min_num:x|max_num:y ", - "INPUT4": "Multiple Valideringer + Tilpasset Regex av dato kode (YYWW)", - "INPUT5": "Epost", - "INPUT6": "URL", - "INPUT7": "IP (IPV4)", - "INPUT8": "Kredittkort", - "INPUT9": "Mellom(2,6) Tegn", - "INPUT10": "ISO dato (yyyy-mm-dd)", - "INPUT11": "US LONG dato (mm/dd/yyyy)", - "INPUT12": "Tid (hh:mm eller hh:mm:ss) -- IKKE Påkrevd", - "INPUT13": "AlphaDashSpaces + Påkrevd + Minimum(5) Tegn -- MÅ BRUKE: validation-error-to=\" \"", - "INPUT14": "Alfanumerisk + Påkrevd -- NG-DISABLED", - "INPUT15": "Passord", - "INPUT16": "Passord bekreftelse", - "INPUT17": "Alfanumerisk + Nøyaktig(3) + Påkrevd -- debounce(5sec)", - "INPUT18": "ISO dato (yyyy-mm-dd) -- minimum >= 2001-01-01 ", - "INPUT19": "US SHORT dato (mm/dd/yy) -- mellom 12/01/99 og 12/31/15", - "SAVE": "Lagre", - "SELECT1": "Påkrevd (select) -- validering med (blur) EVENT", - "SHOW_VALIDATION_SUMMARY": "Vis Valideringsoppsummering" -} \ No newline at end of file From 916326c084242a1f7f038baa9c5ec193fae86f6d Mon Sep 17 00:00:00 2001 From: tlastad Date: Tue, 7 Apr 2015 12:25:24 +0200 Subject: [PATCH 4/7] Revert "temp commit to own repository" This reverts commit 32cc8a053146d42875ac60eb04c35669a3302bb3. --- src/validation-common.js | 13 +++++-------- src/validation-rules.js | 7 ------- src/validation-service.js | 20 +++++++------------- 3 files changed, 12 insertions(+), 28 deletions(-) diff --git a/src/validation-common.js b/src/validation-common.js index eacbba7..8877b3d 100644 --- a/src/validation-common.js +++ b/src/validation-common.js @@ -53,10 +53,7 @@ angular //---- // Public functions declaration //---------------------------------- - - function isValidationRequired(validations) { - return validations.indexOf("required") >= 0 || validations.indexOf("requiredselection") >= 0; - } + function defineValidation() { var self = this; var customUserRegEx = {}; @@ -94,7 +91,8 @@ angular var validations = rules.split('|'); if(validations) { - self.bFieldRequired = isValidationRequired(validations) ? true : false; + self.bFieldRequired = (validations.indexOf("required") >= 0) ? true : false; + // loop through all validators of the element for(var i = 0, ln = validations.length; i < ln; i++) { var params = validations[i].split(':'); // params[0] is the rule, [1] is the rule extra params @@ -127,8 +125,7 @@ angular * @param string message: error message to display */ function updateErrorMsg(message, attrs) { - // attrs.obj if set should be a commonObj - var self = (!!attrs && attrs.obj) ? attrs.obj : this; + var self = this; // element name could be defined in the `attrs` or in the self object var elm = (!!attrs && attrs.elm) ? attrs.elm : self.elm; @@ -300,7 +297,7 @@ angular if(index >= 0 && message === '') { validationSummary.splice(index, 1); }else if(message !== '') { - var errorObj = { field: elmName, message: message, obj: self}; + var errorObj = { field: elmName, message: message }; // if error already exist then refresh the error object inside the array, else push it to the array if(index >= 0) { diff --git a/src/validation-rules.js b/src/validation-rules.js index b1cd304..c13826d 100644 --- a/src/validation-rules.js +++ b/src/validation-rules.js @@ -538,13 +538,6 @@ angular type: "regex" }; break; - case "requiredselection": - validator = { - pattern: "\\S+", - message: "INVALID_REQUIREDSELECTION", - type: "regex" - }; - break; } // switch() return validator; diff --git a/src/validation-service.js b/src/validation-service.js index 6f2deb4..4b1511a 100644 --- a/src/validation-service.js +++ b/src/validation-service.js @@ -27,7 +27,6 @@ angular validationService.prototype.addValidator = addValidator; validationService.prototype.checkFormValidity = checkFormValidity; validationService.prototype.removeValidator = removeValidator; - validationService.prototype.clearValidationSummary = clearValidationSummary; validationService.prototype.setGlobalOptions = setGlobalOptions; return validationService; @@ -74,7 +73,7 @@ angular attrs = mergeObjects(self.validationAttrs, attrs); // watch the element for any value change, validate it once that happen - attrs.scope.$watch(attrs.elmName, function (newVal, oldVal) { + attrs.scope.$watch(attrs.elmName, function (newVal, oldVal) { if(newVal === undefined && oldVal !== undefined) { self.commonObj.updateErrorMsg("INVALID_KEY_CHAR", {valid: false, translate: true}); return; @@ -85,17 +84,11 @@ angular self.commonObj.initialize(attrs.scope, attrs.elm, attrs, attrs.ctrl); attemptToValidate(self, newVal); - }, true); // $watch() + }, true); // $watch() return self; - } // addValidator() + } // addValidator() - function clearValidationSummary(obj) { - if (typeof obj === "undefined" || typeof obj.$validationSummary === "undefined") { - throw 'checkFormValidity() requires a valid Angular Form or $scope object passed as argument to function properly (ex.: $scope.form1 OR $scope).'; - } - obj.$validationSummary = []; - } /** Is the Form all valid? Loop through Validation Summary to get the answer, if any errors are there then display them and return false * @param object Angular Form or Scope Object * @return bool isFormValid @@ -110,12 +103,13 @@ angular // loop through $validationSummary and display errors when found on each field for(var i = 0, ln = obj.$validationSummary.length; i < ln; i++) { isValid = false; - elm = obj.$validationSummary[i].obj.elm; - ctrl = obj.$validationSummary[i].obj.ctrl; + elmName = obj.$validationSummary[i].field; + elm = angular.element(document.querySelector('[name="'+elmName+'"]:not([disabled]):not([ng-disabled]')); + ctrl = angular.element(elm).controller('ngModel'); if(!!elm && elm.length > 0) { ctrl.$setTouched(); // make the element as it was touched for CSS - self.commonObj.updateErrorMsg(obj.$validationSummary[i].message, { valid: false, obj: obj.$validationSummary[i].obj, submitted: true }); + self.commonObj.updateErrorMsg(obj.$validationSummary[i].message, {valid: false, elm: elm, submitted: true}); } } return isValid; From 580d199bd66c38f927ff508c6901996b8ec02daa Mon Sep 17 00:00:00 2001 From: tlastad Date: Tue, 7 Apr 2015 12:56:03 +0200 Subject: [PATCH 5/7] Norwegian translation Added norwegian language translation --- locales/validation/no.json | 79 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 locales/validation/no.json diff --git a/locales/validation/no.json b/locales/validation/no.json new file mode 100644 index 0000000..82d004e --- /dev/null +++ b/locales/validation/no.json @@ -0,0 +1,79 @@ +{ + "INVALID_ALPHA": "Kan bare inneholde bokstaver. ", + "INVALID_ALPHA_SPACE": "Kan bare inneholde bokstaver og mellomrom. ", + "INVALID_ALPHA_NUM": "Kan bare inneholde bokstaver og tall. ", + "INVALID_ALPHA_NUM_SPACE": "Kan bare inneholde bokstaver, tall og mellomrom. ", + "INVALID_ALPHA_DASH": "Kan bare inneholde bokstaver, tall og bindestrek. ", + "INVALID_ALPHA_DASH_SPACE": "Kan bare inneholde bokstaver, tall, bindestrek og mellomrom. ", + "INVALID_BETWEEN_CHAR": "Teksten må være mellom :param og :param tegn lang. ", + "INVALID_BETWEEN_NUM": "Det må være en numerisk verdi, mellom :param og :param. ", + "INVALID_BOOLEAN": "Kan bare inneholde en sann eller usann verdi. ", + "INVALID_CREDIT_CARD": "Må være et gyldig kredittkortnummer. ", + "INVALID_DATE_EURO_LONG": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy). ", + "INVALID_DATE_EURO_LONG_BETWEEN": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy) mellom :param and :param. ", + "INVALID_DATE_EURO_LONG_MAX": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy), lik eller før :param. ", + "INVALID_DATE_EURO_LONG_MIN": "Må være et gyldig datoformat (dd-mm-yyyy) eller (dd/mm/yyyy), lik eller etter :param. ", + "INVALID_DATE_EURO_SHORT": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy). ", + "INVALID_DATE_EURO_SHORT_BETWEEN": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy) mellom :param and :param. ", + "INVALID_DATE_EURO_SHORT_MAX": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy), lik eller før :param. ", + "INVALID_DATE_EURO_SHORT_MIN": "Må være et gyldig datoformat (dd-mm-yy) eller (dd/mm/yy), lik eller etter :param. ", + "INVALID_DATE_ISO": "Må være et gyldig datoformat (yyyy-mm-dd). ", + "INVALID_DATE_ISO_BETWEEN": "Må være et gyldig datoformat (yyyy-mm-dd) mellom :param and :param. ", + "INVALID_DATE_ISO_MAX": "Må være et gyldig datoformat (yyyy-mm-dd), lik eller før :param. ", + "INVALID_DATE_ISO_MIN": "Må være et gyldig datoformat (yyyy-mm-dd), lik eller etter :param. ", + "INVALID_DATE_US_LONG": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy). ", + "INVALID_DATE_US_LONG_BETWEEN": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy) mellom :param and :param. ", + "INVALID_DATE_US_LONG_MAX": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy), lik eller før :param. ", + "INVALID_DATE_US_LONG_MIN": "Må være et gyldig datoformat (mm/dd/yyyy) eller (mm-dd-yyyy), lik eller etter :param. ", + "INVALID_DATE_US_SHORT": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy). ", + "INVALID_DATE_US_SHORT_BETWEEN": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy) between :param and :param. ", + "INVALID_DATE_US_SHORT_MAX": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy), lik eller før :param. ", + "INVALID_DATE_US_SHORT_MIN": "Må være et gyldig datoformat (mm/dd/yy) eller (mm-dd-yy), lik eller etter :param. ", + "INVALID_EMAIL": "Må være en gyldig epostadresse. ", + "INVALID_EXACT_LEN": "Må være nøyaktig :param tegn lang. ", + "INVALID_FLOAT": "Kan bare inneholde en positiv flyttalsverdi (heltall ekskludert). ", + "INVALID_FLOAT_SIGNED": "Kan bare inneholde en positiv eller negativ flyttalsverdi (heltall ekskludert). ", + "INVALID_IBAN": "Må være en gyldig IBAN. ", + "INVALID_INPUT_MATCH": "Bekreftelsesfeltet er ikke likt spesifisert felt \":param\". ", + "INVALID_INTEGER": "Må være et positivt heltall. ", + "INVALID_INTEGER_SIGNED": "Må være et positivt eller negativt heltall. ", + "INVALID_IPV4": "Må være en gyldig IP-adresse (IPV4). ", + "INVALID_IPV6": "Må være en gyldig IP-adresse (IPV6). ", + "INVALID_IPV6_HEX": "Må være en gyldig IP-adresse (IPV6 Hex). ", + "INVALID_KEY_CHAR": "Ugyldig tastaturoppføring på felt av type \"number\". ", + "INVALID_MAX_CHAR": "Kan ikke være større enn :param characters. ", + "INVALID_MAX_NUM": "Må være en numerisk verdi, lik, eller mindre enn :param. ", + "INVALID_MIN_CHAR": "Må være minst :param tegn. ", + "INVALID_MIN_NUM": "Må være en numerisk verdi, lik, eller større enn :param. ", + "INVALID_NUMERIC": "Må være et positivt tall. ", + "INVALID_NUMERIC_SIGNED": "Må være et positivt eller negativt tall. ", + "INVALID_PATTERN": "Må være på følgende format: :param. ", + "INVALID_REQUIRED": "Feltet er påkrevd. ", + "INVALID_URL": "Må være en gyldig URL. ", + "INVALID_TIME": "Må være et gyldig tidsformat (tt:mm) OR (tt:mm:ss). ", + + "AREA1": "TextArea: Alfanumerisk + Minimum(15) + Påkrevd", + "ERRORS": "Feil", + "CHANGE_LANGUAGE": "Endre språk.", + "INPUT2": "Positivt eller negativt nummer -- input type=\"number\" -- Feil på ikke-numeriske tegn ", + "INPUT3": "Flyttalssutvalg (heltall ekskludert) -- between_num:x,y eller min_num:x|max_num:y ", + "INPUT4": "Multiple Valideringer + Tilpasset Regex av dato kode (YYWW)", + "INPUT5": "Epost", + "INPUT6": "URL", + "INPUT7": "IP (IPV4)", + "INPUT8": "Kredittkort", + "INPUT9": "Mellom(2,6) Tegn", + "INPUT10": "ISO dato (yyyy-mm-dd)", + "INPUT11": "US LONG dato (mm/dd/yyyy)", + "INPUT12": "Tid (hh:mm eller hh:mm:ss) -- IKKE Påkrevd", + "INPUT13": "AlphaDashSpaces + Påkrevd + Minimum(5) Tegn -- MÅ BRUKE: validation-error-to=\" \"", + "INPUT14": "Alfanumerisk + Påkrevd -- NG-DISABLED", + "INPUT15": "Passord", + "INPUT16": "Passord bekreftelse", + "INPUT17": "Alfanumerisk + Nøyaktig(3) + Påkrevd -- debounce(5sec)", + "INPUT18": "ISO dato (yyyy-mm-dd) -- minimum >= 2001-01-01 ", + "INPUT19": "US SHORT dato (mm/dd/yy) -- mellom 12/01/99 og 12/31/15", + "SAVE": "Lagre", + "SELECT1": "Påkrevd (select) -- validering med (blur) EVENT", + "SHOW_VALIDATION_SUMMARY": "Vis Valideringsoppsummering" +} \ No newline at end of file From b1446eb070793b178bc71df187b9f42db1907181 Mon Sep 17 00:00:00 2001 From: tlastad Date: Tue, 7 Apr 2015 13:32:13 +0200 Subject: [PATCH 6/7] Fixes for removing invalid validation re. wizard Fixes for removing invalid validation re. wizard --- src/validation-common.js | 21 ++++++++++++++++++--- src/validation-service.js | 27 ++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/validation-common.js b/src/validation-common.js index 3842110..cb35aa7 100644 --- a/src/validation-common.js +++ b/src/validation-common.js @@ -56,7 +56,7 @@ angular validationCommon.prototype.removeFromValidationSummary = removeFromValidationSummary; // remove an element from the $validationSummary validationCommon.prototype.updateErrorMsg = updateErrorMsg; // update on screen an error message below current form element validationCommon.prototype.validate = validate; // validate current element - + validationCommon.prototype.removeFromFormElementObjectList = removeFromFormElementObjectList; // remove named items from formElements list // return the service object return validationCommon; @@ -180,8 +180,13 @@ angular * @param object attributes */ function updateErrorMsg(message, attrs) { - // attrs.obj if set should be a commonObj - var self = (!!attrs && attrs.obj) ? attrs.obj : this; + var self = this; + // attrs.obj if set, should be a commonObj, and can be self. + // In addition we need to set validatorAttrs, as they are defined as attrs on obj. + if (!!attrs && attrs.obj) { + self = attrs.obj; + self.validatorAttrs = attrs.obj.attrs; + } // element name could be defined in the `attrs` or in the self object var elm = (!!attrs && attrs.elm) ? attrs.elm : self.elm; @@ -371,6 +376,16 @@ angular return formElements; } + /** Remove objects from FormElement list. + * @param elementName to remove + */ + function removeFromFormElementObjectList(elmName) { + var index = arrayFindObjectIndex(formElements, 'fieldName', elmName); // find index of object in our array + if (index >= 0) { + formElements.splice(index, 1); + } + } + /** Add the error to the validation summary * @param object self * @param string message: error message diff --git a/src/validation-service.js b/src/validation-service.js index 87f4bf9..45ed6f4 100644 --- a/src/validation-service.js +++ b/src/validation-service.js @@ -28,7 +28,8 @@ angular validationService.prototype.checkFormValidity = checkFormValidity; // check the form validity (can be called by an empty validationService and used by both Directive/Service) validationService.prototype.removeValidator = removeValidator; // remove a Validator from an element validationService.prototype.setGlobalOptions = setGlobalOptions; // set and initialize global options used by all validators - + validationService.prototype.clearInvalidValidatorsInSummary = clearInvalidValidatorsInSummary; // clear clearInvalidValidatorsInSummary + return validationService; //---- @@ -91,6 +92,30 @@ angular return self; } // addValidator() + /** Remove all objects in validationsummary and matching objects in FormElementList. + * This is for use in a wizard type setting, where you 'move back' to a previous page in wizard. + * In this case you need to remove invalid validators that will exist in 'the future'. + * @param object Angular Form or Scope Object + */ + function clearInvalidValidatorsInSummary(obj) { + var self = this; + if (typeof obj === "undefined" || typeof obj.$validationSummary === "undefined") { + throw 'checkFormValidity() requires a valid Angular Form or $scope object passed as argument to function properly (ex.: $scope.form1 OR $scope).'; + } + // Get list of names to remove + var elmName = []; + for (var i = 0, ln = obj.$validationSummary.length; i < ln; i++) { + elmName.push(obj.$validationSummary[i].field); + } + // Loop on list of names. Cannot loop on obj.$validationSummary as you are removing objects from it in the loop. + for (i = 0, ln = elmName.length; i < ln; i++) { + if (!!elmName[i]) { + self.commonObj.removeFromFormElementObjectList(elmName[i]); + self.commonObj.removeFromValidationSummary(obj.$validationSummary, elmName[i]); + } + } + } + /** Check the form validity (can be called by an empty validationService and used by both Directive/Service) * Loop through Validation Summary and if any errors found then display them and return false on current function * @param object Angular Form or Scope Object From feae09c1cf1ca2f61aa6f71c3ebfc8ebd0083dc5 Mon Sep 17 00:00:00 2001 From: tlastad Date: Tue, 7 Apr 2015 14:39:09 +0200 Subject: [PATCH 7/7] fixed issue with mistyped validationErrorTo If validationError has been mistyped, the code will not find requested element. It will then just append a new element as is standard functionality. But it will never try to find the added element if it revalidates, and add a new message for each validation. This should fix that problem --- src/validation-common.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/validation-common.js b/src/validation-common.js index cb35aa7..ebd7f54 100644 --- a/src/validation-common.js +++ b/src/validation-common.js @@ -210,7 +210,11 @@ angular var firstChar = self.validatorAttrs.validationErrorTo.charAt(0); var selector = (firstChar === '.' || firstChar === '#') ? self.validatorAttrs.validationErrorTo : '#'+self.validatorAttrs.validationErrorTo; errorElm = angular.element(document.querySelector(selector)); - }else { + } + // errorElm can be empty due to: + // 1. validationErrorTo has not been set + // 2. validationErrorTo has been mistyped, and if mistyped, use regular functionality + if(!errorElm || errorElm.length === 0){ // most common way, let's try to find our errorElm = angular.element(document.querySelector('.validation-'+elmInputName)); }