Skip to content

Commit b78303d

Browse files
refactor(overlay): apply requested changes
1 parent c7e8788 commit b78303d

File tree

2 files changed

+31
-21
lines changed

2 files changed

+31
-21
lines changed

projects/igniteui-angular/src/lib/services/overlay/overlay.spec.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2735,11 +2735,12 @@ describe('igxOverlay', () => {
27352735
overlayWrapper.addEventListener('keydown', (event: KeyboardEvent) => {
27362736
if (event.key === targetButton) {
27372737
overlayWrapper = document.getElementsByClassName(CLASS_OVERLAY_WRAPPER_MODAL)[0];
2738+
expect(overlayWrapper).toBeFalsy();
27382739
}
27392740
});
27402741
tick();
27412742
expect(overlayWrapper).toBeTruthy();
2742-
overlayWrapper.dispatchEvent(escEvent);
2743+
document.dispatchEvent(escEvent);
27432744
tick();
27442745
}));
27452746

@@ -2764,7 +2765,7 @@ describe('igxOverlay', () => {
27642765
overlayWrapper = document.getElementsByClassName(CLASS_OVERLAY_WRAPPER_MODAL)[0];
27652766
}
27662767
});
2767-
overlayWrapper.dispatchEvent(escEvent);
2768+
document.dispatchEvent(escEvent);
27682769
tick();
27692770
fixture.detectChanges();
27702771

@@ -2774,22 +2775,25 @@ describe('igxOverlay', () => {
27742775
it('Should close the opened overlays consecutively on escape keypress', fakeAsync(() => {
27752776
const fixture = TestBed.createComponent(EmptyPageComponent);
27762777
const overlay = fixture.componentInstance.overlay;
2777-
overlay.show(overlay.attach(SimpleDynamicComponent), { modal: false, closeOnEsc: true });
2778+
overlay.show(overlay.attach(SimpleDynamicComponent), { closeOnEsc: true });
27782779
tick();
2779-
overlay.show(overlay.attach(SimpleDynamicComponent), { modal: true, closeOnEsc: true });
2780+
overlay.show(overlay.attach(SimpleDynamicComponent), { closeOnEsc: true });
27802781
tick();
27812782

2782-
const overlayWrapper = document.getElementsByClassName(CLASS_OVERLAY_WRAPPER_MODAL)[0];
2783+
const overlayDiv = document.getElementsByClassName(CLASS_OVERLAY_MAIN)[0];
2784+
expect(overlayDiv.children.length).toBe(2);
2785+
27832786
const escEvent = new KeyboardEvent('keydown', {
27842787
key: 'Escape'
27852788
});
2786-
overlayWrapper.dispatchEvent(escEvent);
2789+
2790+
document.dispatchEvent(escEvent);
27872791
tick();
2788-
expect(document.getElementsByClassName(CLASS_OVERLAY_WRAPPER_MODAL)[0]).toBeFalsy();
2792+
expect(overlayDiv.children.length).toBe(1);
27892793

27902794
document.dispatchEvent(escEvent);
27912795
tick();
2792-
expect(document.getElementsByClassName(CLASS_OVERLAY_WRAPPER)[0]).toBeFalsy();
2796+
expect(overlayDiv.children.length).toBe(0);
27932797
}));
27942798

27952799
// Test #1883 #1820
@@ -2828,10 +2832,10 @@ describe('igxOverlay', () => {
28282832
tick();
28292833
expect(overlayWrapper).toBeTruthy();
28302834

2831-
overlayWrapper.dispatchEvent(enterEvent);
2832-
overlayWrapper.dispatchEvent(aEvent);
2833-
overlayWrapper.dispatchEvent(arrowUpEvent);
2834-
overlayWrapper.dispatchEvent(escEvent);
2835+
document.dispatchEvent(enterEvent);
2836+
document.dispatchEvent(aEvent);
2837+
document.dispatchEvent(arrowUpEvent);
2838+
document.dispatchEvent(escEvent);
28352839
}));
28362840

28372841
// 3.2 Non - Modal

projects/igniteui-angular/src/lib/services/overlay/overlay.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,7 @@ export class IgxOverlayService implements OnDestroy {
331331
wrapperElement.classList.add('igx-overlay__wrapper--modal');
332332
}
333333

334-
if (info.settings.closeOnEsc) {
335-
this.setUpCloseOnEscape(info);
336-
}
334+
this.setUpCloseOnEscape();
337335

338336
if (info.settings.positionStrategy.settings.openAnimation) {
339337
this.playOpenAnimation(info);
@@ -476,13 +474,11 @@ export class IgxOverlayService implements OnDestroy {
476474
}
477475
}
478476

479-
private setUpCloseOnEscape(info: OverlayInfo) {
480-
if (!info.settings.modal) {
477+
private setUpCloseOnEscape() {
478+
if (this._overlayInfos.length - this._overlayInfos.filter(x => x.closeAnimationPlayer
479+
&& x.closeAnimationPlayer.hasStarted()).length === 1) {
481480
this.subscribeOnEscape(this._document);
482-
return;
483481
}
484-
const wrapperElement = info.elementRef.nativeElement.parentElement.parentElement;
485-
this.subscribeOnEscape(wrapperElement);
486482
}
487483

488484
private subscribeOnEscape(target: FromEventTarget<unknown>) {
@@ -491,7 +487,9 @@ export class IgxOverlayService implements OnDestroy {
491487
takeUntil(this.destroy$)
492488
).subscribe(() => {
493489
const targetOverlay = this._overlayInfos[this._overlayInfos.length - 1];
494-
this.hide(targetOverlay.id);
490+
if (targetOverlay.settings.closeOnEsc) {
491+
this.hide(targetOverlay.id);
492+
}
495493
});
496494
}
497495

@@ -712,6 +710,14 @@ export class IgxOverlayService implements OnDestroy {
712710
}
713711
}
714712

713+
private hasRemainingOverlaysAfterClose(): boolean {
714+
// if all overlays minus closing overlays equals one add the handler
715+
return this._overlayInfos.filter(x => x.settings.closeOnOutsideClick && !x.settings.modal).length -
716+
this._overlayInfos.filter(x => x.settings.closeOnOutsideClick && !x.settings.modal &&
717+
x.closeAnimationPlayer &&
718+
x.closeAnimationPlayer.hasStarted()).length === 1;
719+
}
720+
715721
private removeOutsideClickListener(info: OverlayInfo) {
716722
if (info.settings.modal === false) {
717723
let shouldRemoveClickEventListener = true;

0 commit comments

Comments
 (0)