UNPKG

angular-mask

Version:
99 lines (81 loc) 2.79 kB
'use strict'; 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); }); } } }; } ]);