Skip to content

Commit 6fb9b1c

Browse files
committed
Can enter negative numbers in input-number
1 parent c2815ac commit 6fb9b1c

File tree

6 files changed

+52
-6
lines changed

6 files changed

+52
-6
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@ Change number of decimals for a single field.
9292
<input type="tel" id="number" ng-model="number" input-number decimals="2"/>
9393
```
9494

95+
Set a minimum allowed value.
96+
97+
```html
98+
<!-- This example only allows positive values -->
99+
<input type="tel" id="number" ng-model="number" input-number min="0"/>
100+
```
101+
95102
## Time
96103

97104
Helps the user to enter a time using native time input on mobile devices by setting `type="time"` on the input element. The `input-time` attribute adds validation plus autocomplete as fallback.

dist/angular-input-types.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ <h1>Angular Input Types Demo</h1>
2626
<input type="tel" id="number" ng-model="number" input-number decimals="2"/>
2727
<span ng-if="number">modelValue={{number}}</span>
2828
</li>
29+
<li>
30+
<label for="positive-number">Positive number</label>
31+
<input type="tel" id="positive-number" ng-model="positiveNumber" input-number decimals="2" min="0"/>
32+
<span ng-if="number">modelValue={{positiveNumber}}</span>
33+
</li>
2934
<li>
3035
<label for="time">Time</label>
3136
<input type="time" id="time" placeholder="HH:MM" ng-model="time" input-time/>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "angular-input-types",
33
"description": "AngularJS directives used on form inputs. Makes it easy for the users to input the correct information using autocomplete and validation.",
4-
"version": "1.1.1-SNAPSHOT",
4+
"version": "2.0.0-SNAPSHOT",
55
"license": "MIT",
66
"author": "Jon Wikman",
77
"homepage": "https://github.com/FlaxHaxx/angular-input-types",

src/number.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ angular.module('inputTypes')
2222

2323
var plainNumber = ('' + value).replace('.', decimalSeparator).replace(new RegExp('[^\\d|\\-+|\\' + decimalSeparator + '+]', 'g'), '');
2424

25-
var regExp = '^\\d+';
25+
var regExp = '^\\-?\\d+';
2626
if(nrOfDecimals > 0) {
2727
regExp += '(\\' + decimalSeparator + '\\d{0,' + nrOfDecimals + '})?';
2828
}
@@ -36,6 +36,10 @@ angular.module('inputTypes')
3636
inputElement.val(plainNumberValue === null ? '' : format(plainNumberValue));
3737
if(plainNumberValue !== null) {
3838
var plainNumberLength = plainNumberValue.toString().split(decimalSeparator)[0].length;
39+
if(plainNumberLength > 0 && plainNumberValue.charAt(0) == '-') {
40+
// Remove the minus sign when calculating length for the thousand separators
41+
plainNumberLength--;
42+
}
3943

4044
if(plainNumberLength > 1 && plainNumberLength % 3 == 1 && cursorPosition <= (plainNumberLength + Math.floor(plainNumberLength / 3))) {
4145
// New thousand separator added
@@ -67,11 +71,13 @@ angular.module('inputTypes')
6771
require: 'ngModel',
6872
link: function(scope, elm, attrs, ctrl) {
6973
var attrDecimals = scope.$eval(attrs.decimals);
70-
7174
if(attrDecimals !== undefined) {
7275
nrOfDecimals = attrDecimals;
7376
}
7477

78+
var attrMin = scope.$eval(attrs.min);
79+
var minValue = attrMin !== undefined ? attrMin : 0;
80+
7581
ctrl.$parsers.unshift(function(viewValue) {
7682
if(!viewValue) {
7783
return undefined;
@@ -91,6 +97,10 @@ angular.module('inputTypes')
9197
elm.triggerHandler('input');
9298
}
9399

100+
ctrl.$validators.min = function(modelValue, viewValue) {
101+
return ctrl.$isEmpty(modelValue) || modelValue >= minValue;
102+
}
103+
94104
return modelValue === null ? null : modelValue.replace(decimalSeparator, '.').replace(/\.$/, '');
95105
});
96106

test/unit/number.spec.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,37 @@ describe('number', function () {
44
describe('inputNumber', function () {
55
var form;
66
beforeEach(inject(function ($compile, $rootScope) {
7-
var element = angular.element('<form name="form"><input type="tel" name="number" ng-model="number" input-number /></form>');
7+
var element = angular.element('<form name="form"><input type="tel" name="number" ng-model="number" input-number min="-1000" /></form>');
88
$compile(element)($rootScope);
99
$rootScope.$digest();
1010
form = $rootScope.form;
1111
}));
1212
it('should validate empty number', function () {
1313
expect(form.number.$valid).toBe(true);
1414
});
15+
it('should validate 100', function () {
16+
form.number.$setViewValue('100');
17+
expect(form.number.$valid).toBe(true);
18+
});
19+
it('should validate 1 000', function () {
20+
form.number.$setViewValue('1 000');
21+
expect(form.number.$valid).toBe(true);
22+
});
23+
it('should validate -0', function () {
24+
form.number.$setViewValue('0');
25+
expect(form.number.$valid).toBe(true);
26+
});
27+
it('should validate -100', function () {
28+
form.number.$setViewValue('-100');
29+
expect(form.number.$valid).toBe(true);
30+
});
31+
it('should validate -1 000', function () {
32+
form.number.$setViewValue('-1 000');
33+
expect(form.number.$valid).toBe(true);
34+
});
35+
it('should not validate -1 001 (attribute "min" is set to -1000)', function () {
36+
form.number.$setViewValue('-1 001');
37+
expect(form.number.$valid).toBe(false);
38+
});
1539
});
1640
});

0 commit comments

Comments
 (0)