File

src/lib/navigation/navigation.component.ts

Implements

OnInit

Metadata

Index

Properties
Methods
Inputs

Inputs

items
level
Default value : 0
root
Default value : false

Methods

Public asNavigationItem
asNavigationItem(item: NavigationItem | NavigationDividerItem)
Parameters :
Name Type Optional
item NavigationItem | NavigationDividerItem No
Returns : NavigationItem
Public isNavigationDividerItem
isNavigationDividerItem(item: NavigationItem | NavigationDividerItem)
Parameters :
Name Type Optional
item NavigationItem | NavigationDividerItem No
Public isNavigationItem
isNavigationItem(item: NavigationItem | NavigationDividerItem)
Parameters :
Name Type Optional
item NavigationItem | NavigationDividerItem No
Returns : NavigationItem

Properties

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

Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""