From 83cf7dd99aecdff6741efcc0f6271906ed499be8 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Wed, 15 Mar 2023 18:39:18 +0100
Subject: [PATCH] OZG-3574 impl hasAnyLink pipe; fix linkRel renaming; cleanup

---
 .../src/lib/pipe/has-any-link.pipe.spec.ts    | 34 +++++++++++++++++++
 .../src/lib/pipe/has-any-link.pipe.ts         | 10 ++++++
 .../tech-shared/src/lib/tech-shared.module.ts |  3 ++
 .../vorgang-search-container.component.html   |  2 +-
 ...vorgang-search-container.component.spec.ts |  4 +--
 .../src/lib/vorgang-navigation.util.ts        |  4 ---
 .../vorgang-filter-menu.component.html        |  2 +-
 .../vorgang-list-page.component.html          |  2 +-
 .../vorgang-views-menu.component.html         |  9 +++--
 .../vorgang-views-menu.component.spec.ts      | 12 ++++---
 10 files changed, 63 insertions(+), 19 deletions(-)
 create mode 100644 goofy-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.spec.ts
 create mode 100644 goofy-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.ts

diff --git a/goofy-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.spec.ts b/goofy-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.spec.ts
new file mode 100644
index 0000000000..2f4bf0aebf
--- /dev/null
+++ b/goofy-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.spec.ts
@@ -0,0 +1,34 @@
+import { Resource } from "@ngxp/rest";
+import { createDummyResource } from "libs/tech-shared/test/resource";
+import { HasAnyLinkPipe } from "./has-any-link.pipe";
+
+describe('HasAnyLinkPipe', () => {
+
+	const oneLink: string = 'one';
+	const anotherLink: string = 'another';
+	const resource: Resource = createDummyResource([oneLink, anotherLink]);
+	const pipe: HasAnyLinkPipe = new HasAnyLinkPipe();
+
+	it('should return true if resource has at least on link', () => {
+		const result: boolean = pipe.transform(resource, oneLink, 'notExists');
+
+		expect(result).toBe(true);
+	})
+	it('resource return true if resoure has multiple links', () => {
+		const result: boolean = pipe.transform(resource, oneLink, anotherLink);
+
+		expect(result).toBe(true);
+	})
+
+	it('should return false if resource has no of given links', () => {
+		const result: boolean = pipe.transform(resource, 'notExists', 'notExistsToo');
+
+		expect(result).toBe(false);
+	})
+
+	it('should return false if resource is null', () => {
+		const result: boolean = pipe.transform(null, 'notExists', 'notExistsToo');
+
+		expect(result).toBe(false);
+	})
+})
diff --git a/goofy-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.ts b/goofy-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.ts
new file mode 100644
index 0000000000..e528dbb3d9
--- /dev/null
+++ b/goofy-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.ts
@@ -0,0 +1,10 @@
+import { Pipe, PipeTransform } from "@angular/core";
+import { hasLink, Resource } from "@ngxp/rest";
+import { isEmpty } from "lodash-es";
+
+@Pipe({ name: 'hasAnyLink' })
+export class HasAnyLinkPipe implements PipeTransform {
+	transform(resource: Resource, ...links: string[]) {
+		return !isEmpty(links.map(link => hasLink(resource, link)).filter(hasLink => hasLink === true));
+	}
+}
diff --git a/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts b/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts
index 50efc0642f..d7b8ef6ff5 100644
--- a/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts
+++ b/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts
@@ -32,6 +32,7 @@ import { EnumToLabelPipe } from './pipe/enum-to-label.pipe';
 import { FileSizePipe } from './pipe/file-size.pipe';
 import { FormatDateWithTimePipe } from './pipe/format-date-with-time.pipe';
 import { FormatToPrettyDatePipe } from './pipe/format-to-pretty-date.pipe';
+import { HasAnyLinkPipe } from './pipe/has-any-link.pipe';
 import { HasLinkPipe } from './pipe/has-link.pipe';
 import { NotHasLinkPipe } from './pipe/not-has-link.pipe';
 import { ToEmbeddedResourcesPipe } from './pipe/to-embedded-resource.pipe';
@@ -46,6 +47,7 @@ import { ToTrafficLightPipe } from './pipe/to-traffic-light.pipe';
 		EnumToLabelPipe,
 		FormatDateWithTimePipe,
 		HasLinkPipe,
+		HasAnyLinkPipe,
 		NotHasLinkPipe,
 		ToResourceUriPipe,
 		ToTrafficLightPipe,
@@ -59,6 +61,7 @@ import { ToTrafficLightPipe } from './pipe/to-traffic-light.pipe';
 		EnumToLabelPipe,
 		FormatDateWithTimePipe,
 		HasLinkPipe,
+		HasAnyLinkPipe,
 		NotHasLinkPipe,
 		ToResourceUriPipe,
 		ToTrafficLightPipe,
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search-container.component.html b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search-container.component.html
index 85cd37cbab..a85501d95f 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search-container.component.html
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search-container.component.html
@@ -25,7 +25,7 @@
 -->
 <ng-container *ngIf="apiRoot$ | async as apiRootStateResource">
 
-	<goofy-client-vorgang-search *ngIf="(apiRootStateResource.resource | hasLink: apiRootLinkRel.SEARCH) || (apiRootStateResource.resource | hasLink: apiRootLinkRel.SEARCH_MY_VORGAENGE)" data-test-id="vorgang-search"
+	<goofy-client-vorgang-search *ngIf="(apiRootStateResource.resource | hasLink: apiRootLinkRel.SEARCH_ALLE) || (apiRootStateResource.resource | hasLink: apiRootLinkRel.SEARCH_MEINE)" data-test-id="vorgang-search"
 		[vorgangSearchPreviewList]="vorgangSearchPreviewList$ | async" [searchString]="searchString$ | async"
 		(clearVorgangSearchPreviewList)="clearVorgangSearchPreviewList()">
 	</goofy-client-vorgang-search>
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search-container.component.spec.ts b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search-container.component.spec.ts
index 6944d8daef..9a2fc455d4 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search-container.component.spec.ts
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search-container.component.spec.ts
@@ -104,7 +104,7 @@ describe('VorgangSearchContainerComponent', () => {
 			expect(element).not.toBeInstanceOf(HTMLElement);
 		})
 
-		it.each([ApiRootLinkRel.SEARCH, ApiRootLinkRel.SEARCH_MY_VORGAENGE])
+		it.each([ApiRootLinkRel.SEARCH_ALLE, ApiRootLinkRel.SEARCH_MEINE])
 			('should show on link "%s"', (linkRel: string) => {
 				component.apiRoot$ = of(createStateResource(createApiRootResource([linkRel])));
 				fixture.detectChanges();
@@ -118,7 +118,7 @@ describe('VorgangSearchContainerComponent', () => {
 	describe('clear vorgangSearchPreviewList event', () => {
 
 		it('should call service clearSearchPreviewList', () => {
-			component.apiRoot$ = of(createStateResource(createApiRootResource([ApiRootLinkRel.SEARCH])));
+			component.apiRoot$ = of(createStateResource(createApiRootResource([ApiRootLinkRel.SEARCH_ALLE])));
 			fixture.detectChanges();
 
 			dispatchEventFromFixture(fixture, vorgangSearch, 'clearVorgangSearchPreviewList');
diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts
index a60bae1fce..30f08bdae1 100644
--- a/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts
+++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts
@@ -85,10 +85,6 @@ export function getSearchLinkRel(vorgangFilter: VorgangFilter): string {
 	return vorgangFilter === VorgangFilter.MEINE_VORGAENGE ? ApiRootLinkRel.SEARCH_MEINE : ApiRootLinkRel.SEARCH_ALLE;
 }
 
-// export function shouldSearchForPreview(previewList: StateResource<VorgangListResource>, searchString: string): boolean {
-// 	return previewList.reload && !previewList.loading && (searchString != EMPTY_STRING);
-// }
-
 export function getVorgangFilter(routeData: RouteData): VorgangFilter {
 	return isUebersichtsSeite(routeData) ? VORGANG_FILTER_BY_ROUTE_PARAM[getRouteUrlSegment(routeData, 0)] : undefined;
 }
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.html b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.html
index 58b9d70e4a..6709c18a4e 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.html
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.html
@@ -28,7 +28,7 @@
 		<mat-button-toggle data-test-id="meine-vorgaenge-filter-toggle-button" [value]="formService.FILTER_MEINE_VALUE">
 			<goofy-client-vorgang-meine-filter-item-container></goofy-client-vorgang-meine-filter-item-container>
 		</mat-button-toggle>
-		<mat-button-toggle *ngIf="apiRootStateResource.resource | hasLink: apiRootLinkRel.VORGAENGE" data-test-id="alle-filter-toggle-button" [value]="formService.FILTER_ALLE_VALUE">
+		<mat-button-toggle *ngIf="apiRootStateResource.resource | hasLink: apiRootLinkRel.ALLE_VORGAENGE" data-test-id="alle-filter-toggle-button" [value]="formService.FILTER_ALLE_VALUE">
 			<goofy-client-vorgang-alle-filter-item-container></goofy-client-vorgang-alle-filter-item-container>
 		</mat-button-toggle>
 	</mat-button-toggle-group>
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html
index 7f92735968..aa6eda6a92 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html
@@ -28,7 +28,7 @@
 <div class="content">
 	<goofy-client-vorgang-views-menu *ngIf="apiRootStateResource.resource" [apiRootResource]="apiRootStateResource.resource" class="left"></goofy-client-vorgang-views-menu>
 
-	<main *ngIf="apiRootStateResource?.resource | hasLink: apiRootLinkRel.VORGAENGE; else showNoRoleMessage" data-test-id="vorgaenge-list"><router-outlet></router-outlet></main>
+	<main *ngIf="apiRootStateResource?.resource | hasLink: apiRootLinkRel.ALLE_VORGAENGE; else showNoRoleMessage" data-test-id="vorgaenge-list"><router-outlet></router-outlet></main>
 	<ng-template #showNoRoleMessage>
 		<h1 data-test-id="user-no-role-message">Die Allgemeine Fachanwendung ist wegen fehlender Rollen nicht benutzbar.</h1>
 	</ng-template>
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html
index 83f3236292..14ebaf1ff9 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html
@@ -24,8 +24,9 @@
 
 -->
 <div class="views">
-	<goofy-client-vorgang-neu-view-item-container *ngIf="(apiRootResource | hasLink: apiRootLinkRel.ALLE_VORGAENGE_NEU) || (apiRootResource | hasLink: apiRootLinkRel.MEINE_VORGAENGE_NEU)" data-test-id="vorgang-neu-view">
+	<goofy-client-vorgang-neu-view-item-container *ngIf="apiRootResource | hasAnyLink: apiRootLinkRel.ALLE_VORGAENGE_NEU: apiRootLinkRel.MEINE_VORGAENGE_NEU" data-test-id="vorgang-neu-view">
 	</goofy-client-vorgang-neu-view-item-container>
+	<!-- TODO Richtige Links abfragen + Tests -->
 	<goofy-client-vorgang-angenommen-view-item-container *ngIf="(apiRootResource | hasLink: apiRootLinkRel.ALLE_VORGAENGE_ANGENOMMEN) || (apiRootResource | hasLink: apiRootLinkRel.MEINE_VORGAENGE_NEU)" data-test-id="vorgang-angenommen-view">
 	</goofy-client-vorgang-angenommen-view-item-container>
 	<goofy-client-vorgang-in-bearbeitung-view-item-container *ngIf="(apiRootResource | hasLink: apiRootLinkRel.ALLE_VORGAENGE_IN_BEARBEITUNG) || (apiRootResource | hasLink: apiRootLinkRel.MEINE_VORGAENGE_NEU)" data-test-id="vorgang-in-bearbeitung-view">
@@ -36,10 +37,8 @@
 	</goofy-client-vorgang-abgeschlossen-view-item-container>
 	<goofy-client-vorgang-verworfen-view-item-container *ngIf="(apiRootResource | hasLink: apiRootLinkRel.ALLE_VORGAENGE_VERWORFEN) || (apiRootResource | hasLink: apiRootLinkRel.MEINE_VORGAENGE_NEU)" data-test-id="vorgang-verworfen-view">
 	</goofy-client-vorgang-verworfen-view-item-container>
-
-	<goofy-client-vorgang-list-view-item-container *ngIf="apiRootResource | hasLink: apiRootLinkRel.VORGAENGE" data-test-id="vorgang-vorgang-list-view" class="top-border">
+	<goofy-client-vorgang-list-view-item-container *ngIf="apiRootResource | hasLink: apiRootLinkRel.ALLE_VORGAENGE" data-test-id="vorgang-vorgang-list-view" class="top-border">
 	</goofy-client-vorgang-list-view-item-container>
-
-	<goofy-client-vorgang-search-view-item-container *ngIf="(apiRootResource | hasLink: apiRootLinkRel.SEARCH) || (apiRootResource | hasLink: apiRootLinkRel.SEARCH_MY_VORGAENGE)" data-test-id="vorgang-search-view" class="top-border">
+	<goofy-client-vorgang-search-view-item-container *ngIf="(apiRootResource | hasLink: apiRootLinkRel.SEARCH_ALLE) || (apiRootResource | hasLink: apiRootLinkRel.SEARCH_MEINE)" data-test-id="vorgang-search-view" class="top-border">
 	</goofy-client-vorgang-search-view-item-container>
 </div>
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.spec.ts
index 08903d8ea6..dbabc1b5d2 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.spec.ts
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.spec.ts
@@ -26,6 +26,7 @@ import { ApiRootLinkRel } from '@goofy-client/api-root-shared';
 import { HasLinkPipe } from '@goofy-client/tech-shared';
 import { getElementFromFixture } from '@goofy-client/test-utils';
 import { createApiRootResource } from 'libs/api-root-shared/test/api-root';
+import { HasAnyLinkPipe } from 'libs/tech-shared/src/lib/pipe/has-any-link.pipe';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
 import { VorgangAbgeschlossenViewItemContainerComponent } from './vorgang-abgeschlossen-view-item-container/vorgang-abgeschlossen-view-item-container.component';
@@ -51,6 +52,7 @@ describe('VorgangViewsMenuComponent', () => {
 			declarations: [
 				VorgangViewsMenuComponent,
 				HasLinkPipe,
+				HasAnyLinkPipe,
 				MockComponent(VorgangListViewItemContainerComponent),
 				MockComponent(VorgangSearchViewItemContainerComponent),
 				MockComponent(VorgangNeuViewItemContainerComponent),
@@ -73,7 +75,7 @@ describe('VorgangViewsMenuComponent', () => {
 
 	describe('neu view', () => {
 
-		it('should show if ' + ApiRootLinkRel.ALLE_VORGAENGE_NEU + 'link exists', () => {
+		it('should show if ' + ApiRootLinkRel.ALLE_VORGAENGE_NEU + ' link exists', () => {
 			component.apiRootResource = createApiRootResource([ApiRootLinkRel.ALLE_VORGAENGE_NEU]);
 			fixture.detectChanges();
 
@@ -82,7 +84,7 @@ describe('VorgangViewsMenuComponent', () => {
 			expect(element).toBeInstanceOf(HTMLElement);
 		})
 
-		it('should show if ' + ApiRootLinkRel.ALLE_VORGAENGE_NEU + 'link exists', () => {
+		it('should show if ' + ApiRootLinkRel.ALLE_VORGAENGE_NEU + ' link exists', () => {
 			component.apiRootResource = createApiRootResource([ApiRootLinkRel.MEINE_VORGAENGE_NEU]);
 			fixture.detectChanges();
 
@@ -102,7 +104,7 @@ describe('VorgangViewsMenuComponent', () => {
 	})
 
 
-	describe('alle vorgaenge view', () => {
+	describe('vorgangList view', () => {
 
 		it('should show if link exists', () => {
 			component.apiRootResource = createApiRootResource([ApiRootLinkRel.ALLE_VORGAENGE]);
@@ -125,7 +127,7 @@ describe('VorgangViewsMenuComponent', () => {
 
 	describe('search view', () => {
 
-		it('should show if search link exists', () => {
+		it('should show if ' + ApiRootLinkRel.SEARCH_ALLE + ' link exists', () => {
 			component.apiRootResource = createApiRootResource([ApiRootLinkRel.SEARCH_ALLE]);
 			fixture.detectChanges();
 
@@ -134,7 +136,7 @@ describe('VorgangViewsMenuComponent', () => {
 			expect(element).toBeInstanceOf(HTMLElement);
 		})
 
-		it('should show if searchMyVorgaenge link exists', () => {
+		it('should show if ' + ApiRootLinkRel.SEARCH_MEINE + ' link exists', () => {
 			component.apiRootResource = createApiRootResource([ApiRootLinkRel.SEARCH_MEINE]);
 			fixture.detectChanges();
 
-- 
GitLab