Completed
Push — master ( b8d05c...c84308 )
by wiese
269:29 queued 204:24
created

Handler.handle   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
nc 4
dl 0
loc 24
rs 8.5125
c 0
b 0
f 0
nop 1
1
'use strict';
2
3
var objectAssign = require( 'object-assign' ),
4
	_ = require( 'underscore' ),
5
	DELIMITER_KEYCODE_MAP = {
6
		',': 188,
7
		'.': 190
8
	},
9
	Handler = {
10
		input: null,
11
		delimiter: '.',
12
		handle: function ( event ) {
13
			var $element = this.input,
0 ignored issues
show
Unused Code introduced by
The variable $element seems to be never used. Consider removing it.
Loading history...
14
				// @todo Revise keyCode
15
				// @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
16
				// @see https://stackoverflow.com/a/41656511
17
				keyCode = event.keyCode || event.which,
18
				keysAllowed = [
19
					// numbers
20
					48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
21
					// editing and navigation
22
					0, 8, 9, 13, 37, 39, 46,
23
					// Delimiters (regular & numpad)
24
					DELIMITER_KEYCODE_MAP[ this.delimiter ], 110
25
				];
26
27
			// @todo Shouldn't this test for `|| event.ctrlKey !== false` instead?
28
			if( !_.contains( keysAllowed, keyCode ) && event.ctrlKey === false ) {
29
				event.preventDefault();
30
			}
31
32
			if( this.keyCodeIsDelimiter( keyCode ) && this.inputHasDelimiter() ) {
33
				event.preventDefault();
34
			}
35
		},
36
		keyCodeIsDelimiter: function ( keyCode ) {
37
			return DELIMITER_KEYCODE_MAP[ this.delimiter] === keyCode  ||
38
				keyCode === 110; // numpad
39
		},
40
		inputHasDelimiter: function () {
41
			return this.input.val().indexOf( this.delimiter ) > -1;
42
		}
43
	}
44
;
45
46
module.exports = {
47
	Handler: Handler,
48
	createNumericInputHandler: function ( input, delimiter ) {
49
		var handler = objectAssign( Object.create( Handler ), {
50
			input: input,
51
			delimiter: delimiter
52
		} );
53
54
		input.on( 'keypress', handler.handle.bind( handler ) );
55
		return handler;
56
	}
57
};
58