From 3ddcd8df29c1404255420217bbd5ada507cdefc0 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 7 Feb 2019 20:51:06 +0100 Subject: [PATCH] fix(tree): opposite direction padding not being reset on change (#14816) Fixes the left padding on a tree not being reset when going from LTR to RTL which causes a padding on both sides. --- src/cdk/tree/BUILD.bazel | 1 + src/cdk/tree/padding.ts | 9 ++++++--- src/cdk/tree/tree.spec.ts | 29 ++++++++++++++++++++++++++--- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/cdk/tree/BUILD.bazel b/src/cdk/tree/BUILD.bazel index 4244d13344e..99eba65211c 100644 --- a/src/cdk/tree/BUILD.bazel +++ b/src/cdk/tree/BUILD.bazel @@ -26,6 +26,7 @@ ng_test_library( "@rxjs", "@rxjs//operators", "//src/cdk/collections", + "//src/cdk/bidi", ":tree", ], ) diff --git a/src/cdk/tree/padding.ts b/src/cdk/tree/padding.ts index 2fb9ff7b75e..5c8cad8aaa1 100644 --- a/src/cdk/tree/padding.ts +++ b/src/cdk/tree/padding.ts @@ -67,8 +67,8 @@ export class CdkTreeNodePadding implements OnDestroy { private _element: ElementRef, @Optional() private _dir: Directionality) { this._setPadding(); - if (this._dir) { - this._dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => this._setPadding()); + if (_dir) { + _dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => this._setPadding()); } } @@ -87,9 +87,12 @@ export class CdkTreeNodePadding implements OnDestroy { } _setPadding() { + const element = this._element.nativeElement; const padding = this._paddingIndent(); const paddingProp = this._dir && this._dir.value === 'rtl' ? 'paddingRight' : 'paddingLeft'; + const resetProp = paddingProp === 'paddingLeft' ? 'paddingRight' : 'paddingLeft'; - this._renderer.setStyle(this._element.nativeElement, paddingProp, padding); + this._renderer.setStyle(element, paddingProp, padding); + this._renderer.setStyle(element, resetProp, ''); } } diff --git a/src/cdk/tree/tree.spec.ts b/src/cdk/tree/tree.spec.ts index 24e40195ec6..34ed4542afd 100644 --- a/src/cdk/tree/tree.spec.ts +++ b/src/cdk/tree/tree.spec.ts @@ -6,9 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ import {ComponentFixture, TestBed, fakeAsync, flush} from '@angular/core/testing'; -import {Component, ViewChild, TrackByFunction, Type} from '@angular/core'; +import {Component, ViewChild, TrackByFunction, Type, EventEmitter} from '@angular/core'; import {CollectionViewer, DataSource} from '@angular/cdk/collections'; +import {Directionality, Direction} from '@angular/cdk/bidi'; import {combineLatest, BehaviorSubject, Observable} from 'rxjs'; import {map} from 'rxjs/operators'; @@ -27,10 +28,15 @@ describe('CdkTree', () => { let dataSource: FakeDataSource; let treeElement: HTMLElement; let tree: CdkTree; + let dir: {value: Direction, change: EventEmitter}; function configureCdkTreeTestingModule(declarations: Type[]) { TestBed.configureTestingModule({ imports: [CdkTreeModule], + providers: [{ + provide: Directionality, + useFactory: () => dir = {value: 'ltr', change: new EventEmitter()} + }], declarations: declarations, }).compileComponents(); } @@ -131,6 +137,23 @@ describe('CdkTree', () => { [`${data[2].pizzaTopping} - ${data[2].pizzaCheese} + ${data[2].pizzaBase}`]); }); + it('should reset the opposite direction padding if the direction changes', () => { + const node = getNodes(treeElement)[0]; + + component.indent = 10; + fixture.detectChanges(); + + expect(node.style.paddingLeft).toBe('10px'); + expect(node.style.paddingRight).toBeFalsy(); + + dir.value = 'rtl'; + dir.change.emit('rtl'); + fixture.detectChanges(); + + expect(node.style.paddingRight).toBe('10px'); + expect(node.style.paddingLeft).toBeFalsy(); + }); + }); describe('with toggle', () => { @@ -1011,8 +1034,8 @@ class FakeDataSource extends DataSource { } } -function getNodes(treeElement: Element): Element[] { - return [].slice.call(treeElement.querySelectorAll('.cdk-tree-node'))!; +function getNodes(treeElement: Element): HTMLElement[] { + return Array.from(treeElement.querySelectorAll('.cdk-tree-node')); } function expectFlatTreeToMatch(treeElement: Element,