@@ -104,7 +104,7 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
104
104
$scope . $watch ( 'datepickerOptions.' + key , function ( value ) {
105
105
if ( value ) {
106
106
if ( angular . isDate ( value ) ) {
107
- self [ key ] = dateParser . fromTimezone ( new Date ( value ) , ngModelOptions . timezone ) ;
107
+ self [ key ] = dateParser . fromTimezone ( new Date ( value ) , ngModelOptions . getOption ( ' timezone' ) ) ;
108
108
} else {
109
109
if ( $datepickerLiteralWarning ) {
110
110
$log . warn ( 'Literal date support has been deprecated, please switch to date object usage' ) ;
@@ -114,7 +114,7 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
114
114
}
115
115
} else {
116
116
self [ key ] = datepickerConfig [ key ] ?
117
- dateParser . fromTimezone ( new Date ( datepickerConfig [ key ] ) , ngModelOptions . timezone ) :
117
+ dateParser . fromTimezone ( new Date ( datepickerConfig [ key ] ) , ngModelOptions . getOption ( ' timezone' ) ) :
118
118
null ;
119
119
}
120
120
@@ -161,14 +161,13 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
161
161
162
162
this . init = function ( ngModelCtrl_ ) {
163
163
ngModelCtrl = ngModelCtrl_ ;
164
- ngModelOptions = ngModelCtrl_ . $options ||
165
- $scope . datepickerOptions . ngModelOptions ||
166
- datepickerConfig . ngModelOptions ;
164
+ ngModelOptions = extractOptions ( ngModelCtrl ) ;
165
+
167
166
if ( $scope . datepickerOptions . initDate ) {
168
- self . activeDate = dateParser . fromTimezone ( $scope . datepickerOptions . initDate , ngModelOptions . timezone ) || new Date ( ) ;
167
+ self . activeDate = dateParser . fromTimezone ( $scope . datepickerOptions . initDate , ngModelOptions . getOption ( ' timezone' ) ) || new Date ( ) ;
169
168
$scope . $watch ( 'datepickerOptions.initDate' , function ( initDate ) {
170
169
if ( initDate && ( ngModelCtrl . $isEmpty ( ngModelCtrl . $modelValue ) || ngModelCtrl . $invalid ) ) {
171
- self . activeDate = dateParser . fromTimezone ( initDate , ngModelOptions . timezone ) ;
170
+ self . activeDate = dateParser . fromTimezone ( initDate , ngModelOptions . getOption ( ' timezone' ) ) ;
172
171
self . refreshView ( ) ;
173
172
}
174
173
} ) ;
@@ -178,8 +177,8 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
178
177
179
178
var date = ngModelCtrl . $modelValue ? new Date ( ngModelCtrl . $modelValue ) : new Date ( ) ;
180
179
this . activeDate = ! isNaN ( date ) ?
181
- dateParser . fromTimezone ( date , ngModelOptions . timezone ) :
182
- dateParser . fromTimezone ( new Date ( ) , ngModelOptions . timezone ) ;
180
+ dateParser . fromTimezone ( date , ngModelOptions . getOption ( ' timezone' ) ) :
181
+ dateParser . fromTimezone ( new Date ( ) , ngModelOptions . getOption ( ' timezone' ) ) ;
183
182
184
183
ngModelCtrl . $render = function ( ) {
185
184
self . render ( ) ;
@@ -192,7 +191,7 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
192
191
isValid = ! isNaN ( date ) ;
193
192
194
193
if ( isValid ) {
195
- this . activeDate = dateParser . fromTimezone ( date , ngModelOptions . timezone ) ;
194
+ this . activeDate = dateParser . fromTimezone ( date , ngModelOptions . getOption ( ' timezone' ) ) ;
196
195
} else if ( ! $datepickerSuppressError ) {
197
196
$log . error ( 'Datepicker directive: "ng-model" value must be a Date object' ) ;
198
197
}
@@ -209,17 +208,17 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
209
208
}
210
209
211
210
var date = ngModelCtrl . $viewValue ? new Date ( ngModelCtrl . $viewValue ) : null ;
212
- date = dateParser . fromTimezone ( date , ngModelOptions . timezone ) ;
211
+ date = dateParser . fromTimezone ( date , ngModelOptions . getOption ( ' timezone' ) ) ;
213
212
ngModelCtrl . $setValidity ( 'dateDisabled' , ! date ||
214
213
this . element && ! this . isDisabled ( date ) ) ;
215
214
}
216
215
} ;
217
216
218
217
this . createDateObject = function ( date , format ) {
219
218
var model = ngModelCtrl . $viewValue ? new Date ( ngModelCtrl . $viewValue ) : null ;
220
- model = dateParser . fromTimezone ( model , ngModelOptions . timezone ) ;
219
+ model = dateParser . fromTimezone ( model , ngModelOptions . getOption ( ' timezone' ) ) ;
221
220
var today = new Date ( ) ;
222
- today = dateParser . fromTimezone ( today , ngModelOptions . timezone ) ;
221
+ today = dateParser . fromTimezone ( today , ngModelOptions . getOption ( ' timezone' ) ) ;
223
222
var time = this . compare ( date , today ) ;
224
223
var dt = {
225
224
date : date ,
@@ -265,9 +264,9 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
265
264
266
265
$scope . select = function ( date ) {
267
266
if ( $scope . datepickerMode === self . minMode ) {
268
- var dt = ngModelCtrl . $viewValue ? dateParser . fromTimezone ( new Date ( ngModelCtrl . $viewValue ) , ngModelOptions . timezone ) : new Date ( 0 , 0 , 0 , 0 , 0 , 0 , 0 ) ;
267
+ var dt = ngModelCtrl . $viewValue ? dateParser . fromTimezone ( new Date ( ngModelCtrl . $viewValue ) , ngModelOptions . getOption ( ' timezone' ) ) : new Date ( 0 , 0 , 0 , 0 , 0 , 0 , 0 ) ;
269
268
dt . setFullYear ( date . getFullYear ( ) , date . getMonth ( ) , date . getDate ( ) ) ;
270
- dt = dateParser . toTimezone ( dt , ngModelOptions . timezone ) ;
269
+ dt = dateParser . toTimezone ( dt , ngModelOptions . getOption ( ' timezone' ) ) ;
271
270
ngModelCtrl . $setViewValue ( dt ) ;
272
271
ngModelCtrl . $render ( ) ;
273
272
} else {
@@ -352,6 +351,37 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
352
351
$scope . datepickerMode = mode ;
353
352
$scope . datepickerOptions . datepickerMode = mode ;
354
353
}
354
+
355
+ function extractOptions ( ngModelCtrl ) {
356
+ var ngModelOptions ;
357
+
358
+ if ( angular . version . minor < 6 ) { // in angular < 1.6 $options could be missing
359
+ // guarantee a value
360
+ ngModelOptions = ngModelCtrl . $options ||
361
+ $scope . datepickerOptions . ngModelOptions ||
362
+ datepickerConfig . ngModelOptions ||
363
+ { } ;
364
+
365
+ // mimic 1.6+ api
366
+ ngModelOptions . getOption = function ( key ) {
367
+ return ngModelOptions [ key ] ;
368
+ } ;
369
+ } else { // in angular >=1.6 $options is always present
370
+ // ng-model-options defaults timezone to null; don't let its precedence squash a non-null value
371
+ var timezone = ngModelCtrl . $options . getOption ( 'timezone' ) ||
372
+ ( $scope . datepickerOptions . ngModelOptions ? $scope . datepickerOptions . ngModelOptions . timezone : null ) ||
373
+ ( datepickerConfig . ngModelOptions ? datepickerConfig . ngModelOptions . timezone : null ) ;
374
+
375
+ // values passed to createChild override existing values
376
+ ngModelOptions = ngModelCtrl . $options // start with a ModelOptions instance
377
+ . createChild ( datepickerConfig . ngModelOptions ) // lowest precedence
378
+ . createChild ( $scope . datepickerOptions . ngModelOptions )
379
+ . createChild ( ngModelCtrl . $options ) // highest precedence
380
+ . createChild ( { timezone : timezone } ) ; // to keep from squashing a non-null value
381
+ }
382
+
383
+ return ngModelOptions ;
384
+ }
355
385
} ] )
356
386
357
387
. controller ( 'UibDaypickerController' , [ '$scope' , '$element' , 'dateFilter' , function ( scope , $element , dateFilter ) {
0 commit comments