Files
clients/libs/components/src/breadcrumbs/breadcrumbs.component.ts
Oscar Hinton ac23878847 [CL-934] Migrate breadcrumbs to OnPush (#17390)
Migrates BreadcrumbComponent and BreadcrumbsComponent to OnPush and changes any property to computed signals.
2025-12-16 16:15:34 +01:00

60 lines
1.9 KiB
TypeScript

import { CommonModule } from "@angular/common";
import {
ChangeDetectionStrategy,
Component,
computed,
contentChildren,
input,
} from "@angular/core";
import { RouterModule } from "@angular/router";
import { I18nPipe } from "@bitwarden/ui-common";
import { IconButtonModule } from "../icon-button";
import { LinkModule } from "../link";
import { MenuModule } from "../menu";
import { BreadcrumbComponent } from "./breadcrumb.component";
/**
* Breadcrumbs are used to help users understand where they are in a products navigation. Typically
* Bitwarden uses this component to indicate the user's current location in a set of data organized in
* containers (Collections, Folders, or Projects).
*/
@Component({
selector: "bit-breadcrumbs",
templateUrl: "./breadcrumbs.component.html",
imports: [I18nPipe, CommonModule, LinkModule, RouterModule, IconButtonModule, MenuModule],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class BreadcrumbsComponent {
/**
* The maximum number of breadcrumbs to show before overflow.
*/
readonly show = input(3);
protected readonly breadcrumbs = contentChildren(BreadcrumbComponent);
/** Whether the breadcrumbs exceed the show limit and require an overflow menu */
protected readonly hasOverflow = computed(() => this.breadcrumbs().length > this.show());
/** Breadcrumbs shown before the overflow menu */
protected readonly beforeOverflow = computed(() => {
const items = this.breadcrumbs();
const showCount = this.show();
if (items.length > showCount) {
return items.slice(0, showCount - 1);
}
return items;
});
/** Breadcrumbs hidden in the overflow menu */
protected readonly overflow = computed(() => {
return this.breadcrumbs().slice(this.show() - 1, -1);
});
/** The last breadcrumb, shown after the overflow menu */
protected readonly afterOverflow = computed(() => this.breadcrumbs().slice(-1));
}