src/lib/navigation/navigation.component.ts
OnInit
| changeDetection | ChangeDetectionStrategy.OnPush |
| encapsulation | ViewEncapsulation.None |
| host | { |
| selector | ul[rxap-navigation] |
| imports |
NgFor
NgIf
MatDividerModule
forwardRef(() => NavigationItemComponent)
AsyncPipe
|
| styleUrls | ./navigation.component.scss |
| templateUrl | ./navigation.component.html |
Properties |
|
Methods |
|
Inputs |
| items | |
| level | |
Default value : 0
|
|
| root | |
Default value : false
|
|
| Public asNavigationItem | ||||||
asNavigationItem(item: NavigationItem | NavigationDividerItem)
|
||||||
|
Parameters :
Returns :
NavigationItem
|
| Public isNavigationDividerItem | ||||||
isNavigationDividerItem(item: NavigationItem | NavigationDividerItem)
|
||||||
|
Parameters :
Returns :
NavigationDividerItem
|
| Public isNavigationItem | ||||||
isNavigationItem(item: NavigationItem | NavigationDividerItem)
|
||||||
|
Parameters :
Returns :
NavigationItem
|
| Public Readonly collapsed |
Default value : computed(() => this.layoutService.collapsed())
|
| Protected Readonly injector |
Default value : inject(INJECTOR)
|
| Public items |
| Protected Readonly layoutService |
Default value : inject(LayoutService)
|
| Public level |
Default value : 0
|
| Public navigationItems |
Default value : computed(() => this.items() ?? [])
|
| Protected Readonly navigationService |
Default value : inject(NavigationService)
|
| Public Readonly root |
Default value : false
|
import {
AsyncPipe,
NgFor,
NgIf,
} from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
computed,
forwardRef,
inject,
INJECTOR,
input,
OnInit,
runInInjectionContext,
ViewEncapsulation,
} from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { MatDividerModule } from '@angular/material/divider';
import { LayoutService } from '../layout.service';
import { NavigationService } from '../navigation.service';
import {
Navigation,
NavigationDividerItem,
NavigationItem,
} from './navigation-item';
import { NavigationItemComponent } from './navigation-item/navigation-item.component';
@Component({
// eslint-disable-next-line @angular-eslint/component-selector
selector: 'ul[rxap-navigation]',
templateUrl: './navigation.component.html',
styleUrls: ['./navigation.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
host: {
class: 'list-none dark:text-neutral-400 text-neutral-700',
},
imports: [
NgFor,
NgIf,
MatDividerModule,
forwardRef(() => NavigationItemComponent),
AsyncPipe,
]
})
export class NavigationComponent implements OnInit {
public items = input<Navigation>();
public level = input(0);
protected readonly navigationService = inject(NavigationService);
protected readonly layoutService = inject(LayoutService);
public readonly collapsed = computed(() => this.layoutService.collapsed());
public navigationItems = computed(() => this.items() ?? []);
public readonly root = input(false);
protected readonly injector = inject(INJECTOR);
public ngOnInit(): void {
if (this.root()) {
runInInjectionContext(this.injector, () => {
this.navigationItems = toSignal(this.navigationService.config$, { initialValue: [] });
});
}
}
// region type save item property
// required to check the type of the item property in the ngFor loop
public isNavigationDividerItem(
item: NavigationItem | NavigationDividerItem,
): item is NavigationDividerItem {
return (item as any)['divider'];
}
public isNavigationItem(
item: NavigationItem | NavigationDividerItem,
): item is NavigationItem {
return !this.isNavigationDividerItem(item);
}
public asNavigationItem(
item: NavigationItem | NavigationDividerItem,
): NavigationItem {
if (!this.isNavigationItem(item)) {
throw new Error('The item is not a NavigationItem');
}
return item;
}
// endregion
}
@for (item of navigationItems(); track item) {
@if (isNavigationDividerItem(item)) {
<mat-divider></mat-divider>
<div *ngIf="!collapsed() && item.title" class="pl-5 h-6">
{{item.title}}
</div>
} @else if (isNavigationItem(item)) {
<li [item]="asNavigationItem(item)"
[level]="level()"
rxap-navigation-item>
</li>
}
}
./navigation.component.scss