Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit fe69386

Browse files
committed
feat(timepicker): add model state support
- Adds support for the timepicker model $touched and $dirty states Closes #3527 Closes #4835
1 parent 703432b commit fe69386

File tree

3 files changed

+66
-5
lines changed

3 files changed

+66
-5
lines changed

src/timepicker/test/timepicker.spec.js

+53-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
describe('timepicker directive', function() {
2-
var $rootScope, $compile, $templateCache, element;
2+
var $rootScope, $compile, $templateCache, element, modelCtrl;
33

44
beforeEach(module('ui.bootstrap.timepicker'));
55
beforeEach(module('template/timepicker/timepicker.html'));
@@ -11,6 +11,8 @@ describe('timepicker directive', function() {
1111

1212
element = $compile('<uib-timepicker ng-model="time"></uib-timepicker>')($rootScope);
1313
$rootScope.$digest();
14+
15+
modelCtrl = element.controller('ngModel');
1416
}));
1517

1618
function newTime(hours, minutes, seconds) {
@@ -117,7 +119,11 @@ describe('timepicker directive', function() {
117119
});
118120

119121
it('should be pristine', function() {
120-
expect(element.controller('ngModel').$pristine).toBe(true);
122+
expect(modelCtrl.$pristine).toBe(true);
123+
});
124+
125+
it('should be untouched', function() {
126+
expect(modelCtrl.$untouched).toBe(true);
121127
});
122128

123129
it('has `selected` current time when model is initially cleared', function() {
@@ -192,6 +198,51 @@ describe('timepicker directive', function() {
192198
expect(getModelState()).toEqual([14, 40, 24]);
193199
});
194200

201+
it('should be dirty when input changes', function() {
202+
var upHours = getHoursButton(true);
203+
var upMinutes = getMinutesButton(true);
204+
var upSeconds = getSecondsButton(true);
205+
206+
doClick(upHours);
207+
expect(modelCtrl.$dirty).toBe(true);
208+
209+
modelCtrl.$setPristine();
210+
211+
doClick(upMinutes);
212+
expect(modelCtrl.$dirty).toBe(true);
213+
214+
modelCtrl.$setPristine();
215+
216+
doClick(upSeconds);
217+
expect(modelCtrl.$dirty).toBe(true);
218+
});
219+
220+
it('should be touched when input blurs', function() {
221+
var inputs = element.find('input');
222+
var hoursInput = inputs.eq(0),
223+
minutesInput = inputs.eq(1),
224+
secondsInput = inputs.eq(2);
225+
226+
hoursInput.val(12);
227+
$rootScope.$digest();
228+
hoursInput.blur();
229+
expect(modelCtrl.$touched).toBe(true);
230+
231+
modelCtrl.$setUntouched();
232+
233+
minutesInput.val(20);
234+
$rootScope.$digest();
235+
hoursInput.blur();
236+
expect(modelCtrl.$touched).toBe(true);
237+
238+
modelCtrl.$setUntouched();
239+
240+
secondsInput.val(9);
241+
$rootScope.$digest();
242+
hoursInput.blur();
243+
expect(modelCtrl.$touched).toBe(true);
244+
});
245+
195246
it('meridian button has correct type', function() {
196247
var button = getMeridianButton();
197248
expect(button.attr('type')).toBe('button');

src/timepicker/timepicker.js

+10
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,8 @@ angular.module('ui.bootstrap.timepicker', [])
301301
var hours = getHoursFromTemplate(),
302302
minutes = getMinutesFromTemplate();
303303

304+
ngModelCtrl.$setDirty();
305+
304306
if (angular.isDefined(hours) && angular.isDefined(minutes)) {
305307
selected.setHours(hours);
306308
selected.setMinutes(minutes);
@@ -329,6 +331,8 @@ angular.module('ui.bootstrap.timepicker', [])
329331
var minutes = getMinutesFromTemplate(),
330332
hours = getHoursFromTemplate();
331333

334+
ngModelCtrl.$setDirty();
335+
332336
if (angular.isDefined(minutes) && angular.isDefined(hours)) {
333337
selected.setHours(hours);
334338
selected.setMinutes(minutes);
@@ -356,6 +360,8 @@ angular.module('ui.bootstrap.timepicker', [])
356360
$scope.updateSeconds = function() {
357361
var seconds = getSecondsFromTemplate();
358362

363+
ngModelCtrl.$setDirty();
364+
359365
if (angular.isDefined(seconds)) {
360366
selected.setSeconds(seconds);
361367
refresh('s');
@@ -505,6 +511,10 @@ angular.module('ui.bootstrap.timepicker', [])
505511
}
506512
}
507513
};
514+
515+
$scope.blur = function() {
516+
ngModelCtrl.$setTouched();
517+
};
508518
}])
509519

510520
.directive('uibTimepicker', function() {

template/timepicker/timepicker.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010
</tr>
1111
<tr>
1212
<td class="form-group" ng-class="{'has-error': invalidHours}">
13-
<input style="width:50px;" type="text" placeholder="HH" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="disabled">
13+
<input style="width:50px;" type="text" placeholder="HH" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="disabled" ng-blur="blur()">
1414
</td>
1515
<td>:</td>
1616
<td class="form-group" ng-class="{'has-error': invalidMinutes}">
17-
<input style="width:50px;" type="text" placeholder="MM" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="disabled">
17+
<input style="width:50px;" type="text" placeholder="MM" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="disabled" ng-blur="blur()">
1818
</td>
1919
<td ng-show="showSeconds">:</td>
2020
<td class="form-group" ng-class="{'has-error': invalidSeconds}" ng-show="showSeconds">
21-
<input style="width:50px;" type="text" ng-model="seconds" ng-change="updateSeconds()" class="form-control text-center" ng-readonly="readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="disabled">
21+
<input style="width:50px;" type="text" ng-model="seconds" ng-change="updateSeconds()" class="form-control text-center" ng-readonly="readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="disabled" ng-blur="blur()">
2222
</td>
2323
<td ng-show="showMeridian"><button type="button" ng-class="{disabled: noToggleMeridian()}" class="btn btn-default text-center" ng-click="toggleMeridian()" ng-disabled="noToggleMeridian()" tabindex="{{::tabindex}}">{{meridian}}</button></td>
2424
</tr>

0 commit comments

Comments
 (0)