Skip to content

Commit fba0d56

Browse files
committed
.
1 parent cb79b48 commit fba0d56

File tree

5 files changed

+43
-60
lines changed

5 files changed

+43
-60
lines changed

src/cdk/overlay/overlay-directives.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,9 @@ describe('Overlay directives', () => {
120120
'Expected overlay to have been detached.');
121121
});
122122

123-
it('should not close when pressing escape when changed the setting of "detachOnEscape"', () => {
123+
it('should not close when pressing escape when changed the setting of "disableClose"', () => {
124124
fixture.componentInstance.isOpen = true;
125-
fixture.componentInstance.detachOnEscape = false;
125+
fixture.componentInstance.disableClose = true;
126126
fixture.detectChanges();
127127

128128
dispatchKeyboardEvent(document.body, 'keydown', ESCAPE);
@@ -479,7 +479,7 @@ describe('Overlay directives', () => {
479479
[cdkConnectedOverlayFlexibleDimensions]="flexibleDimensions"
480480
[cdkConnectedOverlayGrowAfterOpen]="growAfterOpen"
481481
[cdkConnectedOverlayPush]="push"
482-
[cdkConnectedOverlayDetachOnEscape]="detachOnEscape"
482+
[cdkConnectedOverlayDisableClose]="disableClose"
483483
cdkConnectedOverlayBackdropClass="mat-test-class"
484484
(backdropClick)="backdropClickHandler($event)"
485485
[cdkConnectedOverlayOffsetX]="offsetX"
@@ -511,7 +511,7 @@ class ConnectedOverlayDirectiveTest {
511511
flexibleDimensions: boolean;
512512
growAfterOpen: boolean;
513513
push: boolean;
514-
detachOnEscape: boolean = true;
514+
disableClose: boolean = false;
515515
backdropClickHandler = jasmine.createSpy('backdropClick handler');
516516
positionChangeHandler = jasmine.createSpy('positionChangeHandler');
517517
positionOverrides: ConnectionPositionPair[];

src/cdk/overlay/overlay-directives.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges {
114114
private _offsetX: number;
115115
private _offsetY: number;
116116
private _position: FlexibleConnectedPositionStrategy;
117+
private _disableClose = false;
118+
private _open = false;
117119

118120
/** Origin for the connected overlay. */
119121
@Input('cdkConnectedOverlayOrigin') origin: CdkOverlayOrigin;
@@ -165,11 +167,15 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges {
165167
@Input('cdkConnectedOverlayScrollStrategy') scrollStrategy: ScrollStrategy =
166168
this._scrollStrategy();
167169

168-
/** Strategy to detach the overlay panel on ESCAPE keydown */
169-
@Input('cdkConnectedOverlayDetachOnEscape') detachOnEscape: boolean = true;
170+
/** Whether the overlay closes when the user pressed the Escape key. */
171+
@Input('cdkConnectedOverlayDisableClose')
172+
get disableClose() { return this._disableClose; }
173+
set disableClose(value: any) { this._disableClose = coerceBooleanProperty(value); }
170174

171175
/** Whether the overlay is open. */
172-
@Input('cdkConnectedOverlayOpen') open: boolean = false;
176+
@Input('cdkConnectedOverlayOpen')
177+
get open() { return this._open; }
178+
set open(value: any) { this._open = coerceBooleanProperty(value); }
173179

174180
/** Whether or not the overlay should attach a backdrop. */
175181
@Input('cdkConnectedOverlayHasBackdrop')
@@ -338,7 +344,7 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges {
338344
this._createOverlay();
339345

340346
this._overlayRef!.keydownEvents().subscribe((event: KeyboardEvent) => {
341-
if (this.detachOnEscape && event.keyCode === ESCAPE) {
347+
if (!this.disableClose && event.keyCode === ESCAPE) {
342348
this._detachOverlay();
343349
}
344350
});

src/lib/select/select.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
cdk-connected-overlay
2020
cdkConnectedOverlayLockPosition
2121
cdkConnectedOverlayHasBackdrop
22-
[cdkConnectedOverlayOpen]="true"
22+
cdkConnectedOverlayOpen
23+
cdkConnectedOverlayDisableClose
2324
cdkConnectedOverlayBackdropClass="cdk-overlay-transparent-backdrop"
2425
[cdkConnectedOverlayScrollStrategy]="_scrollStrategy"
2526
[cdkConnectedOverlayOrigin]="origin"
2627
[cdkConnectedOverlayPositions]="_positions"
2728
[cdkConnectedOverlayMinWidth]="_triggerRect?.width"
2829
[cdkConnectedOverlayOffsetY]="_offsetY"
29-
[cdkConnectedOverlayDetachOnEscape]="false"
3030
(backdropClick)="close()"
3131
(attach)="_onAttached()"
3232
(detach)="close()">
@@ -35,7 +35,7 @@
3535
class="mat-select-panel {{ _getPanelTheme() }}"
3636
[class.cdk-visually-hidden]="!panelOpen"
3737
[ngClass]="panelClass"
38-
[@transformPanel]="panelOpen ? (multiple ? 'showing-multiple' : 'showing') : 'void'"
38+
[@transformPanel]="_transformPanel"
3939
(@transformPanel.done)="_panelDoneAnimatingStream.next($event.toState)"
4040
[style.transformOrigin]="_transformOrigin"
4141
[class.mat-select-panel-done-animating]="_panelDoneAnimating"

src/lib/select/select.spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,10 @@ describe('MatSelect', () => {
412412
expect(instance.select.panelOpen).toBe(true, 'Expected panel to be open.');
413413
expect(instance.control.value).toBe(initialValue, 'Expected value to stay the same.');
414414
expect(event.defaultPrevented).toBe(true, 'Expected default to be prevented.');
415+
416+
const options =
417+
overlayContainerElement.querySelectorAll('mat-option') as NodeListOf<HTMLElement>;
418+
expect(options.length).toEqual(8, 'Expect select has 8 options');
415419
}));
416420

417421
it('should open the panel when pressing a horizontal arrow key on closed multiple select',
@@ -775,6 +779,10 @@ describe('MatSelect', () => {
775779
overlayContainerElement.querySelectorAll('mat-option') as NodeListOf<HTMLElement>;
776780
}));
777781

782+
it('should have correct number of options', fakeAsync(() => {
783+
expect(options.length).toEqual(8, 'Expect select has 8 options');
784+
}));
785+
778786
it('should set the role of mat-option to option', fakeAsync(() => {
779787
expect(options[0].getAttribute('role')).toEqual('option');
780788
expect(options[1].getAttribute('role')).toEqual('option');

src/lib/select/select.ts

Lines changed: 18 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -513,14 +513,6 @@ export class MatSelect extends _MatSelectMixinBase implements AfterContentInit,
513513
this._resetOptions();
514514
this._initializeSelection();
515515
});
516-
517-
this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();
518-
519-
// Defer setting the value in order to void the "Expression has changed after it was checked"
520-
// errors from Angular
521-
Promise.resolve().then(() => {
522-
this._initializePanel();
523-
});
524516
}
525517

526518
ngDoCheck() {
@@ -558,31 +550,26 @@ export class MatSelect extends _MatSelectMixinBase implements AfterContentInit,
558550
// Note: The computed font-size will be a string pixel value (e.g. "16px").
559551
// `parseInt` ignores the trailing 'px' and converts this to a number.
560552
this._triggerFontSize = parseInt(getComputedStyle(this.trigger.nativeElement)['font-size']);
553+
if (this._triggerFontSize && this.overlayDir.overlayRef &&
554+
this.overlayDir.overlayRef.overlayElement) {
555+
this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this._triggerFontSize}px`;
556+
}
561557

562558
this._panelOpen = true;
563559
this._keyManager.withHorizontalOrientation(null);
564560
this._calculateOverlayPosition();
565561
this._highlightCorrectOption();
566-
this._showBackdrop();
567-
this.overlayDir.overlayRef.overlayElement.style.minWidth = `${this._triggerRect.width}px`;
562+
563+
this.overlayDir.overlayRef.updateSize({minWidth: `${this._triggerRect.width}px`});
568564
if (this._dir) {
569565
this.overlayDir.overlayRef.setDirection(this._dir);
570566
}
571-
this._changeDetectorRef.markForCheck();
572-
573-
// Set the font size on the panel element once it exists.
574-
this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {
575-
if (this._triggerFontSize && this.overlayDir.overlayRef &&
576-
this.overlayDir.overlayRef.overlayElement) {
577-
this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this._triggerFontSize}px`;
578-
}
579-
580-
this.overlayDir.overlayRef.updatePosition();
567+
this.overlayDir.overlayRef.updatePosition();
581568

582-
this._changeDetectorRef.detectChanges();
583-
this._calculateOverlayOffsetX();
584-
this.panel.nativeElement.scrollTop = this._scrollTop;
585-
});
569+
this._changeDetectorRef.detectChanges();
570+
this._calculateOverlayOffsetX();
571+
this.panel.nativeElement.scrollTop = this._scrollTop;
572+
this._showBackdrop();
586573
}
587574

588575
/** Closes the overlay panel and focuses the host element. */
@@ -672,6 +659,12 @@ export class MatSelect extends _MatSelectMixinBase implements AfterContentInit,
672659
return this._selectionModel.selected[0].viewValue;
673660
}
674661

662+
/** The animation transform for overlay panel. */
663+
get _transformPanel() {
664+
return this.panelOpen ? (this.multiple ? 'showing-multiple' : 'showing') : 'void'
665+
}
666+
667+
675668
/** Whether the element is in RTL mode. */
676669
_isRtl(): boolean {
677670
return this._dir ? this._dir.value === 'rtl' : false;
@@ -769,6 +762,7 @@ export class MatSelect extends _MatSelectMixinBase implements AfterContentInit,
769762
this._changeDetectorRef.detectChanges();
770763
this._calculateOverlayOffsetX();
771764
this.panel.nativeElement.scrollTop = this._scrollTop;
765+
this._hideBackdrop();
772766
});
773767
}
774768

@@ -796,31 +790,6 @@ export class MatSelect extends _MatSelectMixinBase implements AfterContentInit,
796790
}
797791
}
798792

799-
/** Initialize the overlay panel, and make it invisible. */
800-
private _initializePanel() {
801-
if (this.disabled || !this.options || !this.options.length) {
802-
return;
803-
}
804-
805-
this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();
806-
// Note: The computed font-size will be a string pixel value (e.g. "16px").
807-
// `parseInt` ignores the trailing 'px' and converts this to a number.
808-
this._triggerFontSize = parseInt(getComputedStyle(this.trigger.nativeElement)['font-size']);
809-
810-
this._calculateOverlayPosition();
811-
this._changeDetectorRef.markForCheck();
812-
813-
// Set the font size on the panel element once it exists.
814-
this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {
815-
if (this._triggerFontSize && this.overlayDir.overlayRef &&
816-
this.overlayDir.overlayRef.overlayElement) {
817-
this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this._triggerFontSize}px`;
818-
}
819-
820-
this._hideBackdrop();
821-
});
822-
}
823-
824793
private _initializeSelection(): void {
825794
// Defer setting the value in order to avoid the "Expression
826795
// has changed after it was checked" errors from Angular.

0 commit comments

Comments
 (0)