diff --git a/apps/mina-sidor-fa/src/app/shared/components/layout/layout.component.html b/apps/mina-sidor-fa/src/app/shared/components/layout/layout.component.html index e3ffb7f..39cac2d 100644 --- a/apps/mina-sidor-fa/src/app/shared/components/layout/layout.component.html +++ b/apps/mina-sidor-fa/src/app/shared/components/layout/layout.component.html @@ -7,12 +7,7 @@
- - +
diff --git a/apps/mina-sidor-fa/src/app/shared/components/layout/layout.module.ts b/apps/mina-sidor-fa/src/app/shared/components/layout/layout.module.ts index d16bb8e..d8fea45 100644 --- a/apps/mina-sidor-fa/src/app/shared/components/layout/layout.module.ts +++ b/apps/mina-sidor-fa/src/app/shared/components/layout/layout.module.ts @@ -1,9 +1,9 @@ -import { DigiNgNavigationBreadcrumbsModule } from '@af/digi-ng/_navigation/navigation-breadcrumbs'; import { CommonModule } from '@angular/common'; import { HttpClient } from '@angular/common/http'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { UiLoaderModule } from '@ui/loader/loader.module'; +import { UiBreadcrumbsModule } from '@ui/breadcrumbs/breadcrumbs.module'; import { MarkdownModule } from 'ngx-markdown'; import { FooterModule } from './components/footer/footer.module'; import { NavigationModule } from './components/navigation/navigation.module'; @@ -22,8 +22,8 @@ import { LayoutComponent } from './layout.component'; SidebarModule, FooterModule, MarkdownModule.forRoot({ loader: HttpClient }), - DigiNgNavigationBreadcrumbsModule, UiLoaderModule, + UiBreadcrumbsModule, ], exports: [LayoutComponent], }) diff --git a/libs/ui/src/breadcrumbs/breadcrumbs-item.model.ts b/libs/ui/src/breadcrumbs/breadcrumbs-item.model.ts new file mode 100644 index 0000000..b83c092 --- /dev/null +++ b/libs/ui/src/breadcrumbs/breadcrumbs-item.model.ts @@ -0,0 +1,5 @@ +export interface BreadcrumbsItem { + text: string; + href?: string; + routerLink?: string; +} diff --git a/libs/ui/src/breadcrumbs/breadcrumbs-link-target.enum.ts b/libs/ui/src/breadcrumbs/breadcrumbs-link-target.enum.ts new file mode 100644 index 0000000..85c47ef --- /dev/null +++ b/libs/ui/src/breadcrumbs/breadcrumbs-link-target.enum.ts @@ -0,0 +1,4 @@ +export enum BreadcrumbsLinkTarget { + SELF = '_self', + BLANK = '_blank', +} diff --git a/libs/ui/src/breadcrumbs/breadcrumbs.component.html b/libs/ui/src/breadcrumbs/breadcrumbs.component.html new file mode 100644 index 0000000..17b8c75 --- /dev/null +++ b/libs/ui/src/breadcrumbs/breadcrumbs.component.html @@ -0,0 +1,27 @@ + diff --git a/libs/ui/src/breadcrumbs/breadcrumbs.component.scss b/libs/ui/src/breadcrumbs/breadcrumbs.component.scss new file mode 100644 index 0000000..b49cce4 --- /dev/null +++ b/libs/ui/src/breadcrumbs/breadcrumbs.component.scss @@ -0,0 +1,28 @@ +.ui-breadcrumbs { + &__items { + display: flex; + flex-wrap: wrap; + list-style: none; + margin: 0; + padding: 0; + } + + &__item { + font-family: var(--digi--typography--font-family); + font-size: var(--digi--typography--font-size--xs); + color: var(--digi--typography--color--text); + + &:not(:last-child) { + padding-right: var(--digi--layout--padding--10); + + &::after { + content: '/'; + padding-left: var(--digi--layout--padding--10); + } + } + } + + &__link { + text-decoration: none; + } +} diff --git a/libs/ui/src/breadcrumbs/breadcrumbs.component.spec.ts b/libs/ui/src/breadcrumbs/breadcrumbs.component.spec.ts new file mode 100644 index 0000000..919763b --- /dev/null +++ b/libs/ui/src/breadcrumbs/breadcrumbs.component.spec.ts @@ -0,0 +1,10 @@ +/* tslint:disable:no-unused-variable */ +import { BreadcrumbsComponent } from './breadcrumbs.component'; + +describe('BreadcrumbsComponent', () => { + let component: BreadcrumbsComponent; + it('should create', () => { + component = new BreadcrumbsComponent(); + expect(component).toBeTruthy(); + }); +}); diff --git a/libs/ui/src/breadcrumbs/breadcrumbs.component.stories.ts b/libs/ui/src/breadcrumbs/breadcrumbs.component.stories.ts new file mode 100644 index 0000000..a2639a5 --- /dev/null +++ b/libs/ui/src/breadcrumbs/breadcrumbs.component.stories.ts @@ -0,0 +1,41 @@ +import { BreadcrumbsComponent } from './breadcrumbs.component'; +import { UiBreadcrumbsModule } from './breadcrumbs.module'; +import { BreadcrumbsItem } from './breadcrumbs-item.model'; + +export default { title: 'Breadcrumbs', component: BreadcrumbsComponent }; + +const componentModule = { + moduleMetadata: { + declarations: [], + imports: [UiBreadcrumbsModule], + }, +}; + +const items: BreadcrumbsItem[] = [ + { + text: 'Start', + href: '/', + }, + { + text: 'Sub-page 1', + href: '#', + }, + { + text: 'Sub-page 2', + href: '#', + }, + { + text: 'Current page', + href: 'i-will-not-be-used-because-i-am-the-last-item', + }, +]; + +export const standard = () => ({ + ...componentModule, + template: ` + + `, + props: { + items, + }, +}); diff --git a/libs/ui/src/breadcrumbs/breadcrumbs.component.ts b/libs/ui/src/breadcrumbs/breadcrumbs.component.ts new file mode 100644 index 0000000..9cfc566 --- /dev/null +++ b/libs/ui/src/breadcrumbs/breadcrumbs.component.ts @@ -0,0 +1,80 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { BreadcrumbsItem } from './breadcrumbs-item.model'; +import { BreadcrumbsLinkTarget } from './breadcrumbs-link-target.enum'; +/** + * This is a breadcrumbs component. Provide an array of BreadcrumbsItem and it will create a list of links. + * If the BreadcrumbsItem contains both href and routerLink, the routerLink takes presedence. + */ +@Component({ + selector: 'ui-breadcrumbs', + templateUrl: './breadcrumbs.component.html', + styleUrls: ['./breadcrumbs.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class BreadcrumbsComponent { + /** + * A list of navigation items. + */ + @Input() uiItems: BreadcrumbsItem[] = []; + + /** + * An optional aria-label for the nav element. Defaults to 'breadcrumbs'. + */ + @Input() uiAriaLabel: string = 'breadcrumbs'; + + /** + * The element's target attribute. If target is BreadcrumbsLinkTarget.BLANK, the component will add necessary rel attribute + * for security reasons. + */ + @Input() uiTarget?: BreadcrumbsLinkTarget; + + /** + * Optional download attribute + */ + @Input() uiDownload?: boolean | string; + + /** + * Optional type attribute + */ + @Input() uiType?: string; + + /** + * A href string. + */ + @Input() uiHref: string = ' '; + + /** + * Optional rel attribute + */ + @Input() uiRel?: string; + + /** + * Angular router queryParams. F.e. `{ lorem: "ipsum" }` + */ + @Input() uiQueryParams?: { [key: string]: string }; + + /** + * How to handle query parameters in a router link. One of: + * - merge : Merge new with current parameters. + * - preserve : Preserve current parameters. + */ + @Input() uiQueryParamsHandling: 'merge' | 'preserve' = 'merge'; + + get parents(): BreadcrumbsItem[] { + return this.uiItems.slice(0, this.uiItems.length - 1); + } + + get currentItem(): BreadcrumbsItem { + return this.uiItems[this.uiItems.length - 1]; + } + + get rel() { + if (this.uiTarget === BreadcrumbsLinkTarget.BLANK) { + return 'noopener noreferrer'; + } else if (this.uiRel) { + return this.uiRel; + } else { + return null; + } + } +} diff --git a/libs/ui/src/breadcrumbs/breadcrumbs.module.ts b/libs/ui/src/breadcrumbs/breadcrumbs.module.ts new file mode 100644 index 0000000..c9338a7 --- /dev/null +++ b/libs/ui/src/breadcrumbs/breadcrumbs.module.ts @@ -0,0 +1,11 @@ +import { CommonModule } from '@angular/common'; +import { BreadcrumbsComponent } from './breadcrumbs.component'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +@NgModule({ + imports: [CommonModule, RouterModule], + declarations: [BreadcrumbsComponent], + exports: [BreadcrumbsComponent], +}) +export class UiBreadcrumbsModule {}