From b8499321bb675ec86e560630159fcb54c3f6dcab Mon Sep 17 00:00:00 2001
From: Alexander Reifschneider <alexander.reifschneider@mgm-tp.com>
Date: Mon, 3 Mar 2025 10:46:37 +0100
Subject: [PATCH] OZG-5977 hide file container on empty content

---
 .../binary-file-list-container.component.html | 11 +++----
 ...nary-file-list-container.component.spec.ts | 31 +++++++++++++++----
 .../binary-file-list-container.component.ts   | 27 +++++++++++-----
 .../binary-file-list.component.html           |  7 +----
 .../binary-file-list.component.spec.ts        | 11 +++----
 .../binary-file-list.component.ts             |  7 ++---
 6 files changed, 56 insertions(+), 38 deletions(-)

diff --git a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.html b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.html
index cfa93fbc6b..a5d3d8ee19 100644
--- a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.html
+++ b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.html
@@ -23,9 +23,8 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<ods-attachment-wrapper>
-  <alfa-binary-file-list
-    [binaryFileListStateResource]="binaryFileListStateResource$ | async"
-    [listOrientation]="listOrientation"
-  ></alfa-binary-file-list>
-</ods-attachment-wrapper>
+@if (binaryFileList) {
+  <ods-attachment-wrapper>
+    <alfa-binary-file-list [binaryFileList]="binaryFileList" [listOrientation]="listOrientation" />
+  </ods-attachment-wrapper>
+}
diff --git a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.spec.ts b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.spec.ts
index e9473e9ee4..885d5d27a6 100644
--- a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.spec.ts
+++ b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.spec.ts
@@ -42,9 +42,11 @@ describe('BinaryFileListContainerComponent', () => {
 
   const binaryFileService: Mock<BinaryFileService> = mock(BinaryFileService);
 
-  const binaryFileStateResource: StateResource<BinaryFileResource> = createStateResource(
-    createBinaryFileResource(),
-  );
+  const fileList: Resource[] = [];
+  const binaryFileStateResource: StateResource<BinaryFileResource> = createStateResource({
+    ...createBinaryFileResource(),
+    _embedded: { ozgFileList: fileList },
+  });
   const resource: Resource = createDummyResource();
   const linkRel: LinkRelationName = DummyLinkRel.DUMMY;
 
@@ -81,14 +83,31 @@ describe('BinaryFileListContainerComponent', () => {
 
       expect(binaryFileService.getFiles).toHaveBeenCalledWith(resource, linkRel);
     });
+
+    it('should NOT set binaryFileList', () => {
+      component.binaryFileList = null;
+      binaryFileService.getFiles.mockReturnValue(of(createStateResource(null)));
+
+      component.ngOnInit();
+
+      expect(component.binaryFileList).toBe(null);
+    });
+
+    it('should set binaryFileList', () => {
+      component.ngOnInit();
+
+      expect(component.binaryFileList).toBe(fileList);
+    });
   });
 
   describe('binary file list', () => {
     it('should be called with binary file state resource', () => {
-      const binaryFileListComponent: BinaryFileListComponent =
-        getMockComponent<BinaryFileListComponent>(fixture, BinaryFileListComponent);
+      const binaryFileListComponent: BinaryFileListComponent = getMockComponent<BinaryFileListComponent>(
+        fixture,
+        BinaryFileListComponent,
+      );
 
-      expect(binaryFileListComponent.binaryFileListStateResource).toBe(binaryFileStateResource);
+      expect(binaryFileListComponent.binaryFileList).toBe(fileList);
     });
   });
 });
diff --git a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.ts b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.ts
index b4dce3b40b..c5cc042d55 100644
--- a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.ts
+++ b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list-container.component.ts
@@ -21,27 +21,38 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { BinaryFileListResource, BinaryFileService } from '@alfa-client/binary-file-shared';
-import { LinkRelationName, StateResource } from '@alfa-client/tech-shared';
-import { Component, Input, OnInit } from '@angular/core';
-import { Resource } from '@ngxp/rest';
-import { Observable } from 'rxjs';
+import { BinaryFile, BinaryFileListLinkRel, BinaryFileListResource, BinaryFileService } from '@alfa-client/binary-file-shared';
+import { isNotNull, LinkRelationName, StateResource } from '@alfa-client/tech-shared';
+import { Component, Input, OnDestroy, OnInit } from '@angular/core';
+import { getEmbeddedResource, Resource } from '@ngxp/rest';
+import { filter, Subscription } from 'rxjs';
 import { BinaryFileListOrientation } from '../directive/binary-file-list-orientation/binary-file-list-orientation.directive';
 
 @Component({
   selector: 'alfa-binary-file-list-container',
   templateUrl: './binary-file-list-container.component.html',
 })
-export class BinaryFileListContainerComponent implements OnInit {
+export class BinaryFileListContainerComponent implements OnInit, OnDestroy {
   @Input() resource: Resource;
   @Input() linkRel: LinkRelationName;
   @Input() listOrientation: BinaryFileListOrientation = BinaryFileListOrientation.HORIZONTAL;
 
-  public binaryFileListStateResource$: Observable<StateResource<BinaryFileListResource>>;
+  public binaryFileList: BinaryFile[];
+  public readonly binaryFileListLinkRel = BinaryFileListLinkRel;
+  binaryFileListSubscription: Subscription;
 
   constructor(private service: BinaryFileService) {}
 
   ngOnInit(): void {
-    this.binaryFileListStateResource$ = this.service.getFiles(this.resource, this.linkRel);
+    this.binaryFileListSubscription = this.service
+      .getFiles(this.resource, this.linkRel)
+      .pipe(filter((stateResource) => isNotNull(stateResource.resource)))
+      .subscribe((stateResource: StateResource<BinaryFileListResource>) => {
+        this.binaryFileList = getEmbeddedResource(stateResource.resource, this.binaryFileListLinkRel.FILE_LIST);
+      });
+  }
+
+  ngOnDestroy() {
+    this.binaryFileListSubscription.unsubscribe();
   }
 }
diff --git a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.html b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.html
index 70054de869..33eab42685 100644
--- a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.html
+++ b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.html
@@ -24,10 +24,5 @@
 
 -->
 <div [binaryFileListOrientation]="listOrientation">
-  <alfa-binary-file2-container
-    *ngFor="let binaryFile of binaryFileListStateResource.resource | toEmbeddedResources: binaryFileListLinkRel.FILE_LIST"
-    [file]="binaryFile"
-    [deletable]="false"
-  >
-  </alfa-binary-file2-container>
+  <alfa-binary-file2-container *ngFor="let binaryFile of binaryFileList" [file]="binaryFile" [deletable]="false" />
 </div>
diff --git a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.spec.ts b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.spec.ts
index fbbc820600..c3206eec76 100644
--- a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.spec.ts
+++ b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.spec.ts
@@ -21,11 +21,11 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { BinaryFileListResource, BinaryFileResource } from '@alfa-client/binary-file-shared';
-import { createStateResource, StateResource, ToEmbeddedResourcesPipe } from '@alfa-client/tech-shared';
+import { BinaryFileResource } from '@alfa-client/binary-file-shared';
+import { ToEmbeddedResourcesPipe } from '@alfa-client/tech-shared';
 import { getMockComponent } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { createBinaryFileListResource, createBinaryFileResource } from 'libs/binary-file-shared/test/binary-file';
+import { createBinaryFileResource } from 'libs/binary-file-shared/test/binary-file';
 import { MockComponent, MockDirective } from 'ng-mocks';
 import { BinaryFile2ContainerComponent } from '../../binary-file2-container/binary-file2-container.component';
 import { BinaryFileListOrientationDirective } from '../../directive/binary-file-list-orientation/binary-file-list-orientation.directive';
@@ -36,9 +36,6 @@ describe('BinaryFileListComponent', () => {
   let fixture: ComponentFixture<BinaryFileListComponent>;
 
   const binaryFile: BinaryFileResource = createBinaryFileResource();
-  const binaryFileListStateResource: StateResource<BinaryFileListResource> = createStateResource(
-    createBinaryFileListResource([binaryFile]),
-  );
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
@@ -52,7 +49,7 @@ describe('BinaryFileListComponent', () => {
 
     fixture = TestBed.createComponent(BinaryFileListComponent);
     component = fixture.componentInstance;
-    component.binaryFileListStateResource = binaryFileListStateResource;
+    component.binaryFileList = [binaryFile];
     fixture.detectChanges();
   });
 
diff --git a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.ts b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.ts
index f0ddb94034..7d7e50bb09 100644
--- a/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.ts
+++ b/alfa-client/libs/binary-file/src/lib/binary-file-list-container/binary-file-list/binary-file-list.component.ts
@@ -21,8 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { BinaryFileListLinkRel, BinaryFileListResource } from '@alfa-client/binary-file-shared';
-import { StateResource } from '@alfa-client/tech-shared';
+import { BinaryFile } from '@alfa-client/binary-file-shared';
 import { Component, Input } from '@angular/core';
 import { BinaryFileListOrientation } from '../../directive/binary-file-list-orientation/binary-file-list-orientation.directive';
 
@@ -31,8 +30,6 @@ import { BinaryFileListOrientation } from '../../directive/binary-file-list-orie
   templateUrl: './binary-file-list.component.html',
 })
 export class BinaryFileListComponent {
-  @Input() public binaryFileListStateResource: StateResource<BinaryFileListResource>;
+  @Input() public binaryFileList: BinaryFile[];
   @Input() listOrientation: BinaryFileListOrientation = BinaryFileListOrientation.HORIZONTAL;
-
-  public readonly binaryFileListLinkRel = BinaryFileListLinkRel;
 }
-- 
GitLab