diff --git a/src/cdk-experimental/popover-edit/popover-edit.spec.ts b/src/cdk-experimental/popover-edit/popover-edit.spec.ts index fe7edee66585..d5980b2d5d80 100644 --- a/src/cdk-experimental/popover-edit/popover-edit.spec.ts +++ b/src/cdk-experimental/popover-edit/popover-edit.spec.ts @@ -441,6 +441,21 @@ describe('CDK Popover Edit', () => { expect(component.hoverContentStateForRow(4)).toBe(HoverContentState.FOCUSABLE); })); + it('should close the focus content when pressing escape', fakeAsync(() => { + expect(component.hoverContentStateForRow(2)).toBe(HoverContentState.OFF); + + component.focusEditCell(2); + tick(1); + + expect(component.hoverContentStateForRow(2)).toBe(HoverContentState.ON); + + const event = new KeyboardEvent('keydown', {bubbles: true, key: 'Escape'}); + component.getEditCell(2).dispatchEvent(event); + tick(1); + + expect(component.hoverContentStateForRow(2)).toBe(HoverContentState.OFF); + })); + it('shows hover content for the editing row and makes the rows above and below ' + 'focusable unless focus is in a different table row in which case it takes priority', fakeAsync(() => { diff --git a/src/cdk-experimental/popover-edit/table-directives.ts b/src/cdk-experimental/popover-edit/table-directives.ts index 52f81fad219c..d7501ed7ce20 100644 --- a/src/cdk-experimental/popover-edit/table-directives.ts +++ b/src/cdk-experimental/popover-edit/table-directives.ts @@ -104,21 +104,25 @@ export class CdkEditable implements AfterViewInit, OnDestroy { // Track focus within the table to hide/show/make focusable hover content. fromEventPattern( - (handler) => element.addEventListener('focus', handler, true), - (handler) => element.removeEventListener('focus', handler, true) + handler => element.addEventListener('focus', handler, true), + handler => element.removeEventListener('focus', handler, true) ).pipe( takeUntil(this.destroyed), toClosest(ROW_SELECTOR), share(), ).subscribe(this.editEventDispatcher.focused); - fromEventPattern( - (handler) => element.addEventListener('blur', handler, true), - (handler) => element.removeEventListener('blur', handler, true) - ).pipe( - takeUntil(this.destroyed), - mapTo(null), - share(), - ).subscribe(this.editEventDispatcher.focused); + + merge( + fromEventPattern( + handler => element.addEventListener('blur', handler, true), + handler => element.removeEventListener('blur', handler, true) + ), + fromEvent(element, 'keydown').pipe(filter(event => event.key === 'Escape')) + ).pipe( + takeUntil(this.destroyed), + mapTo(null), + share(), + ).subscribe(this.editEventDispatcher.focused); // Keep track of rows within the table. This is used to know which rows with hover content // are first or last in the table. They are kept focusable in case focus enters from above