UNPKG

angular-input-types

Version:

AngularJS directives used on form inputs. Makes it easy for the users to input the correct information using autocomplete and validation.

100 lines (81 loc) 2.95 kB
angular.module('inputTypes') .directive('inputTime', ['$browser', '$parse', 'validate', function($browser, $parse, validate) { function format(value) { if(value.length > 5) { return value.substring(0, 5); } if(value.charAt(value.length - 1) == ':') { while(value.length < 3) { value = '0' + value; } } if(value.length == 2) { return value + ':'; } if(value.length > 4 && value.charAt(4) == ':') { return value.substring(0, 4); } return value; } function formatPaste(value) { value == value.match(/\d{1,2}:\d{2}/g)[0]; if(value.length == 5) { return value; } if(value.length == 4) { return '0' + value; } return ''; } function setViewValue(inputElement, value) { inputElement.val(value === null ? '' : value); inputElement.triggerHandler('input'); } function filterInput(value) { return value.replace(/[^0-9\:]/g, '').replace('::', ':'); } function addLeadingZeroIfLessThen10(value) { return ('0' + value).slice(-2); } return { restrict: 'A', require: 'ngModel', link: function(scope, elm, attrs, ctrl) { ctrl.$parsers.unshift(function(value) { if(value && value.length > 5) { value = value.substring(0, 5); } var valid = ctrl.$isEmpty(value) || validate.time(value); ctrl.$setValidity('time', valid); return valid ? value : undefined; }); var listener = function() { if(elm.val()) { setViewValue(elm, format(filterInput(elm.val()))); } } var pasteListener = function() { setViewValue(elm, formatPaste(filterInput(elm.val()))); } elm.bind('keydown', function(event) { var key = event.keyCode; // Backspace, delete, ctrl, shift, alt or meta keys if(key == 8 || key == 46 || key == 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) { return; } $browser.defer(listener); }); elm.bind('paste cut', function() { $browser.defer(pasteListener); }); elm.bind('change', pasteListener); if (attrs.ngModel) { var modelValue = $parse(attrs.ngModel)(scope); if(modelValue) { setViewValue(elm, addLeadingZeroIfLessThen10(modelValue.getHours()) + ':' + addLeadingZeroIfLessThen10(modelValue.getMinutes())); elm.triggerHandler('change'); // Make IE update viewValue } } } } }]);