angular-dynamic-number
Advanced tools
Comparing version 1.8.1 to 1.9.0
{ | ||
"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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
74463
615
232