Socket
Socket
Sign inDemoInstall

angular-dynamic-number

Package Overview
Dependencies
Maintainers
1
Versions
43
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

angular-dynamic-number - npm Package Compare versions

Comparing version 1.8.1 to 1.9.0

2

bower.json
{
"name": "angular-dynamic-number",
"version": "1.8.1",
"version": "1.9.0",
"homepage": "https://github.com/uhlryk/angular-dynamic-number",

@@ -5,0 +5,0 @@ "authors": [

{
"name": "angular-dynamic-number",
"version": "1.8.1",
"version": "1.9.0",
"description": "Highly customizable angular directive for numbers",

@@ -5,0 +5,0 @@ "keywords": [

@@ -21,2 +21,4 @@ # Angular Dynamic Number

It even allow to dynamically change directive properties. Just set them as models.
It is also React version available [React Dynamic Number](https://github.com/uhlryk/react-dynamic-number)

@@ -39,2 +41,3 @@

- allow add currency (single character)
- allow to dynamically change directive properties

@@ -119,2 +122,21 @@ ## Limitations:

## Dynamic properties
Some of properties of directive can be a models. And change in models change properties in directive. For example you can change currency, decimal separator etc.
Demo page has example of usage dynamic properties.
In short separator, integer, fraction, thousand, append are models
<input type='text' class="form-control"
ng-model='value'
awnum
num-sep="{{separator}}"
num-int="{{integer}}"
num-fract="{{fraction}}"
num-thousand="{{thousand}}"
num-append="{{append}}"
>
Changes of some properties reset value in input (num-int, num-fract). Others properties after changes recreate value in input.
## Custom strategies

@@ -121,0 +143,0 @@

@@ -187,3 +187,13 @@ /*jslint node: true */

}
function filterModelValue(value, fractionPart, fractionSeparator, roundFunction, numFixed, isThousandSeparator, thousandSeparator, prepend, append){
function filterModelValue(
value,
fractionPart,
fractionSeparator,
roundFunction,
numFixed,
isThousandSeparator,
thousandSeparator,
prepend,
append
){
if(value === '' || value === undefined || value === null) {

@@ -259,2 +269,169 @@ return '';

}
function createPropertyObject(scope, key, value) {
var properties = {
awnum: scope.awnum,
numInt: scope.numInt,
numFract: scope.numFract,
numSep: scope.numSep,
numPos: scope.numPos,
numNeg: scope.numNeg,
numRound: scope.numRound,
numThousand: scope.numThousand,
numThousandSep: scope.numThousandSep,
numPrepend: scope.numPrepend,
numAppend: scope.numAppend
};
if(key) {
properties[key] = value;
}
return properties;
}
function initAllProperties(properties, element, attrs, ngModelController, dynamicNumberStrategy){
var strategy = {};
if(properties.awnum) {
strategy = dynamicNumberStrategy.getStrategy(properties.awnum);
}
var integerPart = initIntegerPart(properties.numInt !== undefined ? properties.numInt : strategy.numInt, 6);
var fractionPart = initFractionPart(properties.numFract !== undefined ? properties.numFract : strategy.numFract, 2);
var fractionSeparator = initSeparator(properties.numSep !== undefined ? properties.numSep : strategy.numSep, '.');
var isPositiveNumber = initIsPositive(properties.numPos !== undefined ? properties.numPos : strategy.numPos, true);
var isNegativeNumber = initIsNegative(properties.numNeg !== undefined ? properties.numNeg : strategy.numNeg, true);
var roundFunction = initRound(properties.numRound !== undefined ? properties.numRound : strategy.numRound, Math.round);
var isThousandSeparator = initIsThousand(properties.numThousand !== undefined ? properties.numThousand : strategy.numThousand, false);
var thousandSeparator = initThousandSeparator(properties.numThousandSep !== undefined ? properties.numThousandSep : strategy.numThousandSep, fractionSeparator, fractionSeparator==='.'?',':'.');
var prepend = initNumAppendPrepend(properties.numPrepend !== undefined ? properties.numPrepend : strategy.numPrepend);
var append = initNumAppendPrepend(properties.numAppend !== undefined ? properties.numAppend : strategy.numAppend);
if(isPositiveNumber === false && isNegativeNumber === false) {
throw new Error('Number is set to not be positive and not be negative. Change num_pos attr or/and num_neg attr to true');
}
var viewRegexTest = buildRegexp(integerPart, fractionPart, fractionSeparator, isPositiveNumber, isNegativeNumber);
return {
element: element,
attrs: attrs,
ngModelController: ngModelController,
viewRegexTest: viewRegexTest,
integerPart: integerPart,
fractionPart: fractionPart,
fractionSeparator: fractionSeparator,
isPositiveNumber: isPositiveNumber,
isNegativeNumber: isNegativeNumber,
roundFunction: roundFunction,
isThousandSeparator: isThousandSeparator,
thousandSeparator: thousandSeparator,
prepend: prepend,
append: append
}
}
function directiveParser(value, parameters) {
var element = parameters.element;
var attrs = parameters.attrs;
var ngModelController = parameters.ngModelController;
var viewRegexTest = parameters.viewRegexTest;
var integerPart = parameters.integerPart;
var fractionPart = parameters.fractionPart;
var fractionSeparator = parameters.fractionSeparator;
var isPositiveNumber = parameters.isPositiveNumber;
var isNegativeNumber = parameters.isNegativeNumber;
var roundFunction = parameters.roundFunction;
var isThousandSeparator = parameters.isThousandSeparator;
var thousandSeparator = parameters.thousandSeparator;
var prepend = parameters.prepend;
var append = parameters.append;
var parsedValue = String(value);
parsedValue = removePrependAppendChars(parsedValue, prepend, append);
if(new RegExp('^[\.,'+thousandSeparator+']{2,}').test(parsedValue)) {
changeViewValue(ngModelController, 0, prepend, append);
return 0;
}
var cursorPosition = getCaretPosition(element[0]);
if(prepend) {
cursorPosition--;
}
var valBeforeCursor = parsedValue.slice(0,cursorPosition);
valBeforeCursor = removeThousandSeparators(valBeforeCursor, thousandSeparator);
parsedValue = removeThousandSeparators(parsedValue, thousandSeparator);
valBeforeCursor = removeLeadingZero(valBeforeCursor);
parsedValue = removeLeadingZero(parsedValue);
if(parsedValue === '' && String(value).charAt(0)=== '0'){
changeViewValue(ngModelController, 0, prepend, append);
return 0;
}
if(parsedValue === undefined || parsedValue === ''){
return 0;
}
if(parsedValue === '-'){
changeViewValue(ngModelController, '-', prepend, append);
return 0;
}
/**
* view value failed 'correct view format' test
* therefore view value is set from last correct model value (it must be formatted - change dot to comma)
*/
if(viewRegexTest.test(parsedValue) === false){
var modelValue = convModelToView(ngModelController.$modelValue, fractionSeparator, prepend, append);
if(isThousandSeparator){
modelValue = addThousandSeparator(modelValue, thousandSeparator);
}
changeViewValue(ngModelController, modelValue, prepend, append);
setCaretPosition(element[0],cursorPosition-1);
return ngModelController.$modelValue;
}
/**
* view value success 'correct view format' test
* therefore model value is set from correct view value (it must be formatter - change comma to dot)
*/
else {
var dots = 0;
var currentPosition = valBeforeCursor.length;
if(isThousandSeparator){
parsedValue = addThousandSeparator(parsedValue, thousandSeparator);
dots = countThousandSeparatorToPosition(parsedValue,thousandSeparator,currentPosition);
}
if(prepend) {
dots++;
if(new RegExp('^(\\-\\d)$').test(parsedValue)) {
dots+=2;
}
if(new RegExp('^(\\d)$').test(parsedValue)) {
dots++;
}
}
changeViewValue(ngModelController, parsedValue, prepend, append);
setCaretPosition(element[0], currentPosition + dots);
setTimeout(function() {
setCaretPosition(element[0], currentPosition + dots);
},1);
return convViewToModel(parsedValue, fractionSeparator, thousandSeparator);
}
}
function triggerParsers(ngModelController, value) {
ngModelController.$setViewValue('');
ngModelController.$render();
ngModelController.$setViewValue(value);
ngModelController.$render();
}
function onPropertyWatch(ngModelController, initObject){
var value = filterModelValue(
ngModelController.$modelValue,
initObject.fractionPart,
initObject.fractionSeparator,
initObject.roundFunction,
false,
initObject.isThousandSeparator,
initObject.thousandSeparator,
initObject.prepend,
initObject.append
);
triggerParsers(ngModelController, value);
}
function dynamicNumberDirective(dynamicNumberStrategy) {

@@ -286,93 +463,85 @@ return {

}
var initObject = initAllProperties(
createPropertyObject(scope),
element,
attrs,
ngModelController,
dynamicNumberStrategy
);
var strategy = {};
if(scope.awnum) {
strategy = dynamicNumberStrategy.getStrategy(scope.awnum);
}
var integerPart = initIntegerPart(scope.numInt !== undefined ? scope.numInt : strategy.numInt, 6);
var fractionPart = initFractionPart(scope.numFract !== undefined ? scope.numFract : strategy.numFract, 2);
var fractionSeparator = initSeparator(scope.numSep !== undefined ? scope.numSep : strategy.numSep, '.');
var isPositiveNumber = initIsPositive(scope.numPos !== undefined ? scope.numPos : strategy.numPos, true);
var isNegativeNumber = initIsNegative(scope.numNeg !== undefined ? scope.numNeg : strategy.numNeg, true);
var roundFunction = initRound(scope.numRound !== undefined ? scope.numRound : strategy.numRound, Math.round);
var isThousandSeparator = initIsThousand(scope.numThousand !== undefined ? scope.numThousand : strategy.numThousand, false);
var thousandSeparator = initThousandSeparator(scope.numThousandSep !== undefined ? scope.numThousandSep : strategy.numThousandSep, fractionSeparator, fractionSeparator==='.'?',':'.');
var prepend = initNumAppendPrepend(scope.numPrepend !== undefined ? scope.numPrepend : strategy.numPrepend);
var append = initNumAppendPrepend(scope.numAppend !== undefined ? scope.numAppend : strategy.numAppend);
if(isPositiveNumber === false && isNegativeNumber === false) {
throw new Error('Number is set to not be positive and not be negative. Change num_pos attr or/and num_neg attr to true');
}
var viewRegexTest = buildRegexp(integerPart, fractionPart, fractionSeparator, isPositiveNumber, isNegativeNumber);
ngModelController.$parsers.unshift(function(value){
scope.$watch('numInt', function(newProperty, oldProperty ){
if(oldProperty === newProperty) {
return;
}
initObject = initAllProperties(createPropertyObject(scope, 'numInt', newProperty), element, attrs, ngModelController, dynamicNumberStrategy);
onPropertyWatch(ngModelController, initObject);
});
var parsedValue = String(value);
parsedValue = removePrependAppendChars(parsedValue, prepend, append);
if(new RegExp('^[\.,'+thousandSeparator+']{2,}').test(parsedValue)) {
changeViewValue(ngModelController, 0, prepend, append);
return 0;
scope.$watch('numFract', function(newProperty, oldProperty ){
if(oldProperty === newProperty) {
return;
}
var cursorPosition = getCaretPosition(element[0]);
if(prepend) {
cursorPosition--;
initObject = initAllProperties(createPropertyObject(scope, 'numFract', newProperty), element, attrs, ngModelController, dynamicNumberStrategy);
onPropertyWatch(ngModelController, initObject);
});
scope.$watch('numSep', function(newProperty, oldProperty ){
if(oldProperty === newProperty) {
return;
}
var valBeforeCursor = parsedValue.slice(0,cursorPosition);
valBeforeCursor = removeThousandSeparators(valBeforeCursor, thousandSeparator);
parsedValue = removeThousandSeparators(parsedValue, thousandSeparator);
valBeforeCursor = removeLeadingZero(valBeforeCursor);
parsedValue = removeLeadingZero(parsedValue);
initObject = initAllProperties(createPropertyObject(scope, 'numSep', newProperty), element, attrs, ngModelController, dynamicNumberStrategy);
onPropertyWatch(ngModelController, initObject);
});
if(parsedValue === '' && String(value).charAt(0)=== '0'){
changeViewValue(ngModelController, 0, prepend, append);
return 0;
scope.$watch('numPos', function(newProperty, oldProperty ){
if(oldProperty === newProperty) {
return;
}
if(parsedValue === undefined || parsedValue === ''){
return 0;
initObject = initAllProperties(createPropertyObject(scope, 'numPos', newProperty), element, attrs, ngModelController, dynamicNumberStrategy);
onPropertyWatch(ngModelController, initObject);
});
scope.$watch('numNeg', function(newProperty, oldProperty ){
if(oldProperty === newProperty) {
return;
}
if(parsedValue === '-'){
changeViewValue(ngModelController, '-', prepend, append);
return 0;
initObject = initAllProperties(createPropertyObject(scope, 'numNeg', newProperty), element, attrs, ngModelController, dynamicNumberStrategy);
onPropertyWatch(ngModelController, initObject);
});
scope.$watch('numThousand', function(newProperty, oldProperty ){
if(oldProperty === newProperty) {
return;
}
/**
* view value failed 'correct view format' test
* therefore view value is set from last correct model value (it must be formatted - change dot to comma)
*/
if(viewRegexTest.test(parsedValue) === false){
var modelValue = convModelToView(ngModelController.$modelValue, fractionSeparator, prepend, append);
if(isThousandSeparator){
modelValue = addThousandSeparator(modelValue, thousandSeparator);
}
changeViewValue(ngModelController, modelValue, prepend, append);
setCaretPosition(element[0],cursorPosition-1);
return ngModelController.$modelValue;
initObject = initAllProperties(createPropertyObject(scope, 'numThousand', newProperty), element, attrs, ngModelController, dynamicNumberStrategy);
onPropertyWatch(ngModelController, initObject);
});
scope.$watch('numThousandSep', function(newProperty, oldProperty ){
if(oldProperty === newProperty) {
return;
}
/**
* view value success 'correct view format' test
* therefore model value is set from correct view value (it must be formatter - change comma to dot)
*/
else {
var dots = 0;
var currentPosition = valBeforeCursor.length;
if(isThousandSeparator){
parsedValue = addThousandSeparator(parsedValue, thousandSeparator);
dots = countThousandSeparatorToPosition(parsedValue,thousandSeparator,currentPosition);
}
if(prepend) {
dots++;
if(new RegExp('^(\\-\\d)$').test(parsedValue)) {
dots+=2;
}
if(new RegExp('^(\\d)$').test(parsedValue)) {
dots++;
}
}
changeViewValue(ngModelController, parsedValue, prepend, append);
initObject = initAllProperties(createPropertyObject(scope, 'numThousandSep', newProperty), element, attrs, ngModelController, dynamicNumberStrategy);
onPropertyWatch(ngModelController, initObject);
});
setCaretPosition(element[0], currentPosition + dots);
setTimeout(function() {
setCaretPosition(element[0], currentPosition + dots);
},1);
scope.$watch('numAppend', function(newProperty, oldProperty ){
if(oldProperty === newProperty) {
return;
}
initObject = initAllProperties(createPropertyObject(scope, 'numAppend', newProperty), element, attrs, ngModelController, dynamicNumberStrategy);
onPropertyWatch(ngModelController, initObject);
});
return convViewToModel(parsedValue, fractionSeparator, thousandSeparator);
scope.$watch('numPrepend', function(newProperty, oldProperty ){
if(oldProperty === newProperty) {
return;
}
initObject = initAllProperties(createPropertyObject(scope, 'numPrepend', newProperty), element, attrs, ngModelController, dynamicNumberStrategy);
onPropertyWatch(ngModelController, initObject);
});
ngModelController.$parsers.unshift(function(value){
return directiveParser(value, initObject);
});
/**

@@ -382,3 +551,13 @@ * it is like filter,

ngModelController.$formatters.push(function(value){
return filterModelValue(value, fractionPart, fractionSeparator, roundFunction, false, isThousandSeparator, thousandSeparator, prepend, append);
return filterModelValue(
value,
initObject.fractionPart,
initObject.fractionSeparator,
initObject.roundFunction,
false,
initObject.isThousandSeparator,
initObject.thousandSeparator,
initObject.prepend,
initObject.append
);
});

@@ -385,0 +564,0 @@ }

@@ -1,1 +0,1 @@

!function(n,e,t){"use strict";function r(n,e,r,u){if(n===t)return"";var a="";return a=","===e?String(n).replace(".",","):String(n),i(a,r,u)}function u(n,e,t){return","===e?String(n).replace(/[\.\s]/g,"").replace(",","."):"."===e?String(n).replace(/[,\s]/g,""):void 0}function i(n,e,t){var r=n;return t&&(r+=t),e&&(r=/^\-.+/.test(r)?r.replace("-","-"+e):/^\-/.test(r)?r:e+r),r}function a(n,e){if(n>=0){var t=parseInt(n,10);if(isNaN(t)===!1&&isFinite(t)&&t>=0)return t}return e}function o(n,e){if(n>=0){var t=parseInt(n,10);if(isNaN(t)===!1&&isFinite(t)&&t>=0)return t}return e}function c(n,e){return","===n?",":"."===n?".":e}function s(n,e){return"false"===n||n===!1?!1:"true"===n||n===!0?!0:e}function f(n,e){return"false"===n||n===!1?!1:"true"===n||n===!0?!0:e}function m(n,e){return"floor"===n?Math.floor:"ceil"===n?Math.ceil:"round"===n?Math.round:e}function g(n,e){return"false"===n||n===!1?!1:"true"===n||n===!0?!0:e}function l(n,e){return"false"===n||n===!1?!1:"true"===n||n===!0?!0:e}function p(n,e,t){if(!n)return t;var r;return r="."===e?new RegExp("^[,\\s]$"):new RegExp("^[\\.\\s]$"),r.test(n)?n:t}function d(n){var e=new RegExp("[^\\d,\\.\\s\\-]{1}");return e.test(n)?n:null}function v(n,e,t,r,u){var i="-?";r===!1&&u===!0?i="-":r===!0&&u===!1&&(i="");var a="[0-9]{0,"+n+"}";0===n&&(a="0");var o="(\\"+t+"([0-9]){0,"+e+"})";return 0===e&&(o=""),new RegExp("^"+i+a+o+"?$")}function S(n){return String(n).replace(/^0+/g,"").replace(/^-0(\d+)/g,"-$1").replace(new RegExp("^-([\\.,\\s])","g"),"-0$1").replace(new RegExp("^[\\.,\\s]","g"),"0$&")}function h(n,e,t){var r=n;return e&&(r=r.replace(new RegExp("[\\"+e+"]","g"),"")),t&&(r=r.replace(new RegExp("[\\"+t+"]","g"),"")),r}function w(n,e){return"."===e?String(n).replace(/\./g,""):","===e?String(n).replace(/,/g,""):String(n).replace(new RegExp("\\s","g"),"")}function R(n,e){return n=String(n).split("."),n[0]=n[0].replace(/\B(?=(\d{3})+(?!\d))/g,e),n.join(".")}function x(n,e,t,r){n.$setViewValue(i(e,t,r)),n.$render()}function N(n,e,u,i,a,o,c,s,f){if(""===n||n===t||null===n)return"";if(n=Number(n),!isNaN(n)&&isFinite(n)){var m=Math.pow(10,e);return n=a?r((i(n*m)/m).toFixed(e),u,s,f):r(String(i(n*m)/m),u,s,f),o&&(n=R(n,c)),n}return a?0..toFixed(e):"0"}function $(n){var e=0;if(document.selection){n.focus();var t=document.selection.createRange();t.moveStart("character",-n.value.length),e=t.text.length}else(n.selectionStart||"0"==n.selectionStart)&&(e=n.selectionStart);return e}function y(n,e){if(null!==n)if(n.createTextRange){var t=n.createTextRange();t.move("character",e),t.select()}else n.selectionStart?(n.focus(),n.setSelectionRange(e,e)):n.focus()}function E(n,e,t){for(var r=0,u=0,i=0;i<n.length;i++)if(n[i]!==e){if(r++,r>=t)break}else u++;return u}function T(n){return{restrict:"A",require:"?ngModel",scope:{awnum:"@",numInt:"@",numFract:"@",numSep:"@",numPos:"@",numNeg:"@",numRound:"@",numThousand:"@",numThousandSep:"@",numPrepend:"@",numAppend:"@"},link:function(e,i,g,T){if(!i[0]||"INPUT"!==i[0].tagName||"text"!==i[0].type)return void console.warn("Directive angular-dynamic-number works only for 'input' tag with type = 'text'");if(!T)return void console.warn("Directive angular-dynamic-number need ngModel attribute");var b={};e.awnum&&(b=n.getStrategy(e.awnum));var F=a(e.numInt!==t?e.numInt:b.numInt,6),P=o(e.numFract!==t?e.numFract:b.numFract,2),M=c(e.numSep!==t?e.numSep:b.numSep,"."),I=s(e.numPos!==t?e.numPos:b.numPos,!0),A=f(e.numNeg!==t?e.numNeg:b.numNeg,!0),V=m(e.numRound!==t?e.numRound:b.numRound,Math.round),k=l(e.numThousand!==t?e.numThousand:b.numThousand,!1),D=p(e.numThousandSep!==t?e.numThousandSep:b.numThousandSep,M,"."===M?",":"."),_=d(e.numPrepend!==t?e.numPrepend:b.numPrepend),j=d(e.numAppend!==t?e.numAppend:b.numAppend);if(I===!1&&A===!1)throw new Error("Number is set to not be positive and not be negative. Change num_pos attr or/and num_neg attr to true");var q=v(F,P,M,I,A);T.$parsers.unshift(function(n){var e=String(n);if(e=h(e,_,j),new RegExp("^[.,"+D+"]{2,}").test(e))return x(T,0,_,j),0;var a=$(i[0]);_&&a--;var o=e.slice(0,a);if(o=w(o,D),e=w(e,D),o=S(o),e=S(e),""===e&&"0"===String(n).charAt(0))return x(T,0,_,j),0;if(e===t||""===e)return 0;if("-"===e)return x(T,"-",_,j),0;if(q.test(e)===!1){var c=r(T.$modelValue,M,_,j);return k&&(c=R(c,D)),x(T,c,_,j),y(i[0],a-1),T.$modelValue}var s=0,f=o.length;return k&&(e=R(e,D),s=E(e,D,f)),_&&(s++,new RegExp("^(\\-\\d)$").test(e)&&(s+=2),new RegExp("^(\\d)$").test(e)&&s++),x(T,e,_,j),y(i[0],f+s),setTimeout(function(){y(i[0],f+s)},1),u(e,M,D)}),T.$formatters.push(function(n){return N(n,P,M,V,!1,k,D,_,j)})}}}e.module("dynamicNumber",[]).provider("dynamicNumberStrategy",function(){var n={};this.addStrategy=function(e,t){n[e]=t},this.getStrategy=function(e){return n[e]},this.$get=function(){return{getStrategy:function(e){return n[e]}}}}).filter("awnum",function(){return function(n,e,t,r,u,i,a,s,f){var v=o(e,2),S=c(t,"."),h=m(r,Math.round),w=g(u,!1),R=l(i,!1),x=p(a,S,"."===S?",":"."),$=d(s),y=d(f),E=N(n,v,S,h,w,R,x,$,y);return""===E?"0":E}}).directive("awnum",["dynamicNumberStrategy",T])}(window,window.angular);
!function(n,e,t){"use strict";function r(n,e,r,u){if(n===t)return"";var o="";return o=","===e?String(n).replace(".",","):String(n),a(o,r,u)}function u(n,e,t){return","===e?String(n).replace(/[\.\s]/g,"").replace(",","."):"."===e?String(n).replace(/[,\s]/g,""):void 0}function a(n,e,t){var r=n;return t&&(r+=t),e&&(r=/^\-.+/.test(r)?r.replace("-","-"+e):/^\-/.test(r)?r:e+r),r}function o(n,e){if(n>=0){var t=parseInt(n,10);if(isNaN(t)===!1&&isFinite(t)&&t>=0)return t}return e}function i(n,e){if(n>=0){var t=parseInt(n,10);if(isNaN(t)===!1&&isFinite(t)&&t>=0)return t}return e}function c(n,e){return","===n?",":"."===n?".":e}function m(n,e){return"false"===n||n===!1?!1:"true"===n||n===!0?!0:e}function s(n,e){return"false"===n||n===!1?!1:"true"===n||n===!0?!0:e}function p(n,e){return"floor"===n?Math.floor:"ceil"===n?Math.ceil:"round"===n?Math.round:e}function d(n,e){return"false"===n||n===!1?!1:"true"===n||n===!0?!0:e}function f(n,e){return"false"===n||n===!1?!1:"true"===n||n===!0?!0:e}function g(n,e,t){if(!n)return t;var r;return r="."===e?new RegExp("^[,\\s]$"):new RegExp("^[\\.\\s]$"),r.test(n)?n:t}function l(n){var e=new RegExp("[^\\d,\\.\\s\\-]{1}");return e.test(n)?n:null}function h(n,e,t,r,u){var a="-?";r===!1&&u===!0?a="-":r===!0&&u===!1&&(a="");var o="[0-9]{0,"+n+"}";0===n&&(o="0");var i="(\\"+t+"([0-9]){0,"+e+"})";return 0===e&&(i=""),new RegExp("^"+a+o+i+"?$")}function S(n){return String(n).replace(/^0+/g,"").replace(/^-0(\d+)/g,"-$1").replace(new RegExp("^-([\\.,\\s])","g"),"-0$1").replace(new RegExp("^[\\.,\\s]","g"),"0$&")}function v(n,e,t){var r=n;return e&&(r=r.replace(new RegExp("[\\"+e+"]","g"),"")),t&&(r=r.replace(new RegExp("[\\"+t+"]","g"),"")),r}function w(n,e){return"."===e?String(n).replace(/\./g,""):","===e?String(n).replace(/,/g,""):String(n).replace(new RegExp("\\s","g"),"")}function $(n,e){return n=String(n).split("."),n[0]=n[0].replace(/\B(?=(\d{3})+(?!\d))/g,e),n.join(".")}function N(n,e,t,r){n.$setViewValue(a(e,t,r)),n.$render()}function T(n,e,u,a,o,i,c,m,s){if(""===n||n===t||null===n)return"";if(n=Number(n),!isNaN(n)&&isFinite(n)){var p=Math.pow(10,e);return n=o?r((a(n*p)/p).toFixed(e),u,m,s):r(String(a(n*p)/p),u,m,s),i&&(n=$(n,c)),n}return o?0..toFixed(e):"0"}function P(n){var e=0;if(document.selection){n.focus();var t=document.selection.createRange();t.moveStart("character",-n.value.length),e=t.text.length}else(n.selectionStart||"0"==n.selectionStart)&&(e=n.selectionStart);return e}function R(n,e){if(null!==n)if(n.createTextRange){var t=n.createTextRange();t.move("character",e),t.select()}else n.selectionStart?(n.focus(),n.setSelectionRange(e,e)):n.focus()}function x(n,e,t){for(var r=0,u=0,a=0;a<n.length;a++)if(n[a]!==e){if(r++,r>=t)break}else u++;return u}function F(n,e,t){var r={awnum:n.awnum,numInt:n.numInt,numFract:n.numFract,numSep:n.numSep,numPos:n.numPos,numNeg:n.numNeg,numRound:n.numRound,numThousand:n.numThousand,numThousandSep:n.numThousandSep,numPrepend:n.numPrepend,numAppend:n.numAppend};return e&&(r[e]=t),r}function b(n,e,r,u,a){var d={};n.awnum&&(d=a.getStrategy(n.awnum));var S=o(n.numInt!==t?n.numInt:d.numInt,6),v=i(n.numFract!==t?n.numFract:d.numFract,2),w=c(n.numSep!==t?n.numSep:d.numSep,"."),$=m(n.numPos!==t?n.numPos:d.numPos,!0),N=s(n.numNeg!==t?n.numNeg:d.numNeg,!0),T=p(n.numRound!==t?n.numRound:d.numRound,Math.round),P=f(n.numThousand!==t?n.numThousand:d.numThousand,!1),R=g(n.numThousandSep!==t?n.numThousandSep:d.numThousandSep,w,"."===w?",":"."),x=l(n.numPrepend!==t?n.numPrepend:d.numPrepend),F=l(n.numAppend!==t?n.numAppend:d.numAppend);if($===!1&&N===!1)throw new Error("Number is set to not be positive and not be negative. Change num_pos attr or/and num_neg attr to true");var b=h(S,v,w,$,N);return{element:e,attrs:r,ngModelController:u,viewRegexTest:b,integerPart:S,fractionPart:v,fractionSeparator:w,isPositiveNumber:$,isNegativeNumber:N,roundFunction:T,isThousandSeparator:P,thousandSeparator:R,prepend:x,append:F}}function y(n,e){var a=e.element,o=(e.attrs,e.ngModelController),i=e.viewRegexTest,c=(e.integerPart,e.fractionPart,e.fractionSeparator),m=(e.isPositiveNumber,e.isNegativeNumber,e.roundFunction,e.isThousandSeparator),s=e.thousandSeparator,p=e.prepend,d=e.append,f=String(n);if(f=v(f,p,d),new RegExp("^[.,"+s+"]{2,}").test(f))return N(o,0,p,d),0;var g=P(a[0]);p&&g--;var l=f.slice(0,g);if(l=w(l,s),f=w(f,s),l=S(l),f=S(f),""===f&&"0"===String(n).charAt(0))return N(o,0,p,d),0;if(f===t||""===f)return 0;if("-"===f)return N(o,"-",p,d),0;if(i.test(f)===!1){var h=r(o.$modelValue,c,p,d);return m&&(h=$(h,s)),N(o,h,p,d),R(a[0],g-1),o.$modelValue}var T=0,F=l.length;return m&&(f=$(f,s),T=x(f,s,F)),p&&(T++,new RegExp("^(\\-\\d)$").test(f)&&(T+=2),new RegExp("^(\\d)$").test(f)&&T++),N(o,f,p,d),R(a[0],F+T),setTimeout(function(){R(a[0],F+T)},1),u(f,c,s)}function E(n,e){n.$setViewValue(""),n.$render(),n.$setViewValue(e),n.$render()}function I(n,e){var t=T(n.$modelValue,e.fractionPart,e.fractionSeparator,e.roundFunction,!1,e.isThousandSeparator,e.thousandSeparator,e.prepend,e.append);E(n,t)}function A(n){return{restrict:"A",require:"?ngModel",scope:{awnum:"@",numInt:"@",numFract:"@",numSep:"@",numPos:"@",numNeg:"@",numRound:"@",numThousand:"@",numThousandSep:"@",numPrepend:"@",numAppend:"@"},link:function(e,t,r,u){if(!t[0]||"INPUT"!==t[0].tagName||"text"!==t[0].type)return void console.warn("Directive angular-dynamic-number works only for 'input' tag with type = 'text'");if(!u)return void console.warn("Directive angular-dynamic-number need ngModel attribute");var a=b(F(e),t,r,u,n);e.$watch("numInt",function(o,i){i!==o&&(a=b(F(e,"numInt",o),t,r,u,n),I(u,a))}),e.$watch("numFract",function(o,i){i!==o&&(a=b(F(e,"numFract",o),t,r,u,n),I(u,a))}),e.$watch("numSep",function(o,i){i!==o&&(a=b(F(e,"numSep",o),t,r,u,n),I(u,a))}),e.$watch("numPos",function(o,i){i!==o&&(a=b(F(e,"numPos",o),t,r,u,n),I(u,a))}),e.$watch("numNeg",function(o,i){i!==o&&(a=b(F(e,"numNeg",o),t,r,u,n),I(u,a))}),e.$watch("numThousand",function(o,i){i!==o&&(a=b(F(e,"numThousand",o),t,r,u,n),I(u,a))}),e.$watch("numThousandSep",function(o,i){i!==o&&(a=b(F(e,"numThousandSep",o),t,r,u,n),I(u,a))}),e.$watch("numAppend",function(o,i){i!==o&&(a=b(F(e,"numAppend",o),t,r,u,n),I(u,a))}),e.$watch("numPrepend",function(o,i){i!==o&&(a=b(F(e,"numPrepend",o),t,r,u,n),I(u,a))}),u.$parsers.unshift(function(n){return y(n,a)}),u.$formatters.push(function(n){return T(n,a.fractionPart,a.fractionSeparator,a.roundFunction,!1,a.isThousandSeparator,a.thousandSeparator,a.prepend,a.append)})}}}e.module("dynamicNumber",[]).provider("dynamicNumberStrategy",function(){var n={};this.addStrategy=function(e,t){n[e]=t},this.getStrategy=function(e){return n[e]},this.$get=function(){return{getStrategy:function(e){return n[e]}}}}).filter("awnum",function(){return function(n,e,t,r,u,a,o,m,s){var h=i(e,2),S=c(t,"."),v=p(r,Math.round),w=d(u,!1),$=f(a,!1),N=g(o,S,"."===S?",":"."),P=l(m),R=l(s),x=T(n,h,S,v,w,$,N,P,R);return""===x?"0":x}}).directive("awnum",["dynamicNumberStrategy",A])}(window,window.angular);

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc