@@ -18,7 +18,9 @@ import {
1818import IgcDateTimeInputComponent from '../date-time-input/date-time-input.js' ;
1919import { DateTimeUtil } from '../date-time-input/date-util.js' ;
2020import IgcInputComponent from '../input/input.js' ;
21- import IgcDateRangePickerComponent from './date-range-picker.js' ;
21+ import IgcDateRangePickerComponent , {
22+ type DateRangeValue ,
23+ } from './date-range-picker.js' ;
2224
2325describe ( 'Date range picker' , ( ) => {
2426 before ( ( ) => defineComponents ( IgcDateRangePickerComponent ) ) ;
@@ -103,7 +105,7 @@ describe('Date range picker', () => {
103105 } ) ;
104106
105107 it ( 'should be successfully initialized with value' , async ( ) => {
106- const expectedValue = [ today . native , tomorrow . native ] ;
108+ const expectedValue = { start : today . native , end : tomorrow . native } ;
107109 picker = await fixture < IgcDateRangePickerComponent > (
108110 html `< igc-date-range-picker
109111 .value ="${ expectedValue } "
@@ -163,7 +165,7 @@ describe('Date range picker', () => {
163165 } ) ;
164166 describe ( 'Properties' , ( ) => {
165167 it ( 'should set value through attribute correctly in case the date values are valid ISO 8601 strings' , async ( ) => {
166- const expectedValue = [ today . native , tomorrow . native ] ;
168+ const expectedValue = { start : today . native , end : tomorrow . native } ;
167169 const attributeValue = `${ today . native . toISOString ( ) } , ${ tomorrow . native . toISOString ( ) } ` ;
168170 picker = await fixture < IgcDateRangePickerComponent > (
169171 html `< igc-date-range-picker
@@ -176,7 +178,7 @@ describe('Date range picker', () => {
176178 } ) ;
177179
178180 it ( 'should keep the calendar selection and input values on changing the mode' , async ( ) => {
179- const expectedValue = [ today . native , tomorrow . native ] ;
181+ const expectedValue = { start : today . native , end : tomorrow . native } ;
180182 picker = await fixture < IgcDateRangePickerComponent > (
181183 html `< igc-date-range-picker
182184 .value ="${ expectedValue } "
@@ -192,7 +194,7 @@ describe('Date range picker', () => {
192194 } ) ;
193195
194196 it ( 'should keep the calendar selection and input values on switching to singleInput and back' , async ( ) => {
195- const expectedValue = [ today . native , tomorrow . native ] ;
197+ const expectedValue = { start : today . native , end : tomorrow . native } ;
196198 picker = await fixture < IgcDateRangePickerComponent > (
197199 html `< igc-date-range-picker
198200 .value ="${ expectedValue } "
@@ -272,7 +274,7 @@ describe('Date range picker', () => {
272274 await selectDates ( today , tomorrow , calendar ) ;
273275
274276 expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
275- checkSelectedRange ( picker , [ today . native , tomorrow . native ] ) ;
277+ checkSelectedRange ( picker , { start : today . native , end : tomorrow . native } ) ;
276278 expect ( picker . open ) . to . equal ( true ) ;
277279
278280 await picker . hide ( ) ;
@@ -284,23 +286,23 @@ describe('Date range picker', () => {
284286 await picker . show ( ) ;
285287 await selectDates ( today . add ( 'day' , 2 ) , tomorrow . add ( 'day' , 2 ) , calendar ) ;
286288
287- checkSelectedRange ( picker , [
288- today . add ( 'day' , 2 ) . native ,
289- tomorrow . add ( 'day' , 2 ) . native ,
290- ] ) ;
289+ checkSelectedRange ( picker , {
290+ start : today . add ( 'day' , 2 ) . native ,
291+ end : tomorrow . add ( 'day' , 2 ) . native ,
292+ } ) ;
291293 expect ( picker . open ) . to . equal ( true ) ;
292294 } ) ;
293295
294296 it ( 'should not modify value through selection or typing when readOnly is true' , async ( ) => {
295297 const eventSpy = spy ( picker , 'emitEvent' ) ;
296298 picker . readOnly = true ;
297299 await elementUpdated ( picker ) ;
298- expect ( picker . value ) . to . deep . equal ( [ null , null ] ) ; //TODO: refactor
300+ expect ( picker . value ) . to . deep . equal ( { start : null , end : null } ) ;
299301
300302 await picker . show ( ) ;
301303 await selectDates ( today , tomorrow , calendar ) ;
302304
303- expect ( picker . value ) . to . deep . equal ( [ null , null ] ) ;
305+ expect ( picker . value ) . to . deep . equal ( { start : null , end : null } ) ;
304306 expect ( calendar . values ) . to . deep . equal ( [ ] ) ;
305307 expect ( eventSpy ) . not . to . be . called ;
306308
@@ -312,7 +314,7 @@ describe('Date range picker', () => {
312314
313315 expect ( isFocused ( dateTimeInputs [ 0 ] ) ) . to . be . true ;
314316 expect ( dateTimeInputs [ 0 ] . value ) . to . equal ( null ) ;
315- expect ( picker . value ) . to . deep . equal ( [ null , null ] ) ;
317+ expect ( picker . value ) . to . deep . equal ( { start : null , end : null } ) ;
316318 expect ( calendar . values ) . to . deep . equal ( [ ] ) ;
317319 expect ( eventSpy ) . not . to . be . called ;
318320
@@ -324,7 +326,7 @@ describe('Date range picker', () => {
324326 calendar = picker . renderRoot . querySelector ( IgcCalendarComponent . tagName ) ! ;
325327 await selectDates ( today , tomorrow , calendar ) ;
326328
327- expect ( picker . value ) . to . deep . equal ( [ null , null ] ) ;
329+ expect ( picker . value ) . to . deep . equal ( { start : null , end : null } ) ;
328330 expect ( calendar . values ) . to . deep . equal ( [ ] ) ;
329331 expect ( eventSpy ) . not . to . be . called ;
330332 } ) ;
@@ -340,14 +342,14 @@ describe('Date range picker', () => {
340342
341343 expect ( isFocused ( dateTimeInputs [ 0 ] ) ) . to . be . true ;
342344 expect ( dateTimeInputs [ 0 ] . value ) . to . equal ( null ) ;
343- expect ( picker . value ) . to . deep . equal ( [ null , null ] ) ;
345+ expect ( picker . value ) . to . deep . equal ( { start : null , end : null } ) ;
344346 expect ( calendar . values ) . to . deep . equal ( [ ] ) ;
345347 expect ( eventSpy ) . not . to . be . called ;
346348
347349 await picker . show ( ) ;
348350 await selectDates ( today , tomorrow , calendar ) ;
349351
350- checkSelectedRange ( picker , [ today . native , tomorrow . native ] ) ;
352+ checkSelectedRange ( picker , { start : today . native , end : tomorrow . native } ) ;
351353 expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
352354 } ) ;
353355 } ) ;
@@ -361,9 +363,8 @@ describe('Date range picker', () => {
361363 await selectDates ( today , null , calendar ) ;
362364
363365 expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
364- expect ( picker . value ?. length ) . to . equal ( 2 ) ;
365- expect ( picker . value ?. [ 0 ] ) . to . deep . equal ( today . native ) ;
366- expect ( picker . value ?. [ 1 ] ) . to . deep . equal ( today . native ) ;
366+ expect ( picker . value ?. start ) . to . deep . equal ( today . native ) ;
367+ expect ( picker . value ?. end ) . to . deep . equal ( today . native ) ;
367368
368369 const popover = picker . renderRoot . querySelector ( 'igc-popover' ) ;
369370 // when selecting a single date, the calendar won't close
@@ -379,9 +380,8 @@ describe('Date range picker', () => {
379380 await selectDates ( today , tomorrow , calendar ) ;
380381
381382 expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
382- expect ( picker . value ?. length ) . to . equal ( 2 ) ;
383- expect ( picker . value ?. [ 0 ] ) . to . deep . equal ( today . native ) ;
384- expect ( picker . value ?. [ 1 ] ) . to . deep . equal ( tomorrow . native ) ;
383+ expect ( picker . value ?. start ) . to . deep . equal ( today . native ) ;
384+ expect ( picker . value ?. end ) . to . deep . equal ( tomorrow . native ) ;
385385
386386 const popover = picker . renderRoot . querySelector ( 'igc-popover' ) ;
387387 // with the second click, the calendar closes
@@ -409,9 +409,8 @@ describe('Date range picker', () => {
409409 await elementUpdated ( picker ) ;
410410
411411 expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
412- expect ( picker . value ?. length ) . to . equal ( 2 ) ;
413- expect ( picker . value ?. [ 0 ] ) . to . deep . equal ( today . native ) ;
414- expect ( picker . value ?. [ 1 ] ) . to . deep . equal ( tomorrow . native ) ;
412+ expect ( picker . value ?. start ) . to . deep . equal ( today . native ) ;
413+ expect ( picker . value ?. end ) . to . deep . equal ( tomorrow . native ) ;
415414
416415 dialog = picker . renderRoot . querySelector ( 'igc-dialog' ) ;
417416 expect ( dialog ?. hasAttribute ( 'open' ) ) . to . equal ( false ) ;
@@ -423,7 +422,7 @@ describe('Date range picker', () => {
423422 picker . mode = 'dialog' ;
424423 const date1 = today . add ( 'day' , - 2 ) ;
425424 const date2 = today . add ( 'day' , 2 ) ;
426- picker . value = [ date1 . native , date2 . native ] ;
425+ picker . value = { start : date1 . native , end : date2 . native } ;
427426 await elementUpdated ( picker ) ;
428427 picker . open = true ;
429428 await elementUpdated ( picker ) ;
@@ -441,9 +440,7 @@ describe('Date range picker', () => {
441440 await elementUpdated ( picker ) ;
442441
443442 expect ( eventSpy ) . not . to . be . calledWith ( 'igcChange' ) ;
444- expect ( picker . value ?. length ) . to . equal ( 2 ) ;
445- expect ( picker . value ?. [ 0 ] ) . to . deep . equal ( date1 . native ) ;
446- expect ( picker . value ?. [ 1 ] ) . to . deep . equal ( date2 . native ) ;
443+ picker . value = { start : date1 . native , end : date2 . native } ;
447444 dialog = picker . renderRoot . querySelector ( 'igc-dialog' ) ;
448445 expect ( dialog ?. hasAttribute ( 'open' ) ) . to . equal ( false ) ;
449446 } ) ;
@@ -562,7 +559,7 @@ describe('Date range picker', () => {
562559 await elementUpdated ( picker ) ;
563560
564561 expect ( eventSpy ) . not . called ;
565- expect ( picker . value ) . to . deep . equal ( [ null , null ] ) ;
562+ expect ( picker . value ) . to . deep . equal ( { start : null , end : null } ) ;
566563 } ) ;
567564
568565 it ( 'should open the picker on calendar show icon click in dropdown mode' , async ( ) => {
@@ -600,26 +597,26 @@ describe('Date range picker', () => {
600597 } ) ;
601598
602599 it ( 'should not open the picker in dropdown mode when clicking the clear icon' , async ( ) => {
603- picker . value = [ today . native , tomorrow . native ] ;
600+ picker . value = { start : today . native , end : tomorrow . native } ;
604601 await elementUpdated ( picker ) ;
605602
606603 simulateClick ( getIcon ( pickerClearIcon ) ) ;
607604 await elementUpdated ( picker ) ;
608605
609606 expect ( picker . open ) . to . be . false ;
610- expect ( picker . value ) . to . deep . equal ( [ null , null ] ) ;
607+ expect ( picker . value ) . to . deep . equal ( { start : null , end : null } ) ;
611608 } ) ;
612609
613610 it ( 'should not open the picker in dialog mode when clicking the clear icon' , async ( ) => {
614611 picker . mode = 'dialog' ;
615- picker . value = [ today . native , tomorrow . native ] ;
612+ picker . value = { start : today . native , end : tomorrow . native } ;
616613 await elementUpdated ( picker ) ;
617614
618615 simulateClick ( getIcon ( pickerClearIcon ) ) ;
619616 await elementUpdated ( picker ) ;
620617
621618 expect ( picker . open ) . to . be . false ;
622- expect ( picker . value ) . to . deep . equal ( [ null , null ] ) ;
619+ picker . value = { start : null , end : null } ;
623620 } ) ;
624621 } ) ;
625622 } ) ;
@@ -645,35 +642,50 @@ const selectDates = async (
645642
646643const checkSelectedRange = (
647644 picker : IgcDateRangePickerComponent ,
648- expectedValue : ( Date | null ) [ ] ,
645+ expectedValue : DateRangeValue | null ,
649646 singleInput = false
650647) => {
651648 const calendar = picker . renderRoot . querySelector (
652649 IgcCalendarComponent . tagName
653650 ) ! ;
654651
655- expect ( picker . value ) . not . to . be . null ;
656- expect ( picker . value ) . to . deep . equal ( expectedValue ) ;
652+ expect ( picker . value ?. start ) . to . deep . equal ( expectedValue ?. start ) ;
653+ expect ( picker . value ?. end ) . to . deep . equal ( expectedValue ?. end ) ;
657654
658655 if ( singleInput ) {
659656 const input = picker . renderRoot . querySelector ( IgcInputComponent . tagName ) ! ;
660- const start = DateTimeUtil . formatDate (
661- expectedValue [ 0 ] ! ,
662- picker . locale ,
663- picker . displayFormat || picker . inputFormat
664- ) ;
665- const end = DateTimeUtil . formatDate (
666- expectedValue [ 1 ] ! ,
667- picker . locale ,
668- picker . displayFormat || picker . inputFormat
669- ) ;
657+ const start = expectedValue ?. start
658+ ? DateTimeUtil . formatDate (
659+ expectedValue . start ,
660+ picker . locale ,
661+ picker . displayFormat || picker . inputFormat
662+ )
663+ : '' ;
664+ const end = expectedValue ?. end
665+ ? DateTimeUtil . formatDate (
666+ expectedValue . end ,
667+ picker . locale ,
668+ picker . displayFormat || picker . inputFormat
669+ )
670+ : '' ;
670671 expect ( input . value ) . to . equal ( `${ start } - ${ end } ` ) ;
671672 } else {
672673 const inputs = picker . renderRoot . querySelectorAll (
673674 IgcDateTimeInputComponent . tagName
674675 ) ;
675- expect ( inputs [ 0 ] . value ) . to . deep . equal ( expectedValue [ 0 ] ) ;
676- expect ( inputs [ 1 ] . value ) . to . deep . equal ( expectedValue [ 1 ] ) ;
676+ expect ( inputs [ 0 ] . value ) . to . deep . equal ( expectedValue ?. start ) ;
677+ expect ( inputs [ 1 ] . value ) . to . deep . equal ( expectedValue ?. end ) ;
678+ }
679+
680+ // Calendar values are still expected as array:
681+ if ( expectedValue ?. start && expectedValue ?. end ) {
682+ expect ( calendar . values ) . to . deep . equal ( [
683+ expectedValue . start ,
684+ expectedValue . end ,
685+ ] ) ;
686+ } else if ( expectedValue ?. start ) {
687+ expect ( calendar . values ) . to . deep . equal ( [ expectedValue . start ] ) ;
688+ } else {
689+ expect ( calendar . values ) . to . deep . equal ( [ ] ) ;
677690 }
678- expect ( calendar . values ) . to . deep . equal ( expectedValue ) ;
679691} ;
0 commit comments