/* * Copyright (C) 2015 "IoT.bzh" * Author "Fulup Ar Foll" * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details.. */ (function() { 'use strict'; var tmpl = '' + ''+ '{{errmsg}}'; var emailpatern = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; angular.module('InputText',['JQueryEmu']) .directive('inputText', function(JQemu) { function mymethods(scope, elem, attrs) { // default value at 1st rendering scope.error = false; scope.valid = false; scope.status = 'untouch'; scope.input = elem.find ("input"); scope.required = 0; // requirer is use to increment requested counter if ("required" in attrs) { scope.required = 1; elem.addClass ("required"); } // user enter input reset error status scope.selected = function () { scope.error=false; scope.errmsg=false; scope.status = 'touch'; }; scope.validate = function () { // get value from input field bypassing Angular ng-model console.log ("Clicked InputText name=%s value=%s valid=%s", scope.name, scope.value, scope.valid); // form is not untouched anymore scope.parent.removeClass ("ng-pristine"); // if value not null clean up string if (scope.value) { scope.error=false; // remove leading and trailling space scope.value = scope.value.trim(); // remove any space is not allowed if ('nospace' in attrs) { scope.value=scope.value.replace(/\s/g, ''); } if ('lowercase' in attrs) { scope.value = scope.value.toLowerCase(); } // check minimum lenght if ("minlen" in attrs) { if (scope.value.length < attrs.minlen) { scope.status='invalid'; scope.errmsg=scope.name + ': Mininum Lengh= ' + attrs.minlen + ' Characters'; scope.error=true; } } if ('email' in attrs) { if (!emailpatern.test (scope.value)) { scope.status='invalid'; scope.errmsg='invalid email address'; scope.error=true; } } } else { if (scope.required) { scope.status='invalid'; scope.errmsg=scope.name + ': Required Attribute'; scope.error=true; } } // If local control fail let's refuse input if (scope.error) { if (scope.required && scope.valid) { scope.valid = false; if (scope.l4acounter.validated > 0) scope.l4acounter.validated --; } // use call to update form scope on form completeness scope.callback (attrs.name, null, scope.done); } else { // localcheck is OK backup may nevertheless change status to false if (scope.required && !scope.valid) scope.l4acounter.validated ++; scope.status='valid'; scope.valid=true; scope.callback (attrs.name, scope.value, scope.done); } }; // this method can be called from controller to update widget status scope.done=function (data) { console.log ("Text-Input Callback ID="+ attrs.name + " data=", data); for (var i in data) scope[i] = data[i]; }; // Export some attributes within directive scope for template scope.label = attrs.label; scope.name = attrs.name; scope.placeholder = attrs.placeholder; scope.type = attrs.type || "text"; scope.tip = attrs.tip; // search for form within parent elemnts scope.parent = JQemu.parent (elem, "FORM"); // email enforce lowercase and nospace if ("email" in attrs) { attrs.lowercase=true; attrs.nospace=true; attrs.minlen=6; } if (scope.required) { scope.l4acounter = scope.parent.data ("l4acounter"); if (!scope.l4acounter) { scope.l4acounter = {required:1, validated:0}; console.log("Field "+scope.name+" is required (1st)"); scope.parent.data ("l4acounter", scope.l4acounter); } else { console.log("Field "+scope.name+" is required"); scope.l4acounter.required ++; } } // refresh validation each time controler update value scope.$watch ('value', function(){ if(scope.value) scope.validate(); } ); } return { restrict: 'E', template: tmpl, link: mymethods, scope: { callback : '=', value: '=' } }; }); console.log ("InputText Loaded"); })();