Skip to content

Commit 3ddcd8d

Browse files
crisbetojelbourn
authored andcommitted
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.
1 parent d7644ac commit 3ddcd8d

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

src/cdk/tree/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ ng_test_library(
2626
"@rxjs",
2727
"@rxjs//operators",
2828
"//src/cdk/collections",
29+
"//src/cdk/bidi",
2930
":tree",
3031
],
3132
)

src/cdk/tree/padding.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ export class CdkTreeNodePadding<T> implements OnDestroy {
6767
private _element: ElementRef<HTMLElement>,
6868
@Optional() private _dir: Directionality) {
6969
this._setPadding();
70-
if (this._dir) {
71-
this._dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => this._setPadding());
70+
if (_dir) {
71+
_dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => this._setPadding());
7272
}
7373
}
7474

@@ -87,9 +87,12 @@ export class CdkTreeNodePadding<T> implements OnDestroy {
8787
}
8888

8989
_setPadding() {
90+
const element = this._element.nativeElement;
9091
const padding = this._paddingIndent();
9192
const paddingProp = this._dir && this._dir.value === 'rtl' ? 'paddingRight' : 'paddingLeft';
93+
const resetProp = paddingProp === 'paddingLeft' ? 'paddingRight' : 'paddingLeft';
9294

93-
this._renderer.setStyle(this._element.nativeElement, paddingProp, padding);
95+
this._renderer.setStyle(element, paddingProp, padding);
96+
this._renderer.setStyle(element, resetProp, '');
9497
}
9598
}

src/cdk/tree/tree.spec.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88
import {ComponentFixture, TestBed, fakeAsync, flush} from '@angular/core/testing';
9-
import {Component, ViewChild, TrackByFunction, Type} from '@angular/core';
9+
import {Component, ViewChild, TrackByFunction, Type, EventEmitter} from '@angular/core';
1010

1111
import {CollectionViewer, DataSource} from '@angular/cdk/collections';
12+
import {Directionality, Direction} from '@angular/cdk/bidi';
1213
import {combineLatest, BehaviorSubject, Observable} from 'rxjs';
1314
import {map} from 'rxjs/operators';
1415

@@ -27,10 +28,15 @@ describe('CdkTree', () => {
2728
let dataSource: FakeDataSource;
2829
let treeElement: HTMLElement;
2930
let tree: CdkTree<TestData>;
31+
let dir: {value: Direction, change: EventEmitter<Direction>};
3032

3133
function configureCdkTreeTestingModule(declarations: Type<any>[]) {
3234
TestBed.configureTestingModule({
3335
imports: [CdkTreeModule],
36+
providers: [{
37+
provide: Directionality,
38+
useFactory: () => dir = {value: 'ltr', change: new EventEmitter<Direction>()}
39+
}],
3440
declarations: declarations,
3541
}).compileComponents();
3642
}
@@ -131,6 +137,23 @@ describe('CdkTree', () => {
131137
[`${data[2].pizzaTopping} - ${data[2].pizzaCheese} + ${data[2].pizzaBase}`]);
132138
});
133139

140+
it('should reset the opposite direction padding if the direction changes', () => {
141+
const node = getNodes(treeElement)[0];
142+
143+
component.indent = 10;
144+
fixture.detectChanges();
145+
146+
expect(node.style.paddingLeft).toBe('10px');
147+
expect(node.style.paddingRight).toBeFalsy();
148+
149+
dir.value = 'rtl';
150+
dir.change.emit('rtl');
151+
fixture.detectChanges();
152+
153+
expect(node.style.paddingRight).toBe('10px');
154+
expect(node.style.paddingLeft).toBeFalsy();
155+
});
156+
134157
});
135158

136159
describe('with toggle', () => {
@@ -1011,8 +1034,8 @@ class FakeDataSource extends DataSource<TestData> {
10111034
}
10121035
}
10131036

1014-
function getNodes(treeElement: Element): Element[] {
1015-
return [].slice.call(treeElement.querySelectorAll('.cdk-tree-node'))!;
1037+
function getNodes(treeElement: Element): HTMLElement[] {
1038+
return Array.from(treeElement.querySelectorAll('.cdk-tree-node'));
10161039
}
10171040

10181041
function expectFlatTreeToMatch(treeElement: Element,

0 commit comments

Comments
 (0)