From e52d5255641c568d6f0f289d5eaee2892fe2f393 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 5 Sep 2024 16:15:11 +0200
Subject: [PATCH] OZG-6108 Use new components for nav bar

---
 .../apps/admin/src/app/app.component.html     | 16 +++++++-----
 .../apps/admin/src/app/app.component.spec.ts  | 26 ++++++++++++++-----
 alfa-client/apps/admin/src/app/app.module.ts  |  8 ++++++
 alfa-client/libs/design-system/src/index.ts   |  2 ++
 .../nav-item/nav-item.component.spec.ts       | 24 +++++++++++++++++
 .../lib/navbar/nav-item/nav-item.component.ts |  5 ++--
 .../src/lib/navbar/navbar/navbar.stories.ts   |  1 +
 7 files changed, 68 insertions(+), 14 deletions(-)

diff --git a/alfa-client/apps/admin/src/app/app.component.html b/alfa-client/apps/admin/src/app/app.component.html
index adbd608ba8..66f83dc085 100644
--- a/alfa-client/apps/admin/src/app/app.component.html
+++ b/alfa-client/apps/admin/src/app/app.component.html
@@ -16,12 +16,16 @@
     ></user-profile-button-container>
   </header>
   <div class="flex h-screen w-full justify-center overflow-y-auto">
-    <nav class="h-full w-72 bg-slate-100 p-4">
-      <admin-navigation
-        *ngIf="apiRoot | hasLink: ApiRootLinkRel.CONFIGURATION"
-        data-test-id="navigation"
-      ></admin-navigation>
-    </nav>
+    <ods-navbar data-test-id="navigation">
+      <ng-container *ngIf="apiRoot | hasLink: ApiRootLinkRel.CONFIGURATION">
+        <ods-nav-item caption="Organisationseinheiten" to="/organisationseinheiten">
+          <ods-orga-unit-icon icon />
+        </ods-nav-item>
+        <ods-nav-item caption="Postfach" to="/postfach">
+          <ods-mailbox-icon icon />
+        </ods-nav-item>
+      </ng-container>
+    </ods-navbar>
     <main class="flex-1 overflow-y-auto bg-white px-6 py-4">
       <router-outlet
         *ngIf="
diff --git a/alfa-client/apps/admin/src/app/app.component.spec.ts b/alfa-client/apps/admin/src/app/app.component.spec.ts
index d46fcd163a..9dc1460ef4 100644
--- a/alfa-client/apps/admin/src/app/app.component.spec.ts
+++ b/alfa-client/apps/admin/src/app/app.component.spec.ts
@@ -14,7 +14,13 @@ import {
 } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { Router, RouterOutlet } from '@angular/router';
-import { AdminLogoIconComponent } from '@ods/system';
+import {
+  AdminLogoIconComponent,
+  MailboxIconComponent,
+  NavItemComponent,
+  NavbarComponent,
+  OrgaUnitIconComponent,
+} from '@ods/system';
 import { AuthenticationService } from 'authentication';
 import { NavigationComponent } from 'libs/admin-settings/src/lib/navigation/navigation.component';
 import { createApiRootResource } from 'libs/api-root-shared/test/api-root';
@@ -50,8 +56,12 @@ describe('AppComponent', () => {
         AppComponent,
         MockComponent(NavigationComponent),
         MockComponent(AdminLogoIconComponent),
+        MockComponent(OrgaUnitIconComponent),
+        MockComponent(MailboxIconComponent),
         MockComponent(UserProfileButtonContainerComponent),
         MockComponent(UnavailablePageComponent),
+        MockComponent(NavbarComponent),
+        MockComponent(NavItemComponent),
         HasLinkPipe,
         MockDirective(RouterOutlet),
       ],
@@ -149,20 +159,24 @@ describe('AppComponent', () => {
 
   describe('navigation', () => {
     beforeEach(() => {});
-    it('should exist if configuration link exists', () => {
+    it('should show links if configuration link exists', () => {
       component.apiRootStateResource$ = of(
         createStateResource(createApiRootResource([ApiRootLinkRel.CONFIGURATION])),
       );
-
       fixture.detectChanges();
 
-      existsAsHtmlElement(fixture, navigationSelector);
+      const navbarElement: HTMLElement = getElementFromFixture(fixture, navigationSelector);
+
+      expect(navbarElement.children.length).toBeGreaterThan(0);
     });
 
-    it('should not exist if configuration resource not available', () => {
+    it('should not not show links if configuration resource not available', () => {
+      component.apiRootStateResource$ = of(createStateResource(createApiRootResource([])));
       fixture.detectChanges();
 
-      notExistsAsHtmlElement(fixture, navigationSelector);
+      const navbarElement: HTMLElement = getElementFromFixture(fixture, navigationSelector);
+
+      expect(navbarElement.children.length).toBe(0);
     });
   });
 
diff --git a/alfa-client/apps/admin/src/app/app.module.ts b/alfa-client/apps/admin/src/app/app.module.ts
index 425e65dea5..0c4fd5127e 100644
--- a/alfa-client/apps/admin/src/app/app.module.ts
+++ b/alfa-client/apps/admin/src/app/app.module.ts
@@ -16,6 +16,10 @@ import { StoreDevtoolsModule } from '@ngrx/store-devtools';
 import {
   AdminLogoIconComponent,
   LogoutIconComponent,
+  MailboxIconComponent,
+  NavItemComponent,
+  NavbarComponent,
+  OrgaUnitIconComponent,
   PopupComponent,
   PopupListItemComponent,
 } from '@ods/system';
@@ -42,7 +46,11 @@ import { appRoutes } from './app.routes';
     AdminLogoIconComponent,
     PopupComponent,
     PopupListItemComponent,
+    NavItemComponent,
+    NavbarComponent,
+    OrgaUnitIconComponent,
     LogoutIconComponent,
+    MailboxIconComponent,
     RouterModule.forRoot(appRoutes),
     BrowserModule,
     BrowserAnimationsModule,
diff --git a/alfa-client/libs/design-system/src/index.ts b/alfa-client/libs/design-system/src/index.ts
index 96f436e7bc..8adc00f2d8 100644
--- a/alfa-client/libs/design-system/src/index.ts
+++ b/alfa-client/libs/design-system/src/index.ts
@@ -20,7 +20,9 @@ export * from './lib/icons/exclamation-icon/exclamation-icon.component';
 export * from './lib/icons/file-icon/file-icon.component';
 export * from './lib/icons/iconVariants';
 export * from './lib/icons/logout-icon/logout-icon.component';
+export * from './lib/icons/mailbox-icon/mailbox-icon.component';
 export * from './lib/icons/office-icon/office-icon.component';
+export * from './lib/icons/orga-unit-icon/orga-unit-icon.component';
 export * from './lib/icons/save-icon/save-icon.component';
 export * from './lib/icons/search-icon/search-icon.component';
 export * from './lib/icons/send-icon/send-icon.component';
diff --git a/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.spec.ts b/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.spec.ts
index 40e017cc07..d28fcaa589 100644
--- a/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.spec.ts
+++ b/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.spec.ts
@@ -1,13 +1,26 @@
+import { getElementFromFixture, Mock, mock } from '@alfa-client/test-utils';
+import { importProvidersFrom } from '@angular/core';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { Router, RouterModule } from '@angular/router';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { NavItemComponent } from './nav-item.component';
 
 describe('NavItemComponent', () => {
   let component: NavItemComponent;
   let fixture: ComponentFixture<NavItemComponent>;
 
+  const router: Mock<Router> = mock(Router);
+
   beforeEach(async () => {
     await TestBed.configureTestingModule({
       imports: [NavItemComponent],
+      providers: [
+        {
+          provide: Router,
+          useValue: router,
+        },
+        importProvidersFrom(RouterModule.forRoot([])),
+      ],
     }).compileComponents();
 
     fixture = TestBed.createComponent(NavItemComponent);
@@ -18,4 +31,15 @@ describe('NavItemComponent', () => {
   it('should create', () => {
     expect(component).toBeTruthy();
   });
+
+  describe('routerLink', () => {
+    it('should set href', () => {
+      component.to = '/';
+      fixture.detectChanges();
+
+      const linkElement = getElementFromFixture(fixture, getDataTestIdOf('link-to-/'));
+
+      expect(linkElement).toHaveProperty('href');
+    });
+  });
 });
diff --git a/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.ts b/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.ts
index d0500aeedb..f78a872978 100644
--- a/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.ts
+++ b/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.ts
@@ -1,11 +1,11 @@
 import { CommonModule } from '@angular/common';
 import { Component, Input } from '@angular/core';
-import { RouterModule } from '@angular/router';
+import { RouterLink, RouterLinkActive } from '@angular/router';
 
 @Component({
   selector: 'ods-nav-item',
   standalone: true,
-  imports: [CommonModule, RouterModule],
+  imports: [CommonModule, RouterLink, RouterLinkActive],
   template: `<a
     [routerLink]="to"
     routerLinkActive="bg-selected-light border-selected"
@@ -15,6 +15,7 @@ import { RouterModule } from '@angular/router';
       'outline-2 outline-offset-4 outline-focus focus-visible:border-background-200',
     ]"
     role="menuitem"
+    [attr.data-test-id]="'link-to-' + to"
   >
     <ng-content select="[icon]" />
     <p class="text-left text-sm text-text">{{ caption }}</p>
diff --git a/alfa-client/libs/design-system/src/lib/navbar/navbar/navbar.stories.ts b/alfa-client/libs/design-system/src/lib/navbar/navbar/navbar.stories.ts
index 75c8278d68..fa5b213b2e 100644
--- a/alfa-client/libs/design-system/src/lib/navbar/navbar/navbar.stories.ts
+++ b/alfa-client/libs/design-system/src/lib/navbar/navbar/navbar.stories.ts
@@ -36,6 +36,7 @@ export const Default: Story = {
     template: `<ods-navbar>
       <ods-nav-item caption="First link" to="/"><ods-office-icon icon /></ods-nav-item>
       <ods-nav-item caption="Second link" to="/second"><ods-office-icon icon /></ods-nav-item>
+      <hr />
       <ods-nav-item caption="Third link" to="/third"><ods-office-icon icon /></ods-nav-item>
     </ods-navbar>`,
   }),
-- 
GitLab