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

Commit f3d263e

Browse files
Slimmmowesleycho
authored andcommitted
feat(datepicker): add support for dynamic min-mode and max-mode
- This adds support for dynamic `min-mode` and `max-mode` Closes #3843 Fixes #2618
1 parent abfd26c commit f3d263e

File tree

2 files changed

+53
-6
lines changed

2 files changed

+53
-6
lines changed

src/datepicker/datepicker.js

+18-4
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
2929

3030
// Configuration attributes
3131
angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle',
32-
'minMode', 'maxMode', 'showWeeks', 'startingDay', 'yearRange', 'shortcutPropagation'], function( key, index ) {
33-
self[key] = angular.isDefined($attrs[key]) ? (index < 8 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : datepickerConfig[key];
32+
'showWeeks', 'startingDay', 'yearRange', 'shortcutPropagation'], function( key, index ) {
33+
self[key] = angular.isDefined($attrs[key]) ? (index < 6 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : datepickerConfig[key];
3434
});
3535

3636
// Watchable date attributes
@@ -45,8 +45,22 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
4545
}
4646
});
4747

48+
angular.forEach(['minMode', 'maxMode'], function( key ) {
49+
if ( $attrs[key] ) {
50+
$scope.$parent.$watch($parse($attrs[key]), function(value) {
51+
self[key] = angular.isDefined(value) ? value : $attrs[key];
52+
$scope[key] = self[key];
53+
if ((key == 'minMode' && self.modes.indexOf( $scope.datepickerMode ) < self.modes.indexOf( self[key] )) || (key == 'maxMode' && self.modes.indexOf( $scope.datepickerMode ) > self.modes.indexOf( self[key] ))) {
54+
$scope.datepickerMode = self[key];
55+
}
56+
});
57+
} else {
58+
self[key] = datepickerConfig[key] || null;
59+
$scope[key] = self[key];
60+
}
61+
});
62+
4863
$scope.datepickerMode = $scope.datepickerMode || datepickerConfig.datepickerMode;
49-
$scope.maxMode = self.maxMode;
5064
$scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000);
5165

5266
if(angular.isDefined($attrs.initDate)) {
@@ -562,7 +576,7 @@ function ($compile, $parse, $document, $rootScope, $position, dateFilter, datePa
562576
}
563577

564578
scope.watchData = {};
565-
angular.forEach(['minDate', 'maxDate', 'datepickerMode', 'initDate', 'shortcutPropagation'], function( key ) {
579+
angular.forEach(['minMode', 'maxMode', 'minDate', 'maxDate', 'datepickerMode', 'initDate', 'shortcutPropagation'], function( key ) {
566580
if ( attrs[key] ) {
567581
var getAttribute = $parse(attrs[key]);
568582
scope.$parent.$watch(getAttribute, function(value){

src/datepicker/test/datepicker.spec.js

+35-2
Original file line numberDiff line numberDiff line change
@@ -2171,7 +2171,8 @@ describe('datepicker directive', function () {
21712171
beforeEach(inject(function() {
21722172
$rootScope.date = new Date('August 11, 2013');
21732173
$rootScope.mode = 'month';
2174-
element = $compile('<datepicker ng-model="date" min-mode="month" datepicker-mode="mode"></datepicker>')($rootScope);
2174+
$rootScope.minMode = 'month';
2175+
element = $compile('<datepicker ng-model="date" min-mode="minMode" datepicker-mode="mode"></datepicker>')($rootScope);
21752176
$rootScope.$digest();
21762177
}));
21772178

@@ -2181,13 +2182,25 @@ describe('datepicker directive', function () {
21812182
expect(getTitle()).toBe('2013');
21822183
clickTitleButton();
21832184
expect(getTitle()).toBe('2001 - 2020');
2185+
$rootScope.minMode = 'year';
2186+
$rootScope.$digest();
2187+
clickOption( 5 );
2188+
expect(getTitle()).toBe('2001 - 2020');
2189+
});
2190+
2191+
it('updates current mode if necessary', function() {
2192+
expect(getTitle()).toBe('2013');
2193+
$rootScope.minMode = 'year';
2194+
$rootScope.$digest();
2195+
expect(getTitle()).toBe('2001 - 2020');
21842196
});
21852197
});
21862198

21872199
describe('`max-mode`', function () {
21882200
beforeEach(inject(function() {
21892201
$rootScope.date = new Date('August 11, 2013');
2190-
element = $compile('<datepicker ng-model="date" max-mode="month"></datepicker>')($rootScope);
2202+
$rootScope.maxMode = 'month';
2203+
element = $compile('<datepicker ng-model="date" max-mode="maxMode"></datepicker>')($rootScope);
21912204
$rootScope.$digest();
21922205
}));
21932206

@@ -2197,6 +2210,12 @@ describe('datepicker directive', function () {
21972210
expect(getTitle()).toBe('2013');
21982211
clickTitleButton();
21992212
expect(getTitle()).toBe('2013');
2213+
clickOption( 10 );
2214+
expect(getTitle()).toBe('November 2013');
2215+
$rootScope.maxMode = 'day';
2216+
$rootScope.$digest();
2217+
clickTitleButton();
2218+
expect(getTitle()).toBe('November 2013');
22002219
});
22012220

22022221
it('disables the title button at it', function() {
@@ -2205,6 +2224,20 @@ describe('datepicker directive', function () {
22052224
expect(getTitleButton().prop('disabled')).toBe(true);
22062225
clickTitleButton();
22072226
expect(getTitleButton().prop('disabled')).toBe(true);
2227+
clickOption( 10 );
2228+
expect(getTitleButton().prop('disabled')).toBe(false);
2229+
$rootScope.maxMode = 'day';
2230+
$rootScope.$digest();
2231+
expect(getTitleButton().prop('disabled')).toBe(true);
2232+
});
2233+
2234+
it('updates current mode if necessary', function() {
2235+
expect(getTitle()).toBe('August 2013');
2236+
clickTitleButton();
2237+
expect(getTitle()).toBe('2013');
2238+
$rootScope.maxMode = 'day';
2239+
$rootScope.$digest();
2240+
expect(getTitle()).toBe('August 2013');
22082241
});
22092242
});
22102243

0 commit comments

Comments
 (0)