From 72e86bbd1eb187ab07ae48cf46333f1a18df82c4 Mon Sep 17 00:00:00 2001 From: Michiel Trimpe Date: Mon, 3 Jun 2013 22:58:03 +0200 Subject: [PATCH] Changing repetitive code to a micro-DSL approach to reduce library size. Just a PoC; has bugs; will break build. --- src/jqBootstrapValidation.js | 140 +++++++++++------------------------ 1 file changed, 44 insertions(+), 96 deletions(-) diff --git a/src/jqBootstrapValidation.js b/src/jqBootstrapValidation.js index ed8b5a8..14cb146 100644 --- a/src/jqBootstrapValidation.js +++ b/src/jqBootstrapValidation.js @@ -111,70 +111,42 @@ if ($this.data("validationPatternPattern")) { $this.attr("pattern", $this.data("validationPatternPattern")); } - if ($this.attr("pattern") !== undefined) { - message = "Not in the expected format"; - if ($this.data("validationPatternMessage")) { - message = $this.data("validationPatternMessage"); - } - $this.data("validationPatternMessage", message); - $this.data("validationPatternRegex", $this.attr("pattern")); - } - // --------------------------------------------------------- - // MAX - // --------------------------------------------------------- - if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) { - var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax")); - message = "Too high: Maximum of '" + max + "'"; - if ($this.data("validationMaxMessage")) { - message = $this.data("validationMaxMessage"); - } - $this.data("validationMaxMessage", message); - $this.data("validationMaxMax", max); - } - // --------------------------------------------------------- - // MIN - // --------------------------------------------------------- - if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) { - var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin")); - message = "Too low: Minimum of '" + min + "'"; - if ($this.data("validationMinMessage")) { - message = $this.data("validationMinMessage"); - } - $this.data("validationMinMessage", message); - $this.data("validationMinMin", min); - } // --------------------------------------------------------- - // MAXLENGTH + // BASICS // --------------------------------------------------------- - if ($this.attr("maxlength") !== undefined) { - message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters"; - if ($this.data("validationMaxlengthMessage")) { - message = $this.data("validationMaxlengthMessage"); - } - $this.data("validationMaxlengthMessage", message); - $this.data("validationMaxlengthMaxlength", $this.attr("maxlength")); - } - // --------------------------------------------------------- - // MINLENGTH - // --------------------------------------------------------- - if ($this.attr("minlength") !== undefined) { - message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters"; - if ($this.data("validationMinlengthMessage")) { - message = $this.data("validationMinlengthMessage"); - } - $this.data("validationMinlengthMessage", message); - $this.data("validationMinlengthMinlength", $this.attr("minlength")); - } - // --------------------------------------------------------- - // REQUIRED - // --------------------------------------------------------- - if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) { - message = settings.builtInValidators.required.message; - if ($this.data("validationRequiredMessage")) { - message = $this.data("validationRequiredMessage"); + $.each( + { + "pattern": { + into: "regex", + message: "Not in the expected format" + }, + "max": { + match: ["max", "aria-valuemax"], + message: "Too high: Maximum of '%'" + }, + "min": { + match: ["min", "aria-valuemin"], + message: "Too low: Minimum of '%'" + }, + "maxlength": "Too long: Maximum of '%' characters", + "minlength": "Too short: Minimum of '%' characters", + "required": settings.builtInValidators.required.message + }, + function(validator, definition) { + if ( ! $.isPlainObject(definition) ) + definition = { "message": definition } ; + var attributes = definition.match ? definition.match : [ validator ] ; + var matched = $.filter(attributes, function(name) { return this.attr(name) !== undefined}); + if (!$.isEmpty(matched)) { + var value = $this.attr(matched[0]); + var message = definition.message.replace("\\%", value); + var msgKey = "validation-" + validator + "-message"; + if (!$this.data(msgKey)) + $this.data(msgKey, definition.message + ""); + $this.data("validation-" + validator + "-" + (definition.into || validator), value); + } } - $this.data("validationRequiredMessage", message); - } + ); // --------------------------------------------------------- // NUMBER // --------------------------------------------------------- @@ -402,41 +374,17 @@ // STORE FALLBACK VALUES // ============================================================= - $helpBlock.data( - "original-contents", - ( - $helpBlock.data("original-contents") ? - $helpBlock.data("original-contents") : - $helpBlock.html() - ) - ); - - $helpBlock.data( - "original-role", - ( - $helpBlock.data("original-role") ? - $helpBlock.data("original-role") : - $helpBlock.attr("role") - ) - ); - - $controlGroup.data( - "original-classes", - ( - $controlGroup.data("original-clases") ? - $controlGroup.data("original-classes") : - $controlGroup.attr("class") - ) - ); - - $this.data( - "original-aria-invalid", - ( - $this.data("original-aria-invalid") ? - $this.data("original-aria-invalid") : - $this.attr("aria-invalid") - ) - ); + $.each({ + "original-contents": { el: $helpBlock, attr: function(el) { return el.html() } }, + "original-role": { el: $helpBlock, attr: "role" }, + "original-classes": { el: $controlGroup, attr: "class" }, + "original-aria-invalid": { el: $this, attr: "aria-invalid" } + }, function(key, def) { + var original = $helpBlock.data(key); + if (! original) { + $helpBlock.data(key, $.isFunction(def.attr) ? def.attr(def.el) : def.el.attr(def.attr)); + } + }); // ============================================================= // VALIDATION