@@ -20,7 +20,7 @@ import { Subject } from 'rxjs';
2020import { AsyncPipe } from '@angular/common' ;
2121import { AnimationService } from '../services/animation/animation' ;
2222import { IgxAngularAnimationService } from '../services/animation/angular-animation-service' ;
23- import { IgxPickerToggleComponent } from '../date-common/picker-icons.common' ;
23+ import { IgxPickerClearComponent , IgxPickerToggleComponent } from '../date-common/picker-icons.common' ;
2424import { IgxIconComponent } from '../icon/icon.component' ;
2525import { registerLocaleData } from "@angular/common" ;
2626import localeJa from "@angular/common/locales/ja" ;
@@ -401,13 +401,15 @@ describe('IgxDateRangePicker', () => {
401401 } ) ;
402402
403403 describe ( 'Clear tests' , ( ) => {
404+ const range = { start : new Date ( 2025 , 1 , 1 ) , end : new Date ( 2025 , 1 , 2 ) } ;
405+
404406 describe ( 'Default clear icon' , ( ) => {
405407 it ( 'should display default clear icon when value is set' , ( ) => {
406408 const inputGroup = fixture . debugElement . query ( By . directive ( IgxInputGroupComponent ) ) ;
407409 let suffix = inputGroup . query ( By . directive ( IgxSuffixDirective ) ) ;
408410 expect ( suffix ) . toBeNull ( ) ;
409411
410- dateRange . value = { start : new Date ( 2025 , 1 , 1 ) , end : new Date ( 2025 , 1 , 2 ) } ;
412+ dateRange . value = range ;
411413 fixture . detectChanges ( ) ;
412414
413415 suffix = inputGroup . query ( By . directive ( IgxSuffixDirective ) ) ;
@@ -417,7 +419,7 @@ describe('IgxDateRangePicker', () => {
417419 } ) ;
418420
419421 it ( 'should clear the value when clicking the default clear icon (suffix)' , fakeAsync ( ( ) => {
420- dateRange . value = { start : new Date ( 2025 , 1 , 1 ) , end : new Date ( 2025 , 1 , 2 ) } ;
422+ dateRange . value = range ;
421423 fixture . detectChanges ( ) ;
422424
423425 const inputGroup = fixture . debugElement . query ( By . directive ( IgxInputGroupComponent ) ) ;
@@ -439,7 +441,6 @@ describe('IgxDateRangePicker', () => {
439441 fixture . detectChanges ( ) ;
440442
441443 dateRange = fixture . debugElement . queryAll ( By . directive ( IgxDateRangePickerComponent ) ) [ 0 ] . componentInstance ;
442- const range = { start : new Date ( 2025 , 1 , 1 ) , end : new Date ( 2025 , 1 , 2 ) } ;
443444 dateRange . value = range ;
444445 fixture . detectChanges ( ) ;
445446
@@ -463,7 +464,34 @@ describe('IgxDateRangePicker', () => {
463464 } ) ) ;
464465 } ) ;
465466
466- //xdescribe('Projected clear icon', () => {});
467+ describe ( 'Projected clear icon' , ( ) => {
468+ it ( 'should clear the value when clicking the projected clear icon' , fakeAsync ( ( ) => {
469+ fixture = TestBed . createComponent ( DateRangeTemplatesComponent ) ;
470+ fixture . detectChanges ( ) ;
471+
472+ dateRange = fixture . debugElement . queryAll ( By . directive ( IgxDateRangePickerComponent ) ) [ 4 ] . componentInstance ;
473+
474+ const pickerClear = fixture . debugElement . queryAll ( By . directive ( IgxPickerClearComponent ) ) [ 0 ] ;
475+ // Projected clear icon is rendered even if value is unassigned
476+ expect ( pickerClear ) . not . toBeNull ( ) ;
477+
478+ const suffixes = dateRange . element . nativeElement . querySelectorAll ( CSS_CLASS_INPUT_END ) ;
479+ expect ( suffixes . length ) . toBe ( 1 ) ;
480+ // the default clear icon is overridden by the projected one
481+ expect ( suffixes [ 0 ] . textContent . trim ( ) ) . toEqual ( 'delete' ) ;
482+
483+ dateRange . value = range ;
484+ fixture . detectChanges ( ) ;
485+
486+ spyOn ( dateRange . valueChange , 'emit' ) ;
487+ UIInteractions . simulateClickAndSelectEvent ( pickerClear . nativeElement ) ;
488+ tick ( ) ;
489+ fixture . detectChanges ( ) ;
490+
491+ expect ( dateRange . value ) . toBeNull ( ) ;
492+ expect ( dateRange . valueChange . emit ) . toHaveBeenCalledOnceWith ( null ) ;
493+ } ) ) ;
494+ } ) ;
467495 } ) ;
468496
469497 describe ( 'Properties & events tests' , ( ) => {
@@ -1629,6 +1657,39 @@ describe('IgxDateRangePicker', () => {
16291657 expect ( dateRange . locale ) . toEqual ( 'en-US' ) ;
16301658 expect ( dateRange . weekStart ) . toEqual ( WEEKDAYS . FRIDAY ) ;
16311659 } ) ) ;
1660+
1661+ it ( 'should render projected clear icons which clear the range on click' , ( ) => {
1662+ fixture = TestBed . createComponent ( DateRangeTwoInputsClearComponent ) ;
1663+ fixture . detectChanges ( ) ;
1664+
1665+ const drp = fixture . debugElement . query ( By . directive ( IgxDateRangePickerComponent ) ) . componentInstance ;
1666+ const start = fixture . debugElement . query ( By . directive ( IgxDateRangeStartComponent ) ) ;
1667+ const end = fixture . debugElement . query ( By . directive ( IgxDateRangeEndComponent ) ) ;
1668+
1669+ const startSuffix = start . nativeElement . querySelectorAll ( CSS_CLASS_INPUT_END ) [ 0 ] ;
1670+ const endSuffix = end . nativeElement . querySelectorAll ( CSS_CLASS_INPUT_END ) [ 0 ] ;
1671+
1672+ expect ( startSuffix . innerText ) . toBe ( 'delete' ) ;
1673+ expect ( endSuffix . innerText ) . toBe ( 'delete' ) ;
1674+
1675+ const pickerClearComponents = fixture . debugElement . queryAll ( By . directive ( IgxPickerClearComponent ) ) ;
1676+
1677+ drp . value = { start : new Date ( 2025 , 0 , 1 ) , end : new Date ( 2025 , 0 , 2 ) } ;
1678+ fixture . detectChanges ( ) ;
1679+
1680+ UIInteractions . simulateClickAndSelectEvent ( pickerClearComponents [ 0 ] . nativeNode ) ;
1681+ fixture . detectChanges ( ) ;
1682+
1683+ expect ( drp . value ) . toEqual ( null ) ;
1684+
1685+ drp . value = { start : new Date ( 2025 , 0 , 1 ) , end : new Date ( 2025 , 0 , 2 ) } ;
1686+ fixture . detectChanges ( ) ;
1687+
1688+ UIInteractions . simulateClickAndSelectEvent ( pickerClearComponents [ 1 ] . nativeNode ) ;
1689+ fixture . detectChanges ( ) ;
1690+
1691+ expect ( drp . value ) . toEqual ( null ) ;
1692+ } ) ;
16321693 } ) ;
16331694 } ) ;
16341695} ) ;
@@ -1722,6 +1783,29 @@ export class DateRangeTwoInputsNgModelTestComponent extends DateRangeTestCompone
17221783 public range = { start : new Date ( 2020 , 1 , 1 ) , end : new Date ( 2020 , 1 , 4 ) } ;
17231784}
17241785
1786+ @Component ( {
1787+ selector : 'igx-date-range-two-inputs-clear' ,
1788+ template : `
1789+ <igx-date-range-picker>
1790+ <igx-date-range-start>
1791+ <input igxInput igxDateTimeEditor type="text">
1792+ <igx-picker-clear igxSuffix>
1793+ <igx-icon>delete</igx-icon>
1794+ </igx-picker-clear>
1795+ </igx-date-range-start>
1796+ <igx-date-range-end>
1797+ <input igxInput igxDateTimeEditor type="text">
1798+ <igx-picker-clear igxSuffix>
1799+ <igx-icon>delete</igx-icon>
1800+ </igx-picker-clear>
1801+ </igx-date-range-end>
1802+ </igx-date-range-picker>` ,
1803+ imports : [ IgxDateRangePickerComponent , IgxDateRangeStartComponent , IgxDateRangeEndComponent , IgxInputDirective ,
1804+ IgxDateTimeEditorDirective , FormsModule , IgxPickerClearComponent , IgxIconComponent , IgxSuffixDirective ]
1805+ } )
1806+ export class DateRangeTwoInputsClearComponent extends DateRangeTestComponent {
1807+ }
1808+
17251809@Component ( {
17261810 selector : 'igx-date-range-single-input-label-test' ,
17271811 template : `
@@ -1777,18 +1861,24 @@ export class DateRangeCustomComponent extends DateRangeTestComponent {
17771861 <igx-icon>flight_land</igx-icon>
17781862 </igx-picker-toggle>
17791863 <igx-suffix>
1780- <igx-icon>
1781- calendar_view_day
1782- </igx-icon>
1783- </igx-suffix>
1864+ <igx-icon>
1865+ calendar_view_day
1866+ </igx-icon>
1867+ </igx-suffix>
17841868 </igx-date-range-end>
1869+ </igx-date-range-picker>
1870+ <igx-date-range-picker>
1871+ <igx-picker-clear igxSuffix>
1872+ <igx-icon>delete</igx-icon>
1873+ </igx-picker-clear>
17851874 </igx-date-range-picker>
17861875 ` ,
17871876 imports : [
17881877 IgxDateRangePickerComponent ,
17891878 IgxDateRangeStartComponent ,
17901879 IgxDateRangeEndComponent ,
17911880 IgxPickerToggleComponent ,
1881+ IgxPickerClearComponent ,
17921882 IgxIconComponent ,
17931883 FormsModule ,
17941884 IgxInputDirective ,
0 commit comments