angular-mask
Version:
Personalized input masks for AngularJS
99 lines (81 loc) • 2.79 kB
JavaScript
;
angular.module('ui.utils.masks.global.money', [
'ui.utils.masks.helpers'
])
.directive('uiMoneyMask',
['$locale', '$parse', 'PreFormatters', 'NumberValidators',
function ($locale, $parse, PreFormatters, NumberValidators) {
return {
restrict: 'A',
require: '?ngModel',
link: function (scope, element, attrs, ctrl) {
var decimalDelimiter = $locale.NUMBER_FORMATS.DECIMAL_SEP,
thousandsDelimiter = $locale.NUMBER_FORMATS.GROUP_SEP,
currencySym = $locale.NUMBER_FORMATS.CURRENCY_SYM,
decimals = parseInt(attrs.uiMoneyMask);
if (!ctrl) {
return;
}
if (angular.isDefined(attrs.uiHideGroupSep)){
thousandsDelimiter = '';
}
if(isNaN(decimals)) {
decimals = 2;
}
var decimalsPattern = decimals > 0 ? decimalDelimiter + new Array(decimals + 1).join('0') : '';
var maskPattern = currencySym+' #'+thousandsDelimiter+'##0'+decimalsPattern;
var moneyMask = new StringMask(maskPattern, {reverse: true});
ctrl.$formatters.push(function(value) {
if(angular.isUndefined(value)) {
return value;
}
var valueToFormat = PreFormatters.prepareNumberToFormatter(value, decimals);
return moneyMask.apply(valueToFormat);
});
function parse(value) {
if (!value) {
return value;
}
var actualNumber = value.replace(/[^\d]+/g,'');
actualNumber = actualNumber.replace(/^[0]+([1-9])/,'$1');
var formatedValue = moneyMask.apply(actualNumber);
if (value !== formatedValue) {
ctrl.$setViewValue(formatedValue);
ctrl.$render();
}
return formatedValue ? parseInt(formatedValue.replace(/[^\d]+/g,''))/Math.pow(10,decimals) : null;
}
ctrl.$parsers.push(parse);
if (attrs.uiMoneyMask) {
scope.$watch(attrs.uiMoneyMask, function(decimals) {
if(isNaN(decimals)) {
decimals = 2;
}
decimalsPattern = decimals > 0 ? decimalDelimiter + new Array(decimals + 1).join('0') : '';
maskPattern = currencySym+' #'+thousandsDelimiter+'##0'+decimalsPattern;
moneyMask = new StringMask(maskPattern, {reverse: true});
parse(ctrl.$viewValue || '');
});
}
if(attrs.min){
ctrl.$parsers.push(function(value) {
var min = $parse(attrs.min)(scope);
return NumberValidators.minNumber(ctrl, value, min);
});
scope.$watch(attrs.min, function(value) {
NumberValidators.minNumber(ctrl, ctrl.$modelValue, value);
});
}
if(attrs.max) {
ctrl.$parsers.push(function(value) {
var max = $parse(attrs.max)(scope);
return NumberValidators.maxNumber(ctrl, value, max);
});
scope.$watch(attrs.max, function(value) {
NumberValidators.maxNumber(ctrl, ctrl.$modelValue, value);
});
}
}
};
}
]);