From 8c30cee5f488b8191fd529652bac4b286827a251 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 1 May 2018 10:47:37 -0400 Subject: [PATCH] fix(autocomplete): panel direction not being updated if the trigger direction changes (#10916) --- src/lib/autocomplete/autocomplete-trigger.ts | 9 ++++++-- src/lib/autocomplete/autocomplete.spec.ts | 24 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/lib/autocomplete/autocomplete-trigger.ts b/src/lib/autocomplete/autocomplete-trigger.ts index 7018ab310e5..341ff0a77c7 100644 --- a/src/lib/autocomplete/autocomplete-trigger.ts +++ b/src/lib/autocomplete/autocomplete-trigger.ts @@ -498,8 +498,9 @@ export class MatAutocompleteTrigger implements ControlValueAccessor, OnDestroy { }); } } else { - /** Update the panel width, in case the host width has changed */ + // Update the panel width and direction, in case anything has changed. this._overlayRef.updateSize({width: this._getHostWidth()}); + this._overlayRef.setDirection(this._getDirection()); } if (this._overlayRef && !this._overlayRef.hasAttached()) { @@ -524,7 +525,7 @@ export class MatAutocompleteTrigger implements ControlValueAccessor, OnDestroy { positionStrategy: this._getOverlayPosition(), scrollStrategy: this._scrollStrategy(), width: this._getHostWidth(), - direction: this._dir ? this._dir.value : 'ltr' + direction: this._getDirection() }); } @@ -541,6 +542,10 @@ export class MatAutocompleteTrigger implements ControlValueAccessor, OnDestroy { return this._positionStrategy; } + private _getDirection() { + return this._dir ? this._dir.value : 'ltr'; + } + private _getConnectedElement(): ElementRef { return this._formField ? this._formField.getConnectedOverlayOrigin() : this._element; } diff --git a/src/lib/autocomplete/autocomplete.spec.ts b/src/lib/autocomplete/autocomplete.spec.ts index 89a486453d3..4b4e9be5d8e 100644 --- a/src/lib/autocomplete/autocomplete.spec.ts +++ b/src/lib/autocomplete/autocomplete.spec.ts @@ -470,6 +470,30 @@ describe('MatAutocomplete', () => { expect(overlayPane.getAttribute('dir')).toEqual('rtl'); }); + it('should update the panel direction if it changes for the trigger', () => { + const dirProvider = {value: 'rtl'}; + const rtlFixture = createComponent(SimpleAutocomplete, [ + {provide: Directionality, useFactory: () => dirProvider}, + ]); + + rtlFixture.detectChanges(); + rtlFixture.componentInstance.trigger.openPanel(); + rtlFixture.detectChanges(); + + let overlayPane = overlayContainerElement.querySelector('.cdk-overlay-pane')!; + expect(overlayPane.getAttribute('dir')).toEqual('rtl'); + + rtlFixture.componentInstance.trigger.closePanel(); + rtlFixture.detectChanges(); + + dirProvider.value = 'ltr'; + rtlFixture.componentInstance.trigger.openPanel(); + rtlFixture.detectChanges(); + + overlayPane = overlayContainerElement.querySelector('.cdk-overlay-pane')!; + expect(overlayPane.getAttribute('dir')).toEqual('ltr'); + }); + describe('forms integration', () => { let fixture: ComponentFixture; let input: HTMLInputElement;