Skip to content

Commit

Permalink
feat(cdk/overlay): connected-overlay directive should have input for …
Browse files Browse the repository at this point in the history
…disabling escape close (#20585)
  • Loading branch information
yuriyward committed Oct 7, 2020
1 parent a087edd commit 57c7b6a
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 2 deletions.
26 changes: 26 additions & 0 deletions src/cdk/overlay/overlay-directives.spec.ts
Expand Up @@ -176,6 +176,30 @@ describe('Overlay directives', () => {
expect(event.defaultPrevented).toBe(false);
});

it('should prevent closing via clicks on the backdrop by default', fakeAsync(() => {
fixture.componentInstance.hasBackdrop = true;
fixture.componentInstance.isOpen = true;
fixture.detectChanges();

const backdrop = overlayContainerElement.querySelector('.cdk-overlay-backdrop') as HTMLElement;
backdrop.click();
fixture.detectChanges();

expect(overlayContainerElement.textContent!.trim()).toBeTruthy();
}));

it('should prevent closing via the escape key with disableClose option', () => {
fixture.componentInstance.isOpen = true;
fixture.componentInstance.disableClose = true;
fixture.detectChanges();

const event = dispatchKeyboardEvent(document.body, 'keydown', ESCAPE);
fixture.detectChanges();

expect(overlayContainerElement.textContent!.trim()).toBeTruthy();
expect(event.defaultPrevented).toBe(false);
});

it('should not depend on the order in which the `origin` and `open` are set', waitForAsync(() => {
fixture.destroy();

Expand Down Expand Up @@ -663,6 +687,7 @@ describe('Overlay directives', () => {
[cdkConnectedOverlayGrowAfterOpen]="growAfterOpen"
[cdkConnectedOverlayPush]="push"
[cdkConnectedOverlayScrollStrategy]="scrollStrategy"
[cdkConnectedOverlayDisableClose]="disableClose"
cdkConnectedOverlayBackdropClass="mat-test-class"
cdkConnectedOverlayPanelClass="cdk-test-panel-class"
(backdropClick)="backdropClickHandler($event)"
Expand Down Expand Up @@ -694,6 +719,7 @@ class ConnectedOverlayDirectiveTest {
offsetY: number;
triggerOverride: CdkOverlayOrigin;
hasBackdrop: boolean;
disableClose: boolean;
viewportMargin: number;
flexibleDimensions: boolean;
growAfterOpen: boolean;
Expand Down
5 changes: 4 additions & 1 deletion src/cdk/overlay/overlay-directives.ts
Expand Up @@ -174,6 +174,9 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges {
/** Whether the overlay is open. */
@Input('cdkConnectedOverlayOpen') open: boolean = false;

/** Whether the overlay can be closed by user interaction. */
@Input('cdkConnectedOverlayDisableClose') disableClose: boolean = false;

/** CSS selector which to set the transform origin. */
@Input('cdkConnectedOverlayTransformOriginOn') transformOriginSelector: string;

Expand Down Expand Up @@ -288,7 +291,7 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges {
overlayRef.keydownEvents().subscribe((event: KeyboardEvent) => {
this.overlayKeydown.next(event);

if (event.keyCode === ESCAPE && !hasModifierKey(event)) {
if (event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event)) {
event.preventDefault();
this._detachOverlay();
}
Expand Down
3 changes: 2 additions & 1 deletion tools/public_api_guard/cdk/overlay.d.ts
Expand Up @@ -11,6 +11,7 @@ export declare class CdkConnectedOverlay implements OnDestroy, OnChanges {
backdropClick: EventEmitter<MouseEvent>;
detach: EventEmitter<void>;
get dir(): Direction;
disableClose: boolean;
get flexibleDimensions(): boolean;
set flexibleDimensions(value: boolean);
get growAfterOpen(): boolean;
Expand Down Expand Up @@ -49,7 +50,7 @@ export declare class CdkConnectedOverlay implements OnDestroy, OnChanges {
static ngAcceptInputType_hasBackdrop: BooleanInput;
static ngAcceptInputType_lockPosition: BooleanInput;
static ngAcceptInputType_push: BooleanInput;
static ɵdir: i0.ɵɵDirectiveDefWithMeta<CdkConnectedOverlay, "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", ["cdkConnectedOverlay"], { "origin": "cdkConnectedOverlayOrigin"; "positions": "cdkConnectedOverlayPositions"; "positionStrategy": "cdkConnectedOverlayPositionStrategy"; "offsetX": "cdkConnectedOverlayOffsetX"; "offsetY": "cdkConnectedOverlayOffsetY"; "width": "cdkConnectedOverlayWidth"; "height": "cdkConnectedOverlayHeight"; "minWidth": "cdkConnectedOverlayMinWidth"; "minHeight": "cdkConnectedOverlayMinHeight"; "backdropClass": "cdkConnectedOverlayBackdropClass"; "panelClass": "cdkConnectedOverlayPanelClass"; "viewportMargin": "cdkConnectedOverlayViewportMargin"; "scrollStrategy": "cdkConnectedOverlayScrollStrategy"; "open": "cdkConnectedOverlayOpen"; "transformOriginSelector": "cdkConnectedOverlayTransformOriginOn"; "hasBackdrop": "cdkConnectedOverlayHasBackdrop"; "lockPosition": "cdkConnectedOverlayLockPosition"; "flexibleDimensions": "cdkConnectedOverlayFlexibleDimensions"; "growAfterOpen": "cdkConnectedOverlayGrowAfterOpen"; "push": "cdkConnectedOverlayPush"; }, { "backdropClick": "backdropClick"; "positionChange": "positionChange"; "attach": "attach"; "detach": "detach"; "overlayKeydown": "overlayKeydown"; "overlayOutsideClick": "overlayOutsideClick"; }, never>;
static ɵdir: i0.ɵɵDirectiveDefWithMeta<CdkConnectedOverlay, "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", ["cdkConnectedOverlay"], { "origin": "cdkConnectedOverlayOrigin"; "positions": "cdkConnectedOverlayPositions"; "positionStrategy": "cdkConnectedOverlayPositionStrategy"; "offsetX": "cdkConnectedOverlayOffsetX"; "offsetY": "cdkConnectedOverlayOffsetY"; "width": "cdkConnectedOverlayWidth"; "height": "cdkConnectedOverlayHeight"; "minWidth": "cdkConnectedOverlayMinWidth"; "minHeight": "cdkConnectedOverlayMinHeight"; "backdropClass": "cdkConnectedOverlayBackdropClass"; "panelClass": "cdkConnectedOverlayPanelClass"; "viewportMargin": "cdkConnectedOverlayViewportMargin"; "scrollStrategy": "cdkConnectedOverlayScrollStrategy"; "open": "cdkConnectedOverlayOpen"; "disableClose": "cdkConnectedOverlayDisableClose"; "transformOriginSelector": "cdkConnectedOverlayTransformOriginOn"; "hasBackdrop": "cdkConnectedOverlayHasBackdrop"; "lockPosition": "cdkConnectedOverlayLockPosition"; "flexibleDimensions": "cdkConnectedOverlayFlexibleDimensions"; "growAfterOpen": "cdkConnectedOverlayGrowAfterOpen"; "push": "cdkConnectedOverlayPush"; }, { "backdropClick": "backdropClick"; "positionChange": "positionChange"; "attach": "attach"; "detach": "detach"; "overlayKeydown": "overlayKeydown"; "overlayOutsideClick": "overlayOutsideClick"; }, never>;
static ɵfac: i0.ɵɵFactoryDef<CdkConnectedOverlay, [null, null, null, null, { optional: true; }]>;
}

Expand Down

0 comments on commit 57c7b6a

Please sign in to comment.