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

Commit 38086ab

Browse files
committed
feat(datepicker): move datepicker mode to options
- Fully move datepickerMode support to options, deprecate attribute usage
1 parent 3c0a7cd commit 38086ab

File tree

2 files changed

+75
-15
lines changed

2 files changed

+75
-15
lines changed

Diff for: src/datepicker/datepicker.js

+34-15
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
2727
var self = this,
2828
ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl;
2929
ngModelOptions = {},
30-
watchListeners = [];
30+
watchListeners = [],
31+
optionsUsed = !!$attrs.datepickerOptions;
3132

3233
// Modes chain
3334
this.modes = ['day', 'month', 'year'];
3435

35-
if ($attrs.datepickerOptions) {
36-
angular.forEach([
36+
if (optionsUsed) {
37+
[
38+
'datepickerMode',
3739
'formatDay',
3840
'formatDayHeader',
3941
'formatDayTitle',
@@ -50,15 +52,21 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
5052
'startingDay',
5153
'yearColumns',
5254
'yearRows'
53-
], function(key) {
55+
].forEach(function(key) {
5456
switch (key) {
57+
case 'datepickerMode':
58+
$scope.datepickerMode = angular.isDefined($scope.datepickerOptions.datepickerMode) ?
59+
$scope.datepickerOptions.datepickerMode : datepickerConfig.datepickerMode;
60+
break;
5561
case 'formatDay':
5662
case 'formatDayHeader':
5763
case 'formatDayTitle':
5864
case 'formatMonth':
5965
case 'formatMonthTitle':
6066
case 'formatYear':
61-
self[key] = angular.isDefined($scope.datepickerOptions[key]) ? $interpolate($scope.datepickerOptions[key])($scope.$parent) : datepickerConfig[key];
67+
self[key] = angular.isDefined($scope.datepickerOptions[key]) ?
68+
$interpolate($scope.datepickerOptions[key])($scope.$parent) :
69+
datepickerConfig[key];
6270
break;
6371
case 'showWeeks':
6472
case 'shortcutPropagation':
@@ -103,9 +111,10 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
103111
if ($scope.datepickerOptions[key]) {
104112
$scope.$watch(function() { return $scope.datepickerOptions[key]; }, function(value) {
105113
self[key] = $scope[key] = angular.isDefined(value) ? value : datepickerOptions[key];
106-
if (key === 'minMode' && self.modes.indexOf($scope.datepickerMode) < self.modes.indexOf(self[key]) ||
107-
key === 'maxMode' && self.modes.indexOf($scope.datepickerMode) > self.modes.indexOf(self[key])) {
114+
if (key === 'minMode' && self.modes.indexOf($scope.datepickerOptions.datepickerMode) < self.modes.indexOf(self[key]) ||
115+
key === 'maxMode' && self.modes.indexOf($scope.datepickerOptions.datepickerMode) > self.modes.indexOf(self[key])) {
108116
$scope.datepickerMode = self[key];
117+
$scope.datepickerOptions.datepickerMode = self[key];
109118
}
110119
});
111120
} else {
@@ -217,10 +226,15 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
217226
} else {
218227
this.activeDate = new Date();
219228
}
229+
230+
if ($attrs.datepickerMode && datepickerAttributeWarning) {
231+
$log.warn('uib-datepicker datepickerMode attribute usage is deprecated, use datepicker-options attribute instead');
232+
}
233+
234+
$scope.datepickerMode = $scope.datepickerMode ||
235+
datepickerConfig.datepickerMode;
220236
}
221237

222-
$scope.datepickerMode = $scope.datepickerMode ||
223-
datepickerConfig.datepickerMode;
224238
$scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000);
225239

226240
$scope.disabled = angular.isDefined($attrs.disabled) || false;
@@ -331,7 +345,8 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
331345
ngModelCtrl.$render();
332346
} else {
333347
self.activeDate = date;
334-
$scope.datepickerMode = self.modes[self.modes.indexOf($scope.datepickerMode) - 1];
348+
setMode(self.modes[self.modes.indexOf($scope.datepickerMode) - 1]);
349+
335350
$scope.$emit('uib:datepicker.mode');
336351
}
337352
};
@@ -351,7 +366,8 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
351366
return;
352367
}
353368

354-
$scope.datepickerMode = self.modes[self.modes.indexOf($scope.datepickerMode) + direction];
369+
setMode(self.modes[self.modes.indexOf($scope.datepickerMode) + direction]);
370+
355371
$scope.$emit('uib:datepicker.mode');
356372
};
357373

@@ -396,6 +412,13 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
396412
watchListeners.shift()();
397413
}
398414
});
415+
416+
function setMode(mode) {
417+
$scope.datepickerMode = mode;
418+
if (optionsUsed) {
419+
$scope.datepickerOptions.datepickerMode = mode;
420+
}
421+
}
399422
}])
400423

401424
.controller('UibDaypickerController', ['$scope', '$element', 'dateFilter', function(scope, $element, dateFilter) {
@@ -833,10 +856,6 @@ function($scope, $element, $attrs, $compile, $log, $parse, $window, $document, $
833856

834857
if ($scope.datepickerOptions) {
835858
datepickerEl.attr('datepicker-options', 'datepickerOptions');
836-
837-
if (angular.isDefined($scope.datepickerOptions.datepickerMode)) {
838-
datepickerEl.attr('datepicker-mode', 'datepickerOptions.datepickerMode');
839-
}
840859
}
841860

842861
angular.forEach(['minMode', 'maxMode', 'datepickerMode', 'shortcutPropagation'], function(key) {

Diff for: src/datepicker/test/datepicker.spec.js

+41
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,47 @@ describe('datepicker', function() {
230230
expect($log.warn).not.toHaveBeenCalled();
231231
});
232232

233+
it('should log warning for datepickerMode attribute usage', function() {
234+
inject(function(_$log_, _$rootScope_, _$compile_) {
235+
$log = _$log_;
236+
$scope = _$rootScope_.$new();
237+
$compile = _$compile_;
238+
});
239+
240+
$scope.locals = {
241+
date: new Date(),
242+
mode: 'day'
243+
};
244+
245+
spyOn($log, 'warn');
246+
element = $compile('<uib-datepicker ng-model="locals.date" datepicker-mode="mode"></uib-datepicker>')($scope);
247+
$scope.$digest();
248+
249+
expect($log.warn).toHaveBeenCalledWith('uib-datepicker datepickerMode attribute usage is deprecated, use datepicker-options attribute instead');
250+
});
251+
252+
it('should suppress warning for datepickerMode attribute usage', function() {
253+
module(function($provide) {
254+
$provide.value('uibDatepickerAttributeWarning', false);
255+
});
256+
inject(function(_$log_, _$rootScope_, _$compile_) {
257+
$log = _$log_;
258+
$scope = _$rootScope_.$new();
259+
$compile = _$compile_;
260+
});
261+
262+
$scope.locals = {
263+
date: new Date(),
264+
mode: 'day'
265+
};
266+
267+
spyOn($log, 'warn');
268+
element = $compile('<uib-datepicker ng-model="locals.date" datepicker-mode="mode"></uib-datepicker>')($scope);
269+
$scope.$digest();
270+
271+
expect($log.warn).not.toHaveBeenCalled();
272+
});
273+
233274
it('should log warning for formatDay attribute usage', function() {
234275
inject(function(_$log_, _$rootScope_, _$compile_) {
235276
$log = _$log_;

0 commit comments

Comments
 (0)