Skip to content

Commit 26c7e70

Browse files
feat(tree-select): add option to provide custom header
1 parent 37f13ee commit 26c7e70

File tree

5 files changed

+68
-27
lines changed

5 files changed

+68
-27
lines changed
Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,37 @@
1-
<cdk-virtual-scroll-viewport (keydown)="onKeydown($event)"
2-
class="virtual-scroll-container"
3-
[itemSize]="itemSize"
4-
tabindex="0">
5-
<mat-list *uiContentLoading="loading"
6-
role="tree"
7-
class="tree-container">
8-
<ng-container *ngIf="dataSource.data.length == 0">
9-
<ng-content select="[noDataMessage]"></ng-content>
10-
</ng-container>
11-
<ng-container *cdkVirtualFor="let node of dataSource; let i = index; trackBy: trackById;">
12-
<ui-tree-item (selected)="select(node)"
13-
(collapsed)="collapse(node)"
14-
(expanded)="expand(node)"
15-
[node]="node"
16-
[attr.nodekey]="node.key"
17-
[isSelected]="isSelected(node)">
18-
<ng-template *ngIf="itemTemplate"
19-
[ngTemplateOutlet]="itemTemplate"
20-
[ngTemplateOutletContext]="{
1+
<div cdkVirtualScrollingElement
2+
class="ui-tree-select-container">
3+
<ng-template *ngIf="headerTemplate"
4+
[ngTemplateOutlet]="headerTemplate">
5+
</ng-template>
6+
7+
<cdk-virtual-scroll-viewport (keydown)="onKeydown($event)"
8+
[itemSize]="itemSize"
9+
class="virtual-scroll-container"
10+
tabindex="0">
11+
<mat-list *uiContentLoading="loading"
12+
role="tree"
13+
class="tree-container">
14+
<ng-container *ngIf="dataSource.data.length == 0">
15+
<ng-content select="[noDataMessage]"></ng-content>
16+
</ng-container>
17+
<ng-container *cdkVirtualFor="let node of dataSource; let i = index; trackBy: trackById;">
18+
<ui-tree-item (selected)="select(node)"
19+
(collapsed)="collapse(node)"
20+
(expanded)="expand(node)"
21+
[node]="node"
22+
[attr.nodekey]="node.key"
23+
[isSelected]="isSelected(node)">
24+
<ng-template *ngIf="itemTemplate"
25+
[ngTemplateOutlet]="itemTemplate"
26+
[ngTemplateOutletContext]="{
2127
node: node,
2228
expanded: isExpanded(node),
2329
selected: isSelected(node),
2430
toggle: toggle(node)
2531
}">
26-
</ng-template>
27-
</ui-tree-item>
28-
</ng-container>
29-
</mat-list>
30-
</cdk-virtual-scroll-viewport>
32+
</ng-template>
33+
</ui-tree-item>
34+
</ng-container>
35+
</mat-list>
36+
</cdk-virtual-scroll-viewport>
37+
</div>

projects/angular/components/ui-tree-select/src/ui-tree-select.component.spec.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,15 @@ const DATA_STUB = [
4242
(expanded)="expanded($event)"
4343
(collapsed)="collapsed($event)">
4444
<p noDataMessage>no data</p>
45+
46+
<ng-template #headerTemplate>
47+
<ng-container *ngIf="showHeaderTemplate">
48+
<div class="header">
49+
header template
50+
</div>
51+
</ng-container>
52+
</ng-template>
53+
4554
<ng-template #itemTemplate
4655
let-node="node"
4756
let-expanded="expanded"
@@ -69,7 +78,7 @@ const DATA_STUB = [
6978
.test-host-container {
7079
height: 100%;
7180
}
72-
.virtual-scroll-container {
81+
.ui-tree-select-container {
7382
height: 500px;
7483
}
7584
`],
@@ -84,6 +93,7 @@ export class TestHostComponent {
8493
collapsed = jasmine.createSpy();
8594
initialSelection: string[] = [];
8695
expandOnSelect = false;
96+
showHeaderTemplate = false;
8797
}
8898

8999
describe('UiTreeSelectComponent', () => {
@@ -119,6 +129,14 @@ describe('UiTreeSelectComponent', () => {
119129
expect(fixture.nativeElement.textContent.trim()).toBe('no data');
120130
});
121131

132+
it('should correctly render header template', () => {
133+
component.showHeaderTemplate = true;
134+
fixture.detectChanges();
135+
const headerElement = fixture.nativeElement.querySelector('.header');
136+
expect(headerElement).toBeTruthy();
137+
expect(headerElement.textContent.trim()).toBe('header template');
138+
});
139+
122140
it('should correctly emit selected event', () => {
123141
const nodeWithChildren = fixture.nativeElement.querySelectorAll('.tree-item-container')[0];
124142
nodeWithChildren.click();

projects/angular/components/ui-tree-select/src/ui-tree-select.component.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ export class UiTreeSelectComponent implements AfterViewInit, OnDestroy {
6262
@ViewChildren(UiTreeItemComponent)
6363
items!: QueryList<UiTreeItemComponent>;
6464

65+
@ContentChild('headerTemplate')
66+
headerTemplate?: any;
67+
6568
@ContentChild('itemTemplate')
6669
itemTemplate?: any;
6770

projects/playground/src/app/pages/tree-select/tree-select.page.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33
(selected)="selected($event)"
44
(expanded)="expanded($event)">
55
<p noDataMessage>no data</p>
6+
7+
<ng-template #headerTemplate>
8+
<div class="header">
9+
<mat-icon>folder</mat-icon>
10+
<span>Header</span>
11+
</div>
12+
</ng-template>
13+
614
<ng-template #itemTemplate
715
let-node="node"
816
let-expanded="expanded"

projects/playground/src/app/pages/tree-select/tree-select.page.scss

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@
55
margin-bottom: $margin;
66
}
77

8-
.virtual-scroll-container {
8+
.ui-tree-select-container {
99
border: 2px solid cyan;
1010
height: 500px;
11+
12+
.header {
13+
display: flex;
14+
align-items: center;
15+
}
1116
}
1217

1318
.tree-item-container {

0 commit comments

Comments
 (0)