Skip to content

Commit 8988456

Browse files
fix(material/select): close panel on detach output event
1 parent 75713b0 commit 8988456

File tree

2 files changed

+50
-14
lines changed

2 files changed

+50
-14
lines changed

src/material/select/select.html

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
<div cdk-overlay-origin
2-
class="mat-mdc-select-trigger"
3-
(click)="open()"
4-
#fallbackOverlayOrigin="cdkOverlayOrigin"
5-
#trigger>
6-
1+
<div
2+
cdk-overlay-origin
3+
class="mat-mdc-select-trigger"
4+
(click)="open()"
5+
#fallbackOverlayOrigin="cdkOverlayOrigin"
6+
#trigger
7+
>
78
<div class="mat-mdc-select-value" [attr.id]="_valueId">
89
@if (empty) {
910
<span class="mat-mdc-select-placeholder mat-mdc-select-min-line">{{placeholder}}</span>
@@ -22,7 +23,7 @@
2223
<div class="mat-mdc-select-arrow">
2324
<!-- Use an inline SVG, because it works better than a CSS triangle in high contrast mode. -->
2425
<svg viewBox="0 0 24 24" width="24px" height="24px" focusable="false" aria-hidden="true">
25-
<path d="M7 10l5 5 5-5z"/>
26+
<path d="M7 10l5 5 5-5z" />
2627
</svg>
2728
</div>
2829
</div>
@@ -39,8 +40,10 @@
3940
[cdkConnectedOverlayOrigin]="_preferredOverlayOrigin || fallbackOverlayOrigin"
4041
[cdkConnectedOverlayPositions]="_positions"
4142
[cdkConnectedOverlayWidth]="_overlayWidth"
43+
(detach)="close()"
4244
(backdropClick)="close()"
43-
(overlayKeydown)="_handleOverlayKeydown($event)">
45+
(overlayKeydown)="_handleOverlayKeydown($event)"
46+
>
4447
<div
4548
#panel
4649
role="listbox"
@@ -52,7 +55,8 @@
5255
[attr.aria-label]="ariaLabel || null"
5356
[attr.aria-labelledby]="_getPanelAriaLabelledby()"
5457
[ngClass]="panelClass"
55-
(keydown)="_handleKeydown($event)">
58+
(keydown)="_handleKeydown($event)"
59+
>
5660
<ng-content></ng-content>
5761
</div>
5862
</ng-template>

src/material/select/select.spec.ts

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
TAB,
1616
UP_ARROW,
1717
} from '@angular/cdk/keycodes';
18-
import {OverlayContainer, OverlayModule} from '@angular/cdk/overlay';
18+
import {Overlay, OverlayContainer, OverlayModule} from '@angular/cdk/overlay';
1919
import {ScrollDispatcher} from '@angular/cdk/scrolling';
2020
import {
2121
createKeyboardEvent,
@@ -56,15 +56,15 @@ import {
5656
ReactiveFormsModule,
5757
Validators,
5858
} from '@angular/forms';
59-
import {ErrorStateMatcher, MatOption, MatOptionSelectionChange} from '../core';
60-
import {FloatLabelType, MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldModule} from '../form-field';
61-
import {MAT_SELECT_CONFIG, MatSelectConfig} from '../select';
6259
import {By} from '@angular/platform-browser';
6360
import {NoopAnimationsModule} from '@angular/platform-browser/animations';
6461
import {EMPTY, Observable, Subject, Subscription} from 'rxjs';
6562
import {map} from 'rxjs/operators';
63+
import {ErrorStateMatcher, MatOption, MatOptionSelectionChange} from '../core';
64+
import {FloatLabelType, MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldModule} from '../form-field';
65+
import {MAT_SELECT_CONFIG, MatSelectConfig} from '../select';
6666
import {MatSelectModule} from './index';
67-
import {MatSelect} from './select';
67+
import {MAT_SELECT_SCROLL_STRATEGY, MatSelect} from './select';
6868
import {
6969
getMatSelectDynamicMultipleError,
7070
getMatSelectNonArrayValueError,
@@ -1782,6 +1782,38 @@ describe('MatSelect', () => {
17821782
.withContext('Expected select element to remain focused.')
17831783
.toBe(true);
17841784
}));
1785+
1786+
it('should close the panel when MAT_SELECT_SCROLL_STRATEGY token was defined with overlay close method', fakeAsync(() => {
1787+
waitForAsync(() =>
1788+
configureMatSelectTestingModule(
1789+
[],
1790+
[
1791+
{
1792+
provide: MAT_SELECT_SCROLL_STRATEGY,
1793+
useFactory: (overlay: Overlay) => {
1794+
return () => overlay.scrollStrategies.close();
1795+
},
1796+
deps: [Overlay],
1797+
},
1798+
],
1799+
),
1800+
);
1801+
1802+
fixture = TestBed.createComponent(BasicSelect);
1803+
fixture.detectChanges();
1804+
1805+
const selectElement = fixture.nativeElement.querySelector('.mat-mdc-select');
1806+
1807+
dispatchFakeEvent(selectElement, 'click');
1808+
fixture.detectChanges();
1809+
1810+
dispatchFakeEvent(window, 'scroll');
1811+
fixture.detectChanges();
1812+
1813+
flush();
1814+
1815+
expect(fixture.componentInstance.select.panelOpen).toBe(false);
1816+
}));
17851817
});
17861818

17871819
describe('selection logic', () => {

0 commit comments

Comments
 (0)