@@ -104,7 +104,7 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
104104 $scope . $watch ( 'datepickerOptions.' + key , function ( value ) {
105105 if ( value ) {
106106 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' ) ) ;
108108 } else {
109109 if ( $datepickerLiteralWarning ) {
110110 $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
114114 }
115115 } else {
116116 self [ key ] = datepickerConfig [ key ] ?
117- dateParser . fromTimezone ( new Date ( datepickerConfig [ key ] ) , ngModelOptions . timezone ) :
117+ dateParser . fromTimezone ( new Date ( datepickerConfig [ key ] ) , ngModelOptions . getOption ( ' timezone' ) ) :
118118 null ;
119119 }
120120
@@ -161,14 +161,13 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
161161
162162 this . init = function ( ngModelCtrl_ ) {
163163 ngModelCtrl = ngModelCtrl_ ;
164- ngModelOptions = ngModelCtrl_ . $options ||
165- $scope . datepickerOptions . ngModelOptions ||
166- datepickerConfig . ngModelOptions ;
164+ ngModelOptions = extractOptions ( ngModelCtrl ) ;
165+
167166 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 ( ) ;
169168 $scope . $watch ( 'datepickerOptions.initDate' , function ( initDate ) {
170169 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' ) ) ;
172171 self . refreshView ( ) ;
173172 }
174173 } ) ;
@@ -178,8 +177,8 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
178177
179178 var date = ngModelCtrl . $modelValue ? new Date ( ngModelCtrl . $modelValue ) : new Date ( ) ;
180179 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' ) ) ;
183182
184183 ngModelCtrl . $render = function ( ) {
185184 self . render ( ) ;
@@ -192,7 +191,7 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
192191 isValid = ! isNaN ( date ) ;
193192
194193 if ( isValid ) {
195- this . activeDate = dateParser . fromTimezone ( date , ngModelOptions . timezone ) ;
194+ this . activeDate = dateParser . fromTimezone ( date , ngModelOptions . getOption ( ' timezone' ) ) ;
196195 } else if ( ! $datepickerSuppressError ) {
197196 $log . error ( 'Datepicker directive: "ng-model" value must be a Date object' ) ;
198197 }
@@ -209,17 +208,17 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
209208 }
210209
211210 var date = ngModelCtrl . $viewValue ? new Date ( ngModelCtrl . $viewValue ) : null ;
212- date = dateParser . fromTimezone ( date , ngModelOptions . timezone ) ;
211+ date = dateParser . fromTimezone ( date , ngModelOptions . getOption ( ' timezone' ) ) ;
213212 ngModelCtrl . $setValidity ( 'dateDisabled' , ! date ||
214213 this . element && ! this . isDisabled ( date ) ) ;
215214 }
216215 } ;
217216
218217 this . createDateObject = function ( date , format ) {
219218 var model = ngModelCtrl . $viewValue ? new Date ( ngModelCtrl . $viewValue ) : null ;
220- model = dateParser . fromTimezone ( model , ngModelOptions . timezone ) ;
219+ model = dateParser . fromTimezone ( model , ngModelOptions . getOption ( ' timezone' ) ) ;
221220 var today = new Date ( ) ;
222- today = dateParser . fromTimezone ( today , ngModelOptions . timezone ) ;
221+ today = dateParser . fromTimezone ( today , ngModelOptions . getOption ( ' timezone' ) ) ;
223222 var time = this . compare ( date , today ) ;
224223 var dt = {
225224 date : date ,
@@ -265,9 +264,9 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
265264
266265 $scope . select = function ( date ) {
267266 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 ) ;
269268 dt . setFullYear ( date . getFullYear ( ) , date . getMonth ( ) , date . getDate ( ) ) ;
270- dt = dateParser . toTimezone ( dt , ngModelOptions . timezone ) ;
269+ dt = dateParser . toTimezone ( dt , ngModelOptions . getOption ( ' timezone' ) ) ;
271270 ngModelCtrl . $setViewValue ( dt ) ;
272271 ngModelCtrl . $render ( ) ;
273272 } else {
@@ -352,6 +351,37 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
352351 $scope . datepickerMode = mode ;
353352 $scope . datepickerOptions . datepickerMode = mode ;
354353 }
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+ }
355385} ] )
356386
357387. controller ( 'UibDaypickerController' , [ '$scope' , '$element' , 'dateFilter' , function ( scope , $element , dateFilter ) {
0 commit comments