@@ -56,6 +56,8 @@ const CLASS_NAME_DROPDOWN = 'date-picker-dropdown'
56
56
const CLASS_NAME_INDICATOR = 'date-picker-indicator'
57
57
const CLASS_NAME_INPUT = 'date-picker-input'
58
58
const CLASS_NAME_INPUT_GROUP = 'date-picker-input-group'
59
+ const CLASS_NAME_INPUT_PREVIEW = 'date-picker-input-preview'
60
+ const CLASS_NAME_INPUT_WRAPPER = 'date-picker-input-wrapper'
59
61
const CLASS_NAME_IS_INVALID = 'is-invalid'
60
62
const CLASS_NAME_IS_VALID = 'is-valid'
61
63
const CLASS_NAME_FOOTER = 'date-picker-footer'
@@ -199,15 +201,17 @@ class DateRangePicker extends BaseComponent {
199
201
this . _calendar = null
200
202
this . _calendars = null
201
203
this . _endInput = null
204
+ this . _endInputTimeout = null
205
+ this . _endPreviewInput = null
202
206
this . _indicatorElement = null
203
207
this . _menu = null
204
208
this . _startInput = null
209
+ this . _startInputTimeout = null
210
+ this . _startPreviewInput = null
205
211
this . _timepickers = null
206
212
this . _timePickerEnd = null
207
213
this . _timePickerStart = null
208
214
this . _togglerElement = null
209
- this . _startInputTimeout = null
210
- this . _endInputTimeout = null
211
215
212
216
this . _createDateRangePicker ( )
213
217
this . _createDateRangePickerCalendars ( )
@@ -368,24 +372,18 @@ class DateRangePicker extends BaseComponent {
368
372
this . _startInputTimeout = setTimeout ( ( ) => {
369
373
const date = this . _parseDate ( event . target . value )
370
374
371
- if ( date === 'invalid' ) {
372
- this . _startDate = null
373
- this . _calendar . update ( this . _getCalendarConfig ( ) )
374
- }
375
-
376
- // valid date or empty date
377
- if ( ( date instanceof Date && ! Number . isNaN ( date ) ) || ( date === null ) ) {
378
- // Check if the date is disabled
379
- if ( date && isDateDisabled ( date , this . _config . minDate , this . _config . maxDate , this . _config . disabledDates ) ) {
375
+ if ( date instanceof Date && date . getTime ( ) ) {
376
+ if ( isDateDisabled ( date , this . _config . minDate , this . _config . maxDate , this . _config . disabledDates ) ) {
380
377
return // Don't update if date is disabled
381
378
}
382
379
383
- this . _startInput . value = this . _setInputValue ( date )
384
- this . _startDate = date
385
380
this . _calendarDate = date
386
- this . _calendar . update ( this . _getCalendarConfig ( ) )
381
+ this . _startInput . value = this . _setInputValue ( date )
387
382
}
388
383
384
+ this . _startDate = date
385
+ this . _calendar . update ( this . _getCalendarConfig ( ) )
386
+
389
387
EventHandler . trigger ( this . _element , EVENT_START_DATE_CHANGE , {
390
388
date
391
389
} )
@@ -427,24 +425,18 @@ class DateRangePicker extends BaseComponent {
427
425
this . _endInputTimeout = setTimeout ( ( ) => {
428
426
const date = this . _parseDate ( event . target . value )
429
427
430
- if ( date === 'invalid' ) {
431
- this . _endDate = null
432
- this . _calendar . update ( this . _getCalendarConfig ( ) )
433
- }
434
-
435
- // valid date or empty date
436
- if ( ( date instanceof Date && ! Number . isNaN ( date ) ) || ( date === null ) ) {
437
- // Check if the date is disabled
428
+ if ( date instanceof Date && date . getTime ( ) ) {
438
429
if ( date && isDateDisabled ( date , this . _config . minDate , this . _config . maxDate , this . _config . disabledDates ) ) {
439
430
return // Don't update if date is disabled
440
431
}
441
432
442
- this . _endInput . value = this . _setInputValue ( date )
443
- this . _endDate = date
444
433
this . _calendarDate = date
445
- this . _calendar . update ( this . _getCalendarConfig ( ) )
434
+ this . _endInput . value = this . _setInputValue ( date )
446
435
}
447
436
437
+ this . _endDate = date
438
+ this . _calendar . update ( this . _getCalendarConfig ( ) )
439
+
448
440
EventHandler . trigger ( this . _element , EVENT_END_DATE_CHANGE , {
449
441
date
450
442
} )
@@ -474,14 +466,17 @@ class DateRangePicker extends BaseComponent {
474
466
}
475
467
} )
476
468
477
- if ( this . _config . previewDateOnHover ) {
469
+ if ( this . _config . previewDateOnHover && ! this . _config . disabled ) {
478
470
EventHandler . on ( calendar , 'cellHover.coreui.calendar' , event => {
479
471
if ( this . _selectEndDate ) {
480
- this . _endInput . value = event . date ? this . _setInputValue ( event . date ) : this . _setInputValue ( this . _endDate )
472
+ const previewValue = event . date ? this . _setInputValue ( event . date ) : this . _setInputValue ( this . _endDate )
473
+ this . _updatePreviewInputVisibility ( this . _endPreviewInput , event . date ? previewValue : '' )
474
+
481
475
return
482
476
}
483
477
484
- this . _startInput . value = event . date ? this . _setInputValue ( event . date ) : this . _setInputValue ( this . _startDate )
478
+ const previewValue = event . date ? this . _setInputValue ( event . date ) : this . _setInputValue ( this . _startDate )
479
+ this . _updatePreviewInputVisibility ( this . _startPreviewInput , event . date ? previewValue : '' )
485
480
} )
486
481
}
487
482
@@ -590,6 +585,48 @@ class DateRangePicker extends BaseComponent {
590
585
this . _menu = dropdownEl
591
586
}
592
587
588
+ _updatePreviewInputVisibility ( previewInput , value ) {
589
+ if ( ! previewInput ) {
590
+ return
591
+ }
592
+
593
+ if ( value && value . trim ( ) !== '' ) {
594
+ previewInput . style . display = 'block'
595
+ previewInput . value = value
596
+ } else {
597
+ previewInput . style . display = 'none'
598
+ previewInput . value = ''
599
+ }
600
+ }
601
+
602
+ _createInputWrapper ( inputEl , isStart = true ) {
603
+ if ( ! this . _config . previewDateOnHover || this . _config . disabled ) {
604
+ return inputEl
605
+ }
606
+
607
+ const wrapperEl = document . createElement ( 'div' )
608
+ wrapperEl . classList . add ( CLASS_NAME_INPUT_WRAPPER )
609
+
610
+ wrapperEl . append ( inputEl )
611
+
612
+ const previewInputEl = document . createElement ( 'input' )
613
+ previewInputEl . classList . add ( CLASS_NAME_INPUT , CLASS_NAME_INPUT_PREVIEW )
614
+ previewInputEl . type = 'text'
615
+ previewInputEl . readOnly = true
616
+ previewInputEl . tabIndex = - 1
617
+ previewInputEl . style . display = 'none'
618
+
619
+ if ( isStart ) {
620
+ this . _startPreviewInput = previewInputEl
621
+ } else {
622
+ this . _endPreviewInput = previewInputEl
623
+ }
624
+
625
+ wrapperEl . append ( previewInputEl )
626
+
627
+ return wrapperEl
628
+ }
629
+
593
630
_createDateRangePickerInputGroup ( ) {
594
631
const inputGroupEl = document . createElement ( 'div' )
595
632
inputGroupEl . classList . add ( CLASS_NAME_INPUT_GROUP )
@@ -616,14 +653,16 @@ class DateRangePicker extends BaseComponent {
616
653
this . _startInput = startInputEl
617
654
this . _endInput = endInputEl
618
655
619
- inputGroupEl . append ( startInputEl )
656
+ const startInputWrapper = this . _createInputWrapper ( startInputEl , true )
657
+ inputGroupEl . append ( startInputWrapper )
620
658
621
659
if ( this . _config . separator ) {
622
660
inputGroupEl . append ( inputGroupTextSeparatorEl )
623
661
}
624
662
625
663
if ( this . _config . range ) {
626
- inputGroupEl . append ( endInputEl )
664
+ const endInputWrapper = this . _createInputWrapper ( endInputEl , false )
665
+ inputGroupEl . append ( endInputWrapper )
627
666
}
628
667
629
668
if ( this . _config . indicator ) {
@@ -712,13 +751,8 @@ class DateRangePicker extends BaseComponent {
712
751
} )
713
752
714
753
EventHandler . on ( calendarEl , 'calendarMouseleave.coreui.calendar' , ( ) => {
715
- if ( this . _startDate ) {
716
- this . _startInput . value = this . _setInputValue ( this . _startDate )
717
- }
718
-
719
- if ( this . _endDate ) {
720
- this . _endInput . value = this . _setInputValue ( this . _endDate )
721
- }
754
+ this . _updatePreviewInputVisibility ( this . _startPreviewInput , '' )
755
+ this . _updatePreviewInputVisibility ( this . _endPreviewInput , '' )
722
756
} )
723
757
724
758
if ( this . _config . timepicker ) {
0 commit comments