Skip to content

Commit d56a492

Browse files
authored
feat(tabset): ability to provide template as tab label (#2829)
1 parent a86da11 commit d56a492

File tree

9 files changed

+76
-11
lines changed

9 files changed

+76
-11
lines changed

src/app/playground-components.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,6 +1351,12 @@ export const PLAYGROUND_COMPONENTS: ComponentLink[] = [
13511351
component: 'TabsetDisabledComponent',
13521352
name: 'Tabset Disabled',
13531353
},
1354+
{
1355+
path: 'tabset-template-title.component',
1356+
link: '/tabset/tabset-template-title.component',
1357+
component: 'TabsetTemplateTitleComponent',
1358+
name: 'Tabset Template Title',
1359+
},
13541360
],
13551361
},
13561362
{
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Directive, TemplateRef } from '@angular/core';
2+
3+
@Directive({
4+
selector: '[nbTabTitle]',
5+
})
6+
export class NbTabTitleDirective {
7+
constructor(public templateRef: TemplateRef<any>) {}
8+
}

src/framework/theme/components/tabset/tabset.component.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { NbComponentOrCustomStatus } from '../component-status';
2424
import { NbBadgePosition } from '../badge/badge.component';
2525
import { NbIconConfig } from '../icon/icon.component';
2626
import { NbTabContentDirective } from './tab-content.directive';
27+
import { NbTabTitleDirective } from './tab-title.directive';
2728

2829
/**
2930
* Specific tab container.
@@ -51,6 +52,7 @@ import { NbTabContentDirective } from './tab-content.directive';
5152
})
5253
export class NbTabComponent {
5354
@ContentChild(NbTabContentDirective) tabContentDirective: NbTabContentDirective;
55+
@ContentChild(NbTabTitleDirective) tabTitleDirective: NbTabTitleDirective;
5456

5557
/**
5658
* Tab title
@@ -248,6 +250,9 @@ export class NbTabComponent {
248250
* </nb-tabset>
249251
* ```
250252
*
253+
* You can provide a template as a tab title via `<ng-template nbTabTitle>`:
254+
* @stacked-example(Tab title template, tabset/tabset-template-title.component)
255+
*
251256
* @styles
252257
*
253258
* tabset-background-color:
@@ -309,7 +314,13 @@ export class NbTabComponent {
309314
>
310315
<a href (click)="$event.preventDefault()" tabindex="-1" class="tab-link">
311316
<nb-icon *ngIf="tab.tabIcon" [config]="tab.tabIcon"></nb-icon>
312-
<span *ngIf="tab.tabTitle" class="tab-text">{{ tab.tabTitle }}</span>
317+
<ng-container
318+
*ngIf="tab.tabTitleDirective; else textTitleTemplate"
319+
[ngTemplateOutlet]="tab.tabTitleDirective.templateRef"
320+
></ng-container>
321+
<ng-template #textTitleTemplate>
322+
<span class="tab-text">{{ tab.tabTitle }}</span>
323+
</ng-template>
313324
</a>
314325
<nb-badge
315326
*ngIf="tab.badgeText || tab.badgeDot"

src/framework/theme/components/tabset/tabset.module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ import { NbTabsetComponent, NbTabComponent } from './tabset.component';
1212
import { NbBadgeModule } from '../badge/badge.module';
1313
import { NbIconModule } from '../icon/icon.module';
1414
import { NbTabContentDirective } from './tab-content.directive';
15+
import { NbTabTitleDirective } from './tab-title.directive';
1516

1617
const NB_TABSET_COMPONENTS = [NbTabsetComponent, NbTabComponent];
1718

18-
const NB_TABSET_DIRECTIVES = [NbTabContentDirective];
19+
const NB_TABSET_DIRECTIVES = [NbTabContentDirective, NbTabTitleDirective];
1920

2021
@NgModule({
2122
imports: [NbSharedModule, NbBadgeModule, NbIconModule],

src/framework/theme/public_api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export * from './components/datepicker/date-timepicker.component';
8181
export * from './components/datepicker/calendar-with-time.component';
8282
export * from './components/tabset/tabset.component';
8383
export * from './components/tabset/tab-content.directive';
84+
export * from './components/tabset/tab-title.directive';
8485
export * from './components/user/user.module';
8586
export * from './components/user/user.component';
8687
export * from './components/actions/actions.module';

src/playground/with-layout/tabset/tabset-routing.module.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77
import { NgModule } from '@angular/core';
8-
import { RouterModule, Route} from '@angular/router';
8+
import { RouterModule, Route } from '@angular/router';
99
import {
1010
RouteTabsetShowcaseChild1Component,
1111
RouteTabsetShowcaseChild2Component,
@@ -18,6 +18,7 @@ import { TabsetShowcaseComponent } from './tabset-showcase.component';
1818
import { TabsetTestComponent } from './tabset-test.component';
1919
import { TabsetWidthComponent } from './tabset-width.component';
2020
import { TabsetDisabledComponent } from './tabset-disabled.component';
21+
import { TabsetTemplateTitleComponent } from './tabset-template-title.component';
2122

2223
const routes: Route[] = [
2324
{
@@ -71,10 +72,14 @@ const routes: Route[] = [
7172
path: 'tabset-disabled.component',
7273
component: TabsetDisabledComponent,
7374
},
75+
{
76+
path: 'tabset-template-title.component',
77+
component: TabsetTemplateTitleComponent,
78+
},
7479
];
7580

7681
@NgModule({
77-
imports: [ RouterModule.forChild(routes) ],
78-
exports: [ RouterModule ],
82+
imports: [RouterModule.forChild(routes)],
83+
exports: [RouterModule],
7984
})
8085
export class TabsetRoutingModule {}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<nb-card>
2+
<nb-card-body>
3+
<nb-tabset>
4+
<nb-tab>
5+
<ng-template nbTabTitle>
6+
<span>Orders</span>
7+
</ng-template>
8+
<p>List of <strong>orders</strong>.</p>
9+
</nb-tab>
10+
<nb-tab>
11+
<span *nbTabTitle>Transactions</span>
12+
<p>List of <strong>transactions</strong>.</p>
13+
</nb-tab>
14+
</nb-tabset>
15+
</nb-card-body>
16+
</nb-card>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* @license
3+
* Copyright Akveo. All Rights Reserved.
4+
* Licensed under the MIT License. See License.txt in the project root for license information.
5+
*/
6+
7+
import { ChangeDetectionStrategy, Component } from '@angular/core';
8+
9+
@Component({
10+
templateUrl: './tabset-template-title.component.html',
11+
styles: [
12+
`
13+
:host nb-tab {
14+
padding: 1.25rem;
15+
}
16+
`,
17+
],
18+
changeDetection: ChangeDetectionStrategy.OnPush,
19+
})
20+
export class TabsetTemplateTitleComponent {}

src/playground/with-layout/tabset/tabset.module.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
RouteTabsetShowcaseChild3Component,
2020
} from './components/route-tabset-children.component';
2121
import { TabsetDisabledComponent } from './tabset-disabled.component';
22+
import { TabsetTemplateTitleComponent } from './tabset-template-title.component';
2223

2324
@NgModule({
2425
declarations: [
@@ -32,12 +33,8 @@ import { TabsetDisabledComponent } from './tabset-disabled.component';
3233
RouteTabsetShowcaseChild2Component,
3334
TabsetDisabledComponent,
3435
RouteTabsetShowcaseChild3Component,
36+
TabsetTemplateTitleComponent,
3537
],
36-
imports: [
37-
NbTabsetModule,
38-
NbRouteTabsetModule,
39-
NbCardModule,
40-
TabsetRoutingModule,
41-
],
38+
imports: [NbTabsetModule, NbRouteTabsetModule, NbCardModule, TabsetRoutingModule],
4239
})
4340
export class TabsetModule {}

0 commit comments

Comments
 (0)