From 9666c64f4a147f8f98db62539a491f96dbda920d Mon Sep 17 00:00:00 2001 From: Eric Schneider Date: Fri, 23 Sep 2016 12:10:40 -0700 Subject: [PATCH] feat(timepicker): add validation information - Add validation information for specific violations, allowing users to style classes generated by Angular Closes #6230 Closes #6259 --- src/timepicker/test/timepicker.spec.js | 6 ++++++ src/timepicker/timepicker.js | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/timepicker/test/timepicker.spec.js b/src/timepicker/test/timepicker.spec.js index f28ebe074a..74ae439b0c 100644 --- a/src/timepicker/test/timepicker.spec.js +++ b/src/timepicker/test/timepicker.spec.js @@ -1230,6 +1230,7 @@ describe('timepicker directive', function() { changeInputValueTo(el, 'pizza'); expect($rootScope.time).toBe(null); expect(el.parent().hasClass('has-error')).toBe(true); + expect(el.hasClass('ng-invalid-hours')); expect(element.hasClass('ng-invalid-time')).toBe(true); changeInputValueTo(el, 8); @@ -1247,6 +1248,7 @@ describe('timepicker directive', function() { changeInputValueTo(el, '8a'); expect($rootScope.time).toBe(null); expect(el.parent().hasClass('has-error')).toBe(true); + expect(el.hasClass('ng-invalid-minutes')); expect(element.hasClass('ng-invalid-time')).toBe(true); changeInputValueTo(el, 22); @@ -1262,6 +1264,7 @@ describe('timepicker directive', function() { changeInputValueTo(el, 'pizza'); expect($rootScope.time).toBe(null); expect(el.parent().hasClass('has-error')).toBe(true); + expect(el.hasClass('ng-invalid-seconds')); expect(element.hasClass('ng-invalid-time')).toBe(true); changeInputValueTo(el, 13); @@ -1291,6 +1294,9 @@ describe('timepicker directive', function() { elS.blur(); $rootScope.$digest(); + expect(elH.hasClass('ng-valid')); + expect(elM.hasClass('ng-valid')); + expect(elS.hasClass('ng-valid')); expect(element.hasClass('ng-invalid-time')).toBe(false); }); diff --git a/src/timepicker/timepicker.js b/src/timepicker/timepicker.js index e3a847f4a3..a588e449dd 100644 --- a/src/timepicker/timepicker.js +++ b/src/timepicker/timepicker.js @@ -15,6 +15,7 @@ angular.module('ui.bootstrap.timepicker', []) }) .controller('UibTimepickerController', ['$scope', '$element', '$attrs', '$parse', '$log', '$locale', 'uibTimepickerConfig', function($scope, $element, $attrs, $parse, $log, $locale, timepickerConfig) { + var hoursModelCtrl, minutesModelCtrl, secondsModelCtrl; var selected = new Date(), watchers = [], ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl @@ -36,6 +37,10 @@ angular.module('ui.bootstrap.timepicker', []) minutesInputEl = inputs.eq(1), secondsInputEl = inputs.eq(2); + hoursModelCtrl = hoursInputEl.controller('ngModel'); + minutesModelCtrl = minutesInputEl.controller('ngModel'); + secondsModelCtrl = secondsInputEl.controller('ngModel'); + var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel; if (mousewheel) { @@ -295,14 +300,23 @@ angular.module('ui.bootstrap.timepicker', []) ngModelCtrl.$setValidity('time', false); if (angular.isDefined(invalidHours)) { $scope.invalidHours = invalidHours; + if (hoursModelCtrl) { + hoursModelCtrl.$setValidity('hours', false); + } } if (angular.isDefined(invalidMinutes)) { $scope.invalidMinutes = invalidMinutes; + if (minutesModelCtrl) { + minutesModelCtrl.$setValidity('minutes', false); + } } if (angular.isDefined(invalidSeconds)) { $scope.invalidSeconds = invalidSeconds; + if (secondsModelCtrl) { + secondsModelCtrl.$setValidity('seconds', false); + } } }; @@ -425,6 +439,18 @@ angular.module('ui.bootstrap.timepicker', []) } function makeValid() { + if (hoursModelCtrl) { + hoursModelCtrl.$setValidity('hours', true); + } + + if (minutesModelCtrl) { + minutesModelCtrl.$setValidity('minutes', true); + } + + if (secondsModelCtrl) { + secondsModelCtrl.$setValidity('seconds', true); + } + ngModelCtrl.$setValidity('time', true); $scope.invalidHours = false; $scope.invalidMinutes = false;