Skip to content

Commit 0648cd5

Browse files
vbmendesassisrafael
authored andcommitted
feat(uiBrNumeroBeneficioMask): mask for BR social security benefit number. (#351)
1 parent 640dda5 commit 0648cd5

File tree

6 files changed

+170
-0
lines changed

6 files changed

+170
-0
lines changed

docs/index.md

+10
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,16 @@
143143
<input type="text" name="field" ng-model="initializedCpfCnpj1" ui-br-cpfcnpj-mask>
144144
```
145145

146+
## ui-br-numero-beneficio-mask ##
147+
148+
- Example:
149+
150+
```html
151+
<input type="text" name="field" ng-model="initializedNumeroBeneficio" ui-br-numero-beneficio-mask>
152+
```
153+
154+
- Máscara o número do benefício do INSS que segue o formato 999.999.999-9.
155+
146156

147157
## ui-br-ie-mask ##
148158
```html

src/br/br-masks.js

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var m = angular.module('ui.utils.masks.br', [])
77
.directive('uiBrCnpjMask', require('./cnpj/cnpj'))
88
.directive('uiBrCpfMask', require('./cpf/cpf'))
99
.directive('uiBrCpfcnpjMask', require('./cpf-cnpj/cpf-cnpj'))
10+
.directive('uiBrNumeroBeneficioMask', require('./numero-beneficio/numero-beneficio'))
1011
.directive('uiBrIeMask', require('./inscricao-estadual/ie'))
1112
.directive('uiNfeAccessKeyMask', require('./nfe/nfe'))
1213
.directive('uiBrPhoneNumberMask', require('./phone/br-phone'));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Número Benefício Spec</title>
6+
<script src="/node_modules/angular/angular.min.js"></script>
7+
<script src="/releases/angular-input-masks-dependencies.js"></script>
8+
<script src="/releases/angular-input-masks.br.js"></script>
9+
<script>
10+
angular.module('app', ['ui.utils.masks'])
11+
.controller('ctrl', function ctrl($scope) {
12+
$scope.initializedNumeroBeneficio = '0000025070';
13+
});
14+
</script>
15+
</head>
16+
<body ng-app="app">
17+
<form name="form" ng-controller="ctrl">
18+
<h2>ui-br-numero-beneficio-mask</h2>
19+
<input type="text" name="field7" ng-model="initializedNumeroBeneficio" ui-br-numero-beneficio-mask> <br>
20+
<span ng-bind="initializedNumeroBeneficio"></span> - {{form.field7.$error}}<br>
21+
<input type="text" name="field8" ng-model="fieldNumeroBeneficio" ng-model-options="{allowInvalid:true}" ui-br-numero-beneficio-mask> <br>
22+
<span ng-bind="fieldNumeroBeneficio"></span> - {{form.field8.$error}}<br>
23+
</form>
24+
</body>
25+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
'use strict';
2+
3+
var StringMask = require('string-mask');
4+
5+
var maskFactory = require('../../helpers/mask-factory');
6+
7+
var numeroBeneficioPattern = new StringMask('###.###.###-#', {reverse: true});
8+
9+
module.exports = maskFactory({
10+
clearValue: function(rawValue) {
11+
return rawValue.replace(/[^\d]/g, '').slice(0, 10);
12+
},
13+
format: function(cleanValue) {
14+
return (numeroBeneficioPattern.apply(cleanValue) || '').trim().replace(/[^0-9]$/, '');
15+
},
16+
validations: {}
17+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
'use strict';
2+
3+
describe('uiBrNumeroBeneficioMask', function() {
4+
it('should load the demo page', function() {
5+
browser.get('/src/br/numero-beneficio/numero-beneficio.html');
6+
expect(browser.getTitle()).toEqual('Número Benefício Spec');
7+
});
8+
9+
it('should apply a Número Benefício mask while the user is typping:', function() {
10+
var BS = protractor.Key.BACK_SPACE;
11+
12+
var tests = [
13+
{key:'-', viewValue:'', modelValue: ''},
14+
{key:'3', viewValue:'3', modelValue: '3'},
15+
{key:'5', viewValue:'3-5', modelValue: '35'},
16+
{key:'2', viewValue:'35-2', modelValue: '352'},
17+
{key:'4', viewValue:'352-4', modelValue: '3524'},
18+
{key:'4', viewValue:'3.524-4', modelValue: '35244'},
19+
{key:'4', viewValue:'35.244-4', modelValue: '352444'},
20+
{key:'5', viewValue:'352.444-5', modelValue: '3524445'},
21+
{key:'7', viewValue:'3.524.445-7', modelValue: '35244457'},
22+
{key:'6', viewValue:'35.244.457-6', modelValue: '352444576'},
23+
{key:'4', viewValue:'352.444.576-4', modelValue: '3524445764'},
24+
{key:'0', viewValue:'352.444.576-4', modelValue: '3524445764'},
25+
{key:BS, viewValue:'35.244.457-6', modelValue: '352444576'},
26+
{key:BS, viewValue:'3.524.445-7', modelValue: '35244457'},
27+
{key:BS, viewValue:'352.444-5', modelValue: '3524445'},
28+
{key:BS, viewValue:'35.244-4', modelValue: '352444'},
29+
{key:BS, viewValue:'3.524-4', modelValue: '35244'},
30+
{key:BS, viewValue:'352-4', modelValue: '3524'},
31+
{key:BS, viewValue:'35-2', modelValue: '352'},
32+
{key:BS, viewValue:'3-5', modelValue: '35'},
33+
{key:BS, viewValue:'3', modelValue: '3'},
34+
];
35+
36+
var input = element(by.model('fieldNumeroBeneficio')),
37+
value = element(by.binding('fieldNumeroBeneficio'));
38+
39+
for (var i = 0; i < tests.length; i++) {
40+
input.sendKeys(tests[i].key);
41+
expect(input.getAttribute('value')).toEqual(tests[i].viewValue);
42+
expect(value.getText()).toEqual(tests[i].modelValue);
43+
}
44+
});
45+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
'use strict';
2+
3+
require('../br-masks');
4+
5+
describe('ui-br-numero-beneficio-mask', function() {
6+
beforeEach(angular.mock.module('ui.utils.masks.br'));
7+
8+
it('should throw an error if used without ng-model', function() {
9+
expect(function() {
10+
TestUtil.compile('<input ui-br-numero-beneficio-mask>');
11+
}).toThrow();
12+
});
13+
14+
it('should register a $parser and a $formatter', function() {
15+
var input = TestUtil.compile('<input ng-model="model">');
16+
var model = input.controller('ngModel');
17+
18+
var maskedInput = TestUtil.compile('<input ng-model="maskedModel" ui-br-numero-beneficio-mask>');
19+
var maskedModel = maskedInput.controller('ngModel');
20+
21+
expect(maskedModel.$parsers.length).toBe(model.$parsers.length + 1);
22+
expect(maskedModel.$formatters.length).toBe(model.$formatters.length + 1);
23+
});
24+
25+
it('should format initial model values', function() {
26+
var input = TestUtil.compile('<input ng-model="model" ui-br-numero-beneficio-mask>', {
27+
model: '3524445764'
28+
});
29+
30+
var model = input.controller('ngModel');
31+
expect(model.$viewValue).toBe('352.444.576-4');
32+
});
33+
34+
it('should handle corner cases', angular.mock.inject(function($rootScope) {
35+
var input = TestUtil.compile('<input ng-model="model" ui-br-numero-beneficio-mask>');
36+
var model = input.controller('ngModel');
37+
38+
var tests = [
39+
{modelValue: '', viewValue: ''},
40+
{modelValue: '0', viewValue: '0'},
41+
{modelValue: null, viewValue: null},
42+
{}, //tests undefined values
43+
];
44+
45+
tests.forEach(function(test) {
46+
$rootScope.model = test.modelValue;
47+
$rootScope.$digest();
48+
expect(model.$viewValue).toBe(test.viewValue);
49+
});
50+
}));
51+
52+
it('should ignore non digits', function() {
53+
var input = TestUtil.compile('<input ng-model="model" ng-model-options="{allowInvalid:true}" ui-br-numero-beneficio-mask>');
54+
var model = input.controller('ngModel');
55+
56+
var tests = [
57+
{value:'@', viewValue:'', modelValue:''},
58+
{value:'3!', viewValue:'3', modelValue:'3'},
59+
{value:'35$2', viewValue:'35-2', modelValue:'352'},
60+
{value:'35$24%4.', viewValue:'3.524-4', modelValue:'35244'},
61+
{value:'35$24%445&', viewValue:'352.444-5', modelValue:'3524445'},
62+
{value:'35$24%445&76', viewValue:'35.244.457-6', modelValue:'352444576'},
63+
{value:'35$24%445&7640', viewValue:'352.444.576-4', modelValue:'3524445764'},
64+
];
65+
66+
tests.forEach(function(test) {
67+
input.val(test.value).triggerHandler('input');
68+
expect(model.$viewValue).toBe(test.viewValue);
69+
expect(model.$modelValue).toBe(test.modelValue);
70+
});
71+
});
72+
});

0 commit comments

Comments
 (0)