@@ -11,6 +11,7 @@ import {
1111 escapeKey ,
1212} from '../common/controllers/key-bindings.js' ;
1313import { defineComponents } from '../common/definitions/defineComponents.js' ;
14+ import { IgcDateRangePickerResourceStringsEN } from '../common/i18n/date-range-picker.resources.js' ;
1415import {
1516 type ValidationContainerTestsParams ,
1617 checkDatesEqual ,
@@ -24,6 +25,7 @@ import IgcDateTimeInputComponent from '../date-time-input/date-time-input.js';
2425import { DateTimeUtil } from '../date-time-input/date-util.js' ;
2526import IgcInputComponent from '../input/input.js' ;
2627import IgcDateRangePickerComponent , {
28+ type CustomDateRange ,
2729 type DateRangeValue ,
2830} from './date-range-picker.js' ;
2931
@@ -708,6 +710,221 @@ describe('Date range picker', () => {
708710 expect ( calendar . values ) . to . deep . equal ( [ ] ) ;
709711 } ) ;
710712 } ) ;
713+ describe ( 'Selection via the range selection chips' , ( ) => {
714+ const previousThreeDaysStart = CalendarDay . from ( today . native ) . add (
715+ 'day' ,
716+ - 3
717+ ) . native ;
718+ const nextThreeDaysEnd = CalendarDay . from ( today . native ) . add (
719+ 'day' ,
720+ + 3
721+ ) . native ;
722+
723+ const customRanges : CustomDateRange [ ] = [
724+ {
725+ label : 'Previous Three Days' ,
726+ dateRange : {
727+ start : previousThreeDaysStart ,
728+ end : today . native ,
729+ } ,
730+ } ,
731+ {
732+ label : 'Next Three Days' ,
733+ dateRange : {
734+ start : today . native ,
735+ end : nextThreeDaysEnd ,
736+ } ,
737+ } ,
738+ ] ;
739+
740+ it ( 'should not render any chips when usePredefinedRanges is false and there are no custom ranges added' , async ( ) => {
741+ picker . open = true ;
742+ await elementUpdated ( picker ) ;
743+
744+ const chips = picker . renderRoot . querySelectorAll ( 'igc-chip' ) ;
745+ expect ( chips . length ) . to . equal ( 0 ) ;
746+ } ) ;
747+ it ( 'should render all predefined chips and custom chips when set' , async ( ) => {
748+ picker . usePredefinedRanges = true ;
749+ picker . open = true ;
750+ const predefinedRangesLength = ( picker as any ) . predefinedRanges . length ;
751+ await elementUpdated ( picker ) ;
752+
753+ let chips = picker . renderRoot . querySelectorAll ( 'igc-chip' ) ;
754+ expect ( chips . length ) . to . equal ( predefinedRangesLength ) ;
755+
756+ expect ( chips [ 0 ] . innerText ) . to . equal (
757+ IgcDateRangePickerResourceStringsEN . last7Days
758+ ) ;
759+ expect ( chips [ 1 ] . innerText ) . to . equal (
760+ IgcDateRangePickerResourceStringsEN . currentMonth
761+ ) ;
762+ expect ( chips [ 2 ] . innerText ) . to . equal (
763+ IgcDateRangePickerResourceStringsEN . last30Days
764+ ) ;
765+ expect ( chips [ 3 ] . innerText ) . to . equal (
766+ IgcDateRangePickerResourceStringsEN . yearToDate
767+ ) ;
768+
769+ picker . customRanges = customRanges ;
770+ await elementUpdated ( picker ) ;
771+
772+ const allRangesLenght = ( picker as any ) . allRanges . length ;
773+ chips = picker . renderRoot . querySelectorAll ( 'igc-chip' ) ;
774+ expect ( chips . length ) . to . equal ( allRangesLenght ) ;
775+
776+ expect ( chips [ 0 ] . innerText ) . to . equal (
777+ IgcDateRangePickerResourceStringsEN . last7Days
778+ ) ;
779+ expect ( chips [ 1 ] . innerText ) . to . equal (
780+ IgcDateRangePickerResourceStringsEN . currentMonth
781+ ) ;
782+ expect ( chips [ 2 ] . innerText ) . to . equal (
783+ IgcDateRangePickerResourceStringsEN . last30Days
784+ ) ;
785+ expect ( chips [ 3 ] . innerText ) . to . equal (
786+ IgcDateRangePickerResourceStringsEN . yearToDate
787+ ) ;
788+ expect ( chips [ 4 ] . innerText ) . to . equal ( 'Previous Three Days' ) ;
789+ expect ( chips [ 5 ] . innerText ) . to . equal ( 'Next Three Days' ) ;
790+ } ) ;
791+ it ( 'should emit igcChange when the chips are clicked' , async ( ) => {
792+ const eventSpy = spy ( picker , 'emitEvent' ) ;
793+ const popover = picker . renderRoot . querySelector ( 'igc-popover' ) ;
794+
795+ picker . usePredefinedRanges = true ;
796+ picker . customRanges = customRanges ;
797+ picker . open = true ;
798+ await elementUpdated ( picker ) ;
799+
800+ const allRangesLenght = ( picker as any ) . allRanges . length ;
801+ const chips = picker . renderRoot . querySelectorAll ( 'igc-chip' ) ;
802+ expect ( chips . length ) . to . equal ( allRangesLenght ) ;
803+
804+ chips [ 0 ] . click ( ) ;
805+ await elementUpdated ( picker ) ;
806+
807+ expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
808+
809+ checkSelectedRange ( picker , {
810+ start : new Date (
811+ today . native . getFullYear ( ) ,
812+ today . native . getMonth ( ) ,
813+ today . native . getDate ( ) - 7
814+ ) ,
815+ end : today . native ,
816+ } ) ;
817+
818+ expect ( popover ?. hasAttribute ( 'open' ) ) . to . equal ( true ) ;
819+
820+ chips [ 1 ] . click ( ) ;
821+ await elementUpdated ( picker ) ;
822+
823+ expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
824+
825+ checkSelectedRange ( picker , {
826+ start : new Date (
827+ today . native . getFullYear ( ) ,
828+ today . native . getMonth ( ) ,
829+ 1
830+ ) ,
831+ end : new Date (
832+ today . native . getFullYear ( ) ,
833+ today . native . getMonth ( ) + 1 ,
834+ 0
835+ ) ,
836+ } ) ;
837+
838+ expect ( popover ?. hasAttribute ( 'open' ) ) . to . equal ( true ) ;
839+
840+ chips [ 2 ] . click ( ) ;
841+ await elementUpdated ( picker ) ;
842+
843+ expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
844+
845+ checkSelectedRange ( picker , {
846+ start : CalendarDay . from ( today . native ) . add ( 'day' , - 29 ) . native ,
847+ end : today . native ,
848+ } ) ;
849+
850+ expect ( popover ?. hasAttribute ( 'open' ) ) . to . equal ( true ) ;
851+
852+ chips [ 3 ] . click ( ) ;
853+ await elementUpdated ( picker ) ;
854+
855+ expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
856+
857+ checkSelectedRange ( picker , {
858+ start : new Date ( today . native . getFullYear ( ) , 0 , 1 ) ,
859+ end : today . native ,
860+ } ) ;
861+
862+ expect ( popover ?. hasAttribute ( 'open' ) ) . to . equal ( true ) ;
863+
864+ chips [ 4 ] . click ( ) ;
865+ await elementUpdated ( picker ) ;
866+
867+ expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
868+
869+ checkSelectedRange ( picker , {
870+ start : previousThreeDaysStart ,
871+ end : today . native ,
872+ } ) ;
873+
874+ expect ( popover ?. hasAttribute ( 'open' ) ) . to . equal ( true ) ;
875+
876+ chips [ 5 ] . click ( ) ;
877+ await elementUpdated ( picker ) ;
878+
879+ expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
880+
881+ checkSelectedRange ( picker , {
882+ start : today . native ,
883+ end : nextThreeDaysEnd ,
884+ } ) ;
885+
886+ expect ( popover ?. hasAttribute ( 'open' ) ) . to . equal ( true ) ;
887+ } ) ;
888+
889+ it ( 'should render only custom chips, when usePredefinedRanges is false and emit igcChange when chips are clicked' , async ( ) => {
890+ const eventSpy = spy ( picker , 'emitEvent' ) ;
891+ const popover = picker . renderRoot . querySelector ( 'igc-popover' ) ;
892+
893+ picker . customRanges = customRanges ;
894+ picker . open = true ;
895+ await elementUpdated ( picker ) ;
896+
897+ const chips = picker . renderRoot . querySelectorAll ( 'igc-chip' ) ;
898+ expect ( chips . length ) . to . equal ( picker . customRanges . length ) ;
899+
900+ expect ( chips [ 0 ] . innerText ) . to . equal ( 'Previous Three Days' ) ;
901+ expect ( chips [ 1 ] . innerText ) . to . equal ( 'Next Three Days' ) ;
902+
903+ chips [ 0 ] . click ( ) ;
904+ await elementUpdated ( picker ) ;
905+
906+ expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
907+
908+ checkSelectedRange ( picker , {
909+ start : previousThreeDaysStart ,
910+ end : today . native ,
911+ } ) ;
912+
913+ expect ( popover ?. hasAttribute ( 'open' ) ) . to . equal ( true ) ;
914+
915+ chips [ 1 ] . click ( ) ;
916+ await elementUpdated ( picker ) ;
917+
918+ expect ( eventSpy ) . calledWith ( 'igcChange' ) ;
919+
920+ checkSelectedRange ( picker , {
921+ start : today . native ,
922+ end : nextThreeDaysEnd ,
923+ } ) ;
924+
925+ expect ( popover ?. hasAttribute ( 'open' ) ) . to . equal ( true ) ;
926+ } ) ;
927+ } ) ;
711928 describe ( 'Keyboard navigation' , ( ) => {
712929 it ( 'should close the picker when in open state on pressing Escape' , async ( ) => {
713930 const eventSpy = spy ( picker , 'emitEvent' ) ;
0 commit comments