//Simple Angular UI //Time Picker //Authors: Amir Azizi //Email: web1392@yahoo.com //Version: 1.0.5 var app = angular.module("simpleAngularUI", []); app.directive("suiTimePicker", function ($timeout) { return { restrict: "E", replace: true, scope: { time: "=", stringTime: "=", hasSecond: "=", ngDisabled: "=", ngRequired: "=", maxHour: "@", size: "@", dirType: "@", validation: "&" }, template: '
' + '' + ':' + '' + ':' + '' + "
", link: function (scope, element, ngModel) { $timeout(function () { if (angular.isUndefined(scope.ngRequired)) { console.error("please add ng-required to your input/textarea/select"); return false; } else { if (scope.ngRequired) { if (scope.timespan.h == "undefined" || angular.isUndefined(scope.timespan.h)) scope.inputClassHour = 'required-alert'; if (scope.timespan.m == "undefined" || angular.isUndefined(scope.timespan.m)) scope.inputClassMinute = 'required-alert'; if (scope.timespan.s == "undefined" || angular.isUndefined(scope.timespan.s)) scope.inputClassSecond = 'required-alert'; } element.find("input[name='hour']").bind("blur", function () { if (scope.timespan.h == "undefined" || angular.isUndefined(scope.timespan.h) || scope.timespan.h.length == 0) { scope.timespan.h = ""; scope.inputClassHour = 'required-alert'; } else { scope.inputClassHour = 'required-alert-ok'; } }); element.find("input[name='minute']").bind("blur", function () { if (scope.timespan.m == "undefined" || angular.isUndefined(scope.timespan.m) || scope.timespan.m.length==0) { scope.timespan.m = ""; scope.inputClassMinute = 'required-alert'; } else { scope.inputClassMinute = 'required-alert-ok'; } }); element.find("input[name='second']").bind("blur", function () { if (scope.timespan.s == "undefined" || angular.isUndefined(scope.timespan.s) || scope.timespan.s.length == 0) { scope.timespan.s = ""; scope.inputClassSecond = 'required-alert'; } else { scope.inputClassSecond = 'required-alert-ok'; } }); } return false; }, 1500) scope.timespan = { h: "", m: "", s: "" }; //set css class scope.templateClass = ""; if (scope.dirType === "rtl") { scope.templateClass = "rtl-timepicker"; switch (scope.size) { case "lg": scope.templateClass = scope.templateClass + " input-group-lg rtl-timepicker-lg"; break; case "sm": scope.templateClass = scope.templateClass + " input-group-sm rtl-timepicker-sm"; break; } } else { switch (scope.size) { case "lg": scope.templateClass = "input-group-lg"; break; case "sm": scope.templateClass = "input-group-sm"; break; } } //Set the default value for hasSecond if (angular.isUndefined(scope.hasSecond)) { scope.hasSecond = true; } //Set the default value for hasSecond if (angular.isUndefined(scope.maxHour)) { scope.maxHour = 24; } //Converting string Time to Object Time scope.timeAnalyzer = function (time) { var hms = time.split(":"); var h, m, s; if (scope.hasSecond) { h = hms[0]; m = hms[1]; s = hms[2]; return { h: h, m: m, s: s }; } else { h = hms[0]; m = hms[1]; return { h: h, m: m }; } } //Converting Object Time to string Time scope.convertToTime = function () { if (scope.stringTime) { //Correction hour if (scope.timespan.h.length === 1) { scope.timespan.h = "0" + scope.timespan.h; } //Correction min if (scope.timespan.m.length === 1) { scope.timespan.m = "0" + scope.timespan.m; } //Check hasSecond if (scope.hasSecond) { //Correction Second if (scope.timespan.s.length === 1) { scope.timespan.s = "0" + scope.timespan.s; } scope.time = scope.timespan.h + ":" + scope.timespan.m + ":" + scope.timespan.s; } else { scope.time = scope.timespan.h + ":" + scope.timespan.m; } scope.validation(); } } //Check String Time if (scope.stringTime) { //watch time variable scope.$watch("time", function (newValue) { if (newValue) { if (!angular.isUndefined(scope.time)) { scope.timespan = scope.timeAnalyzer(scope.time); } } }, true); //watch timespan variable scope.$watch("timespan", function (newValue) { if (scope.hasSecond) { scope.time = newValue.h + ":" + newValue.m + ":" + newValue.s; } else { scope.time = newValue.h + ":" + newValue.m; } }, true); } else { //directive check config if (angular.isUndefined(scope.time.h)) { console.error("please return object {h:?,m:?,s:?}"); } //watch time variable scope.$watch("time", function (newValue) { if (newValue) { if (!angular.isUndefined(scope.time)) { scope.timespan = scope.time; } } }, true); } //Select All Text When Click or Focus on input element.find("input[type='text']").each(function () { $(this).on("click", function () { $(this).select(); }); }); //check the value of number element.find("input[name='hour']").on("input propertychange", function () { var val = $(this).val(); val = val.replace(/[a-zA-Z?><;,\\"`~»«×÷\.:{}()[\]\-_+=!@/#$%\^&*|']*/g, ""); val = val.replace(/[\u0600-\u06FF ]/g, ""); if (val > scope.maxHour - 1) { val = "00"; scope.timespan.h = 0; } $(this).val(val); }); element.find("input[name='minute'], input[name='second']").on("input propertychange", function () { var val = $(this).val(); val = val.replace(/[a-zA-Z?><;,\\"`~»«×÷\.:{}()[\]\-_+=!@/#$%\^&*|']*/g, ""); val = val.replace(/[\u0600-\u06FF ]/g, ""); if (val > 59) { val = "00"; scope.timespan.m = 0; } $(this).val(val); }); // Respond on up/down/left/right arrowkeys var getKeyboardEventResult = function (keyEvent) { return window.event ? keyEvent.keyCode : keyEvent.which; }; scope.onHourChange = function ($event) { var keyCode = getKeyboardEventResult($event); if (keyCode === 38) {//up if (scope.timespan.h < scope.maxHour - 1) { scope.timespan.h++; } else { scope.timespan.h = 0; } } if (keyCode === 40) {//down if (scope.timespan.h > 0) { scope.timespan.h--; } else { scope.timespan.h = scope.maxHour - 1; } } if (keyCode === 39) { setTimeout(function () {//right $(element).find("input[name='minute']").select(); scope.$apply(); }, 0); } }; scope.onMinuteChange = function ($event) { var keyCode = getKeyboardEventResult($event); if (keyCode === 38) {//up if (scope.timespan.m < 59) { scope.timespan.m++; } else { scope.timespan.m = 0; if (scope.timespan.h < scope.maxHour - 1) { scope.timespan.h++; } else { scope.timespan.h = 0; } } } if (keyCode === 40) {//down if (scope.timespan.m > 0) { scope.timespan.m--; } else { scope.timespan.m = 59; if (scope.timespan.h > 0) { scope.timespan.h--; } else { scope.timespan.h = scope.maxHour - 1; } } } if (keyCode === 39) {//right setTimeout(function () { $(element).find("input[name='second']").select(); scope.$apply(); }, 0); } if (keyCode === 37) { setTimeout(function () {//left $(element).find("input[name='hour']").select(); scope.$apply(); }, 0); } }; scope.onSecondChange = function ($event) { var keyCode = getKeyboardEventResult($event); if (keyCode === 38) {//up if (scope.timespan.s < 59) { scope.timespan.s++; } else { scope.timespan.s = 0; if (scope.timespan.m < 59) { scope.timespan.m++; } else { scope.timespan.m = 0; if (scope.timespan.h < scope.maxHour - 1) { scope.timespan.h++; } else { scope.timespan.h = 0; } } } } if (keyCode === 40) {//down if (scope.timespan.s > 0) { scope.timespan.s--; } else { scope.timespan.s = 59; if (scope.timespan.m > 0) { scope.timespan.m--; } else { scope.timespan.m = 59; if (scope.timespan.h > 0) { scope.timespan.h--; } else { scope.timespan.h = scope.maxHour - 1; } } } } if (keyCode === 37) {//left setTimeout(function () { $(element).find("input[name='minute']").select(); scope.$apply(); }, 0); } }; } }; });