From ac608309006692fe758287ab1cea693215dcc85f Mon Sep 17 00:00:00 2001
From: Albert <Albert.Bruns@mgm-tp.com>
Date: Mon, 24 Feb 2025 17:11:15 +0100
Subject: [PATCH 01/18] OZG-7507 orgnaisationseinheit loeschen dialog

---
 ...tions-einheit-delete-button.component.html |  6 ++
 ...ns-einheit-delete-button.component.spec.ts | 58 +++++++++++++++++
 ...sations-einheit-delete-button.component.ts | 20 ++++++
 ...eit-delete-dialog-container.component.html |  6 ++
 ...-delete-dialog-container.component.spec.ts | 41 ++++++++++++
 ...nheit-delete-dialog-container.component.ts | 26 ++++++++
 ...tions-einheit-delete-dialog.component.html | 21 ++++++
 ...ns-einheit-delete-dialog.component.spec.ts | 65 +++++++++++++++++++
 ...sations-einheit-delete-dialog.component.ts | 16 +++++
 .../organisations-einheit-list.component.html | 11 ++--
 ...ganisations-einheit-list.component.spec.ts | 18 ++++-
 .../organisations-einheit-list.component.ts   | 15 ++---
 12 files changed, 287 insertions(+), 16 deletions(-)
 create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html
 create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
 create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
 create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html
 create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
 create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
 create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
 create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
 create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html
new file mode 100644
index 0000000000..e180bccebc
--- /dev/null
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html
@@ -0,0 +1,6 @@
+<ods-button-with-spinner
+  (clickEmitter)="openDeleteDialog()"
+  variant="outline"
+  text="Löschen"
+  dataTestId="delete-button"
+/>
\ No newline at end of file
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
new file mode 100644
index 0000000000..01db4119e3
--- /dev/null
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
@@ -0,0 +1,58 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { dispatchEventFromFixture, existsAsHtmlElement, mock, Mock } from '@alfa-client/test-utils';
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { getDataTestIdAttributeOf } from '../../../../../../../tech-shared/test/data-test';
+import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button.component';
+
+describe('OrganisationsEinheitDeleteButtonComponent', () => {
+  let component: OrganisationsEinheitDeleteButtonComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitDeleteButtonComponent>;
+
+  const deleteButton: string = getDataTestIdAttributeOf('delete-button');
+
+  let dialogService: Mock<OzgcloudDialogService>;
+
+  beforeEach(() => {
+    dialogService = mock(OzgcloudDialogService);
+
+    TestBed.configureTestingModule({
+      imports: [OrganisationsEinheitDeleteButtonComponent],
+      providers: [{ provide: OzgcloudDialogService, useValue: dialogService }],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(OrganisationsEinheitDeleteButtonComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('component', () => {
+    describe('delete', () => {
+      it('should open dialog', () => {
+        component.openDeleteDialog();
+
+        expect(dialogService.open).toHaveBeenCalledWith(OrganisationsEinheitDeleteButtonComponent);
+      });
+    });
+  });
+
+  describe('template', () => {
+    describe('button with spinner', () => {
+      it('should exist', () => {
+        existsAsHtmlElement(fixture, deleteButton);
+      });
+
+      it('should open delete dialog on click', () => {
+        component.openDeleteDialog = jest.fn();
+
+        dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter');
+
+        expect(component.openDeleteDialog).toHaveBeenCalled();
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
new file mode 100644
index 0000000000..baef9b1438
--- /dev/null
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
@@ -0,0 +1,20 @@
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { Component, inject, Input } from '@angular/core';
+import { ButtonWithSpinnerComponent } from '@ods/component';
+import { OrganisationsEinheitDeleteDialogContainerComponent } from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component';
+
+@Component({
+  selector: 'admin-organisations-einheit-delete-button',
+  standalone: true,
+  imports: [ButtonWithSpinnerComponent],
+  templateUrl: './organisations-einheit-delete-button.component.html',
+})
+export class OrganisationsEinheitDeleteButtonComponent {
+  private readonly dialogService = inject(OzgcloudDialogService);
+
+  @Input() organisationsEinheitName: string;
+
+  public openDeleteDialog(): void {
+    this.dialogService.open(OrganisationsEinheitDeleteDialogContainerComponent);
+  }
+}
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html
new file mode 100644
index 0000000000..b7ab8d03d3
--- /dev/null
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html
@@ -0,0 +1,6 @@
+<admin-organisations-einheit-delete-dialog
+  [organisationsEinheitName]="organisationsEinheitName"
+  [deleteOrganisationsEinheitStateResource]="deleteUserStateResource$ | async"
+  (cancel)="closeDeleteDialog()"
+  (delete)="deleteOrganisationsEinheit()"
+/>
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
new file mode 100644
index 0000000000..3a79c41864
--- /dev/null
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
@@ -0,0 +1,41 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Mock, mock } from '@alfa-client/test-utils';
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { OrganisationsEinheitDeleteDialogContainerComponent } from './organisations-einheit-delete-dialog-container.component';
+
+describe('OrganisationsEinheitDeleteDialogContainerComponent', () => {
+  let component: OrganisationsEinheitDeleteDialogContainerComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitDeleteDialogContainerComponent>;
+
+  let dialogService: Mock<OzgcloudDialogService>;
+
+  beforeEach(async () => {
+    dialogService = mock(OzgcloudDialogService);
+
+    await TestBed.configureTestingModule({
+      imports: [OrganisationsEinheitDeleteDialogContainerComponent],
+      providers: [{ provide: OzgcloudDialogService, useValue: dialogService }],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(OrganisationsEinheitDeleteDialogContainerComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('component', () => {
+    describe('closeDeleteDialog', () => {
+      it('should call dialogService closeAll', () => {
+        dialogService.closeAll = jest.fn();
+
+        component.closeDeleteDialog();
+
+        expect(dialogService.closeAll).toHaveBeenCalled();
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
new file mode 100644
index 0000000000..80f6d6d8de
--- /dev/null
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
@@ -0,0 +1,26 @@
+import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { AsyncPipe } from '@angular/common';
+import { Component, inject, Input } from '@angular/core';
+import { Observable, of } from 'rxjs';
+import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component';
+
+@Component({
+  selector: 'admin-organisations-einheit-delete-dialog-container',
+  standalone: true,
+  imports: [AsyncPipe, OrganisationsEinheitDeleteDialogComponent],
+  templateUrl: './organisations-einheit-delete-dialog-container.component.html',
+})
+export class OrganisationsEinheitDeleteDialogContainerComponent {
+  private readonly dialogService = inject(OzgcloudDialogService);
+
+  @Input() organisationsEinheitName: string;
+
+  public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource());
+
+  public closeDeleteDialog(): void {
+    this.dialogService.closeAll();
+  }
+
+  public deleteOrganisationsEinheit(): void {}
+}
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
new file mode 100644
index 0000000000..cdc6e2f2c8
--- /dev/null
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
@@ -0,0 +1,21 @@
+<h1>Organisationseinheit</h1>
+
+<p>Sind Sie sicher, dass sie {{organisationsEinheitName}} löschen möchten?</p>
+
+<p>Achtung: Durch das Entfernen der Organisationseinheit aus dieser Liste wird die Organisationseinheit auch für alle Benutzer entfernt. Benutzer sind dieser Organisationseinheit dann nicht mehr zugewiesen.</p>
+
+<div class="flex justify-between">
+  <ods-button-with-spinner
+    (clickEmitter)="cancel.emit()"
+    text="Abbrechen"
+    dataTestId="dialog-cancel-button"
+  />
+
+  <ods-button-with-spinner
+    [stateResource]="deleteOrganisationsEinheitStateResource"
+    (clickEmitter)="delete.emit()"
+    variant="outline"
+    text="Löschen"
+    dataTestId="dialog-delete-button"
+  />
+</div>
\ No newline at end of file
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
new file mode 100644
index 0000000000..755251ab19
--- /dev/null
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
@@ -0,0 +1,65 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
+import { dispatchEventFromFixture, existsAsHtmlElement, getDebugElementFromFixtureByCss } from '@alfa-client/test-utils';
+import { ButtonWithSpinnerComponent } from '@ods/component';
+import { getDataTestIdAttributeOf } from '../../../../../../../../tech-shared/test/data-test';
+import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog.component';
+
+describe('OrganisationsEinheitDeleteDialogComponent', () => {
+  let component: OrganisationsEinheitDeleteDialogComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitDeleteDialogComponent>;
+
+  const deleteButton: string = getDataTestIdAttributeOf('dialog-delete-button');
+  const cancelButton: string = getDataTestIdAttributeOf('dialog-cancel-button');
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [OrganisationsEinheitDeleteDialogComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(OrganisationsEinheitDeleteDialogComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('template', () => {
+    describe('cancel button', () => {
+      it('should exist', () => {
+        existsAsHtmlElement(fixture, cancelButton);
+      });
+
+      it('should emit cancel on click', () => {
+        component.cancel.emit = jest.fn();
+
+        dispatchEventFromFixture(fixture, cancelButton, 'clickEmitter');
+
+        expect(component.cancel.emit).toHaveBeenCalled();
+      });
+    });
+
+    describe('delete button', () => {
+      it('should exist', () => {
+        const stateResource: StateResource<unknown> = createEmptyStateResource();
+        component.deleteOrganisationsEinheitStateResource = stateResource;
+
+        fixture.detectChanges();
+
+        const button: ButtonWithSpinnerComponent = getDebugElementFromFixtureByCss(fixture, deleteButton).componentInstance;
+        expect(button._stateResource).toBe(stateResource);
+      });
+
+      it('should emit delete on click', () => {
+        component.delete.emit = jest.fn();
+
+        dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter');
+
+        expect(component.delete.emit).toHaveBeenCalled();
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
new file mode 100644
index 0000000000..5b946e192c
--- /dev/null
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
@@ -0,0 +1,16 @@
+import { StateResource } from '@alfa-client/tech-shared';
+import { Component, EventEmitter, Input, Output } from '@angular/core';
+import { ButtonWithSpinnerComponent } from '@ods/component';
+
+@Component({
+  selector: 'admin-organisations-einheit-delete-dialog',
+  standalone: true,
+  templateUrl: './organisations-einheit-delete-dialog.component.html',
+  imports: [ButtonWithSpinnerComponent],
+})
+export class OrganisationsEinheitDeleteDialogComponent {
+  @Input() organisationsEinheitName: string;
+  @Input() deleteOrganisationsEinheitStateResource: StateResource<unknown>;
+  @Output() cancel: EventEmitter<void> = new EventEmitter<void>();
+  @Output() delete: EventEmitter<void> = new EventEmitter<void>();
+}
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
index fc5ff5f376..5256146d2d 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
@@ -26,10 +26,13 @@
 <ods-list data-test-id="organisations-einheit-list">
   @for (organisationsEinheit of organisationsEinheitList; track $index) {
     <ods-list-item [attr.data-test-id]="(organisationsEinheit.name | convertForDataTest) + '-organisation-item'">
-      <dl class="flex-1 basis-3/4 font-semibold">
-        <dt class="sr-only">Name</dt>
-        <dd data-test-id="organisations-einheit-name">{{ organisationsEinheit.name }}</dd>
-      </dl>
+      <div class="space-between flex w-full">
+        <dl class="flex-1 basis-3/4 font-semibold">
+          <dt class="sr-only">Name</dt>
+          <dd data-test-id="organisations-einheit-name">{{ organisationsEinheit.name }}</dd>
+        </dl>
+        <admin-organisations-einheit-delete-button [organisationsEinheitName]="organisationsEinheit.name"/>
+      </div>
     </ods-list-item>
   }
 </ods-list>
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
index dd2fba6125..cedf580df1 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
@@ -23,7 +23,7 @@
  */
 import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared';
 import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
-import { existsAsHtmlElement, getElementFromFixture, mock } from '@alfa-client/test-utils';
+import { existsAsHtmlElement, getElementFromFixture, getMockComponent, mock } from '@alfa-client/test-utils';
 import { CommonModule } from '@angular/common';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ActivatedRoute } from '@angular/router';
@@ -31,6 +31,7 @@ import { ExclamationIconComponent, ListComponent, ListItemComponent } from '@ods
 import { getConvertedDataTestIdOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
 import { createAdminOrganisationsEinheit } from '../../../../../organisations-einheit-shared/src/test/organisations-einheit';
+import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button/organisations-einheit-delete-button.component';
 import { OrganisationsEinheitListComponent } from './organisations-einheit-list.component';
 
 describe('OrganisationsEinheitListComponent', () => {
@@ -54,6 +55,7 @@ describe('OrganisationsEinheitListComponent', () => {
         MockComponent(ListComponent),
         MockComponent(ListItemComponent),
         MockComponent(ExclamationIconComponent),
+        MockComponent(OrganisationsEinheitDeleteButtonComponent),
       ],
     }).compileComponents();
 
@@ -93,4 +95,18 @@ describe('OrganisationsEinheitListComponent', () => {
       });
     });
   });
+
+  describe('organisationsEinheit delete button', () => {
+    it('should exist', () => {
+      component.organisationsEinheitList = [createAdminOrganisationsEinheit()];
+
+      fixture.detectChanges();
+
+      const button: OrganisationsEinheitDeleteButtonComponent = getMockComponent(
+        fixture,
+        OrganisationsEinheitDeleteButtonComponent,
+      );
+      expect(button.organisationsEinheitName).toBe(component.organisationsEinheitList[0].name);
+    });
+  });
 });
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts
index 7efc0bbbe6..f268484b86 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts
@@ -22,24 +22,17 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared';
-import { ConvertForDataTestPipe, ToResourceUriPipe } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, Input } from '@angular/core';
-import { ExclamationIconComponent, ListComponent, ListItemComponent, TooltipDirective } from '@ods/system';
+import { ListComponent, ListItemComponent } from '@ods/system';
+import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button/organisations-einheit-delete-button.component';
 
 @Component({
   selector: 'admin-organisations-einheit-list',
   templateUrl: './organisations-einheit-list.component.html',
   standalone: true,
-  imports: [
-    CommonModule,
-    ListComponent,
-    ListItemComponent,
-    ExclamationIconComponent,
-    TooltipDirective,
-    ToResourceUriPipe,
-    ConvertForDataTestPipe,
-  ],
+  imports: [CommonModule, ListComponent, ListItemComponent, ConvertForDataTestPipe, OrganisationsEinheitDeleteButtonComponent],
 })
 export class OrganisationsEinheitListComponent {
   @Input() public organisationsEinheitList: AdminOrganisationsEinheit[] = [];
-- 
GitLab


From 10a4dcd9a5e0afe85ebfedfd0258b5fcb479a1b8 Mon Sep 17 00:00:00 2001
From: Albert <Albert.Bruns@mgm-tp.com>
Date: Tue, 25 Feb 2025 08:43:58 +0100
Subject: [PATCH 02/18] OZG-7507-7751 dialog finalize

---
 ...ons-einheit-delete-button.component.spec.ts |  8 +++++++-
 ...isations-einheit-delete-button.component.ts | 10 ++++++++--
 ...t-delete-dialog-container.component.spec.ts | 18 +++++++++++++++++-
 ...inheit-delete-dialog-container.component.ts | 14 ++++++++++++--
 ...ations-einheit-delete-dialog.component.html |  2 +-
 5 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
index 01db4119e3..c4159af1ed 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
@@ -2,7 +2,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 
 import { dispatchEventFromFixture, existsAsHtmlElement, mock, Mock } from '@alfa-client/test-utils';
 import { OzgcloudDialogService } from '@alfa-client/ui';
+import { faker } from '@faker-js/faker';
 import { getDataTestIdAttributeOf } from '../../../../../../../tech-shared/test/data-test';
+import { OrganisationsEinheitDeleteDialogContainerComponent } from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component';
 import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button.component';
 
 describe('OrganisationsEinheitDeleteButtonComponent', () => {
@@ -33,9 +35,13 @@ describe('OrganisationsEinheitDeleteButtonComponent', () => {
   describe('component', () => {
     describe('delete', () => {
       it('should open dialog', () => {
+        component.organisationsEinheitName = faker.word.sample();
+
         component.openDeleteDialog();
 
-        expect(dialogService.open).toHaveBeenCalledWith(OrganisationsEinheitDeleteButtonComponent);
+        expect(dialogService.open).toHaveBeenCalledWith(OrganisationsEinheitDeleteDialogContainerComponent, {
+          organisationsEinheitName: component.organisationsEinheitName,
+        });
       });
     });
   });
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
index baef9b1438..50a217af68 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
@@ -1,7 +1,10 @@
 import { OzgcloudDialogService } from '@alfa-client/ui';
 import { Component, inject, Input } from '@angular/core';
 import { ButtonWithSpinnerComponent } from '@ods/component';
-import { OrganisationsEinheitDeleteDialogContainerComponent } from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component';
+import {
+  OrganisationsEinheitDeleteDialogContainerComponent,
+  OrganisationsEinheitDeleteDialogData,
+} from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component';
 
 @Component({
   selector: 'admin-organisations-einheit-delete-button',
@@ -15,6 +18,9 @@ export class OrganisationsEinheitDeleteButtonComponent {
   @Input() organisationsEinheitName: string;
 
   public openDeleteDialog(): void {
-    this.dialogService.open(OrganisationsEinheitDeleteDialogContainerComponent);
+    const dialogData: OrganisationsEinheitDeleteDialogData = {
+      organisationsEinheitName: this.organisationsEinheitName,
+    };
+    this.dialogService.open(OrganisationsEinheitDeleteDialogContainerComponent, dialogData);
   }
 }
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
index 3a79c41864..90765a429c 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
@@ -2,6 +2,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 
 import { Mock, mock } from '@alfa-client/test-utils';
 import { OzgcloudDialogService } from '@alfa-client/ui';
+import { DIALOG_DATA } from '@angular/cdk/dialog';
+import { faker } from '@faker-js/faker';
 import { OrganisationsEinheitDeleteDialogContainerComponent } from './organisations-einheit-delete-dialog-container.component';
 
 describe('OrganisationsEinheitDeleteDialogContainerComponent', () => {
@@ -10,12 +12,20 @@ describe('OrganisationsEinheitDeleteDialogContainerComponent', () => {
 
   let dialogService: Mock<OzgcloudDialogService>;
 
+  const dialogData = { organisationsEinheitName: faker.word.sample() };
+
   beforeEach(async () => {
     dialogService = mock(OzgcloudDialogService);
 
     await TestBed.configureTestingModule({
       imports: [OrganisationsEinheitDeleteDialogContainerComponent],
-      providers: [{ provide: OzgcloudDialogService, useValue: dialogService }],
+      providers: [
+        { provide: OzgcloudDialogService, useValue: dialogService },
+        {
+          provide: DIALOG_DATA,
+          useValue: dialogData,
+        },
+      ],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OrganisationsEinheitDeleteDialogContainerComponent);
@@ -28,6 +38,12 @@ describe('OrganisationsEinheitDeleteDialogContainerComponent', () => {
   });
 
   describe('component', () => {
+    describe('constructor', () => {
+      it('should set organisationsEinheitName', () => {
+        expect(component.organisationsEinheitName).toBe(dialogData.organisationsEinheitName);
+      });
+    });
+
     describe('closeDeleteDialog', () => {
       it('should call dialogService closeAll', () => {
         dialogService.closeAll = jest.fn();
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
index 80f6d6d8de..78a5658277 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
@@ -1,10 +1,15 @@
 import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
 import { OzgcloudDialogService } from '@alfa-client/ui';
+import { DIALOG_DATA } from '@angular/cdk/dialog';
 import { AsyncPipe } from '@angular/common';
-import { Component, inject, Input } from '@angular/core';
+import { Component, inject } from '@angular/core';
 import { Observable, of } from 'rxjs';
 import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component';
 
+export interface OrganisationsEinheitDeleteDialogData {
+  organisationsEinheitName: string;
+}
+
 @Component({
   selector: 'admin-organisations-einheit-delete-dialog-container',
   standalone: true,
@@ -13,8 +18,13 @@ import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einhe
 })
 export class OrganisationsEinheitDeleteDialogContainerComponent {
   private readonly dialogService = inject(OzgcloudDialogService);
+  private readonly dialogData: OrganisationsEinheitDeleteDialogData = inject(DIALOG_DATA);
 
-  @Input() organisationsEinheitName: string;
+  public organisationsEinheitName: string;
+
+  constructor() {
+    this.organisationsEinheitName = this.dialogData.organisationsEinheitName;
+  }
 
   public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource());
 
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
index cdc6e2f2c8..c4ea371bf7 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
@@ -1,6 +1,6 @@
 <h1>Organisationseinheit</h1>
 
-<p>Sind Sie sicher, dass sie {{organisationsEinheitName}} löschen möchten?</p>
+<h2>{{organisationsEinheitName}} </h2>
 
 <p>Achtung: Durch das Entfernen der Organisationseinheit aus dieser Liste wird die Organisationseinheit auch für alle Benutzer entfernt. Benutzer sind dieser Organisationseinheit dann nicht mehr zugewiesen.</p>
 
-- 
GitLab


From f015884ca6221ab0b72717ca14e511f04d2bdece Mon Sep 17 00:00:00 2001
From: Albert <Albert.Bruns@mgm-tp.com>
Date: Tue, 25 Feb 2025 14:53:06 +0100
Subject: [PATCH 03/18] OZG-7507-7752 organisationsEinheit loeschen service

---
 .../organisations-einheit.repository.spec.ts  |  24 +++++
 .../lib/organisations-einheit.repository.ts   |   4 +
 .../lib/organisations-einheit.service.spec.ts |  23 ++++
 .../src/lib/organisations-einheit.service.ts  |   2 +-
 ...ns-einheit-delete-button.component.spec.ts |   2 +
 ...sations-einheit-delete-button.component.ts |   2 +
 ...eit-delete-dialog-container.component.html |   7 +-
 ...-delete-dialog-container.component.spec.ts | 100 ++++++++++++++++--
 ...nheit-delete-dialog-container.component.ts |  25 ++++-
 ...tions-einheit-delete-dialog.component.html |   2 +-
 ...ns-einheit-delete-dialog.component.spec.ts |   2 +-
 ...sations-einheit-delete-dialog.component.ts |   2 +-
 .../organisations-einheit-list.component.html |   2 +-
 ...ganisations-einheit-list.component.spec.ts |   1 +
 14 files changed, 179 insertions(+), 19 deletions(-)

diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.spec.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.spec.ts
index 43bc3d3856..e86fbad2ab 100644
--- a/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.spec.ts
+++ b/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.spec.ts
@@ -1,6 +1,7 @@
 import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared';
 import { mock, Mock } from '@alfa-client/test-utils';
 import { TestBed } from '@angular/core/testing';
+import { faker } from '@faker-js/faker';
 import KcAdminClient from '@keycloak/keycloak-admin-client';
 import GroupRepresentation from '@keycloak/keycloak-admin-client/lib/defs/groupRepresentation';
 import { createGroupRep } from '../../../organisations-einheit-shared/src/test/organisations-einheit';
@@ -85,4 +86,27 @@ describe('AdminOrganisationsEinheitRepository', () => {
       });
     });
   });
+
+  describe('delete', () => {
+    const organisationsEinheitId: string = faker.string.uuid();
+
+    beforeEach(() => {
+      kcAdminClient.groups = <any>{
+        del: jest.fn().mockReturnValue(Promise.resolve()),
+      };
+    });
+
+    it('should call kcAdminClient groups del', () => {
+      repository.delete(organisationsEinheitId);
+
+      expect(kcAdminClient.groups['del']).toHaveBeenCalledWith({ id: organisationsEinheitId });
+    });
+
+    it('should return void', (done) => {
+      repository.delete(organisationsEinheitId).subscribe((result: void) => {
+        expect(result).toBeUndefined();
+        done();
+      });
+    });
+  });
 });
diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.ts
index c2d454434e..abc3737d30 100644
--- a/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.ts
+++ b/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.ts
@@ -43,4 +43,8 @@ export class AdminOrganisationsEinheitRepository {
       attributes: group.attributes,
     };
   }
+
+  public delete(organisationseinheitId: string): Observable<void> {
+    return from(this.kcAdminClient.groups.del({ id: organisationseinheitId }));
+  }
 }
diff --git a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.spec.ts b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.spec.ts
index db8b44f6aa..12b297f16e 100644
--- a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.spec.ts
@@ -23,8 +23,12 @@
  */
 import { AdminOrganisationsEinheit, AdminOrganisationsEinheitService } from '@admin-client/organisations-einheit-shared';
 import { AdminOrganisationsEinheitRepository } from '@admin/keycloak-shared';
+import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
 import { Mock, mock } from '@alfa-client/test-utils';
 import { TestBed } from '@angular/core/testing';
+import { faker } from '@faker-js/faker';
+import { of } from 'rxjs';
+import { singleColdCompleted } from '../../../../tech-shared/test/marbles';
 import { createAdminOrganisationsEinheit } from '../test/organisations-einheit';
 
 describe('AdminOrganisationsEinheitService', () => {
@@ -55,4 +59,23 @@ describe('AdminOrganisationsEinheitService', () => {
       expect(repository.create).toHaveBeenCalledWith(organisationsEinheit);
     });
   });
+
+  describe('deleteInKeycloak', () => {
+    const organisationsEinheitId: string = faker.string.uuid();
+
+    it('should call repository delete', () => {
+      service._deleteInKeycloak(organisationsEinheitId);
+
+      expect(repository.delete).toHaveBeenCalledWith(organisationsEinheitId);
+    });
+
+    it('should return result', () => {
+      const state: StateResource<unknown> = createEmptyStateResource();
+      repository.delete.mockReturnValue(of(state));
+
+      const result = service._deleteInKeycloak(organisationsEinheitId);
+
+      expect(result).toBeObservable(singleColdCompleted(state));
+    });
+  });
 });
diff --git a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.ts b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.ts
index 5c12d0613e..35f7580e9c 100644
--- a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.ts
+++ b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.ts
@@ -45,6 +45,6 @@ export class AdminOrganisationsEinheitService extends KeycloakResourceService<Ad
   }
 
   _deleteInKeycloak(id: string): Observable<void> {
-    throw new Error('Method not implemented.');
+    return this.repository.delete(id);
   }
 }
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
index c4159af1ed..22e9242b1a 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
@@ -36,11 +36,13 @@ describe('OrganisationsEinheitDeleteButtonComponent', () => {
     describe('delete', () => {
       it('should open dialog', () => {
         component.organisationsEinheitName = faker.word.sample();
+        component.organisationsEinheitId = faker.string.uuid();
 
         component.openDeleteDialog();
 
         expect(dialogService.open).toHaveBeenCalledWith(OrganisationsEinheitDeleteDialogContainerComponent, {
           organisationsEinheitName: component.organisationsEinheitName,
+          organisationsEinheitId: component.organisationsEinheitId,
         });
       });
     });
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
index 50a217af68..0107b57855 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
@@ -16,10 +16,12 @@ export class OrganisationsEinheitDeleteButtonComponent {
   private readonly dialogService = inject(OzgcloudDialogService);
 
   @Input() organisationsEinheitName: string;
+  @Input() organisationsEinheitId: string;
 
   public openDeleteDialog(): void {
     const dialogData: OrganisationsEinheitDeleteDialogData = {
       organisationsEinheitName: this.organisationsEinheitName,
+      organisationsEinheitId: this.organisationsEinheitId,
     };
     this.dialogService.open(OrganisationsEinheitDeleteDialogContainerComponent, dialogData);
   }
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html
index b7ab8d03d3..21de75aa26 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html
@@ -1,6 +1,7 @@
 <admin-organisations-einheit-delete-dialog
   [organisationsEinheitName]="organisationsEinheitName"
-  [deleteOrganisationsEinheitStateResource]="deleteUserStateResource$ | async"
-  (cancel)="closeDeleteDialog()"
-  (delete)="deleteOrganisationsEinheit()"
+  [deleteStateResource]="deleteStateResource$ | async"
+  (cancel)="closeDialog()"
+  (delete)="delete()"
+  data-test-id="organisations-einheit-delete-dialog"
 />
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
index 90765a429c..a61b437b5e 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
@@ -1,26 +1,37 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
-import { Mock, mock } from '@alfa-client/test-utils';
+import { AdminOrganisationsEinheitService } from '@admin-client/organisations-einheit-shared';
+import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
+import { dispatchEventFromFixture, getMockComponent, Mock, mock } from '@alfa-client/test-utils';
 import { OzgcloudDialogService } from '@alfa-client/ui';
 import { DIALOG_DATA } from '@angular/cdk/dialog';
 import { faker } from '@faker-js/faker';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { singleColdCompleted } from 'libs/tech-shared/test/marbles';
+import { Observable, of } from 'rxjs';
 import { OrganisationsEinheitDeleteDialogContainerComponent } from './organisations-einheit-delete-dialog-container.component';
+import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component';
 
 describe('OrganisationsEinheitDeleteDialogContainerComponent', () => {
   let component: OrganisationsEinheitDeleteDialogContainerComponent;
   let fixture: ComponentFixture<OrganisationsEinheitDeleteDialogContainerComponent>;
 
   let dialogService: Mock<OzgcloudDialogService>;
+  let organisationsEinheitService: Mock<AdminOrganisationsEinheitService>;
 
-  const dialogData = { organisationsEinheitName: faker.word.sample() };
+  const dialogData = { organisationsEinheitName: faker.word.sample(), organisationsEinheitId: faker.string.uuid() };
 
-  beforeEach(async () => {
+  const organisationsEinheitDeleteDialog: string = getDataTestIdOf('organisations-einheit-delete-dialog');
+
+  beforeEach(() => {
     dialogService = mock(OzgcloudDialogService);
+    organisationsEinheitService = { ...mock(AdminOrganisationsEinheitService), delete: jest.fn() };
 
-    await TestBed.configureTestingModule({
+    TestBed.configureTestingModule({
       imports: [OrganisationsEinheitDeleteDialogContainerComponent],
       providers: [
         { provide: OzgcloudDialogService, useValue: dialogService },
+        { provide: AdminOrganisationsEinheitService, useValue: organisationsEinheitService },
         {
           provide: DIALOG_DATA,
           useValue: dialogData,
@@ -37,21 +48,98 @@ describe('OrganisationsEinheitDeleteDialogContainerComponent', () => {
     expect(component).toBeTruthy();
   });
 
+  describe('template', () => {
+    describe('organisations einheit delete dialog', () => {
+      it('should exist', () => {
+        const stateResource: StateResource<unknown> = createEmptyStateResource();
+        component.deleteStateResource$ = of(stateResource);
+        component.organisationsEinheitName = dialogData.organisationsEinheitName;
+
+        const deleteDialogComponent: OrganisationsEinheitDeleteDialogComponent = getMockComponent(
+          fixture,
+          OrganisationsEinheitDeleteDialogComponent,
+        );
+
+        expect(deleteDialogComponent.organisationsEinheitName).toBe(component.organisationsEinheitName);
+        expect(deleteDialogComponent.deleteStateResource).toEqual(stateResource);
+      });
+
+      it('should call closeDialog on cancel emit', () => {
+        component.closeDialog = jest.fn();
+
+        dispatchEventFromFixture(fixture, organisationsEinheitDeleteDialog, 'cancel');
+
+        expect(component.closeDialog).toHaveBeenCalled();
+      });
+
+      it('should call delete on delete emit', () => {
+        component.delete = jest.fn();
+
+        dispatchEventFromFixture(fixture, organisationsEinheitDeleteDialog, 'delete');
+
+        expect(component.delete).toHaveBeenCalled();
+      });
+    });
+  });
+
   describe('component', () => {
     describe('constructor', () => {
       it('should set organisationsEinheitName', () => {
         expect(component.organisationsEinheitName).toBe(dialogData.organisationsEinheitName);
       });
+
+      it('should set organisationsEinheitId', () => {
+        expect(component.organisationsEinheitId).toBe(dialogData.organisationsEinheitId);
+      });
     });
 
-    describe('closeDeleteDialog', () => {
+    describe('closeDialog', () => {
       it('should call dialogService closeAll', () => {
         dialogService.closeAll = jest.fn();
 
-        component.closeDeleteDialog();
+        component.closeDialog();
 
         expect(dialogService.closeAll).toHaveBeenCalled();
       });
     });
+
+    describe('delete', () => {
+      const stateResource: StateResource<unknown> = createEmptyStateResource();
+      const stateResource$: Observable<StateResource<unknown>> = of(stateResource);
+      const loadingStateResource: StateResource<unknown> = createEmptyStateResource(true);
+      const loadingStateResource$: Observable<StateResource<unknown>> = of(loadingStateResource);
+
+      beforeEach(() => {
+        organisationsEinheitService.delete.mockReturnValue(stateResource$);
+      });
+
+      it('should call organisationsEinheitService delete', () => {
+        component.delete();
+
+        expect(organisationsEinheitService.delete).toHaveBeenCalledWith(dialogData.organisationsEinheitId);
+      });
+
+      it('should set deleteStateResource$', () => {
+        component.delete();
+
+        expect(component.deleteStateResource$).toBeObservable(singleColdCompleted(stateResource));
+      });
+
+      it('should close dialog on delete done', () => {
+        component.delete();
+        component.deleteStateResource$.subscribe();
+
+        expect(dialogService.closeAll).toHaveBeenCalled();
+      });
+
+      it('should NOT close dialog on delete loading', () => {
+        organisationsEinheitService.delete.mockReturnValue(loadingStateResource$);
+
+        component.delete();
+        component.deleteStateResource$.subscribe();
+
+        expect(dialogService.closeAll).not.toHaveBeenCalled();
+      });
+    });
   });
 });
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
index 78a5658277..c870025c8a 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
@@ -1,13 +1,15 @@
-import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
+import { AdminOrganisationsEinheitService } from '@admin-client/organisations-einheit-shared';
+import { createEmptyStateResource, isNotLoading, StateResource } from '@alfa-client/tech-shared';
 import { OzgcloudDialogService } from '@alfa-client/ui';
 import { DIALOG_DATA } from '@angular/cdk/dialog';
 import { AsyncPipe } from '@angular/common';
 import { Component, inject } from '@angular/core';
-import { Observable, of } from 'rxjs';
+import { Observable, of, tap } from 'rxjs';
 import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component';
 
 export interface OrganisationsEinheitDeleteDialogData {
   organisationsEinheitName: string;
+  organisationsEinheitId: string;
 }
 
 @Component({
@@ -19,18 +21,31 @@ export interface OrganisationsEinheitDeleteDialogData {
 export class OrganisationsEinheitDeleteDialogContainerComponent {
   private readonly dialogService = inject(OzgcloudDialogService);
   private readonly dialogData: OrganisationsEinheitDeleteDialogData = inject(DIALOG_DATA);
+  private readonly organisationsEinheitService = inject(AdminOrganisationsEinheitService);
 
   public organisationsEinheitName: string;
+  public organisationsEinheitId: string;
 
   constructor() {
     this.organisationsEinheitName = this.dialogData.organisationsEinheitName;
+    this.organisationsEinheitId = this.dialogData.organisationsEinheitId;
   }
 
-  public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource());
+  public deleteStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource());
 
-  public closeDeleteDialog(): void {
+  public closeDialog(): void {
     this.dialogService.closeAll();
   }
 
-  public deleteOrganisationsEinheit(): void {}
+  public delete(): void {
+    this.deleteStateResource$ = this.organisationsEinheitService
+      .delete(this.organisationsEinheitId)
+      .pipe(tap((stateResource: StateResource<unknown>) => this.closeDialogOnDeleteDone(stateResource)));
+  }
+
+  private closeDialogOnDeleteDone(stateResource: StateResource<unknown>): void {
+    if (isNotLoading(stateResource)) {
+      this.dialogService.closeAll();
+    }
+  }
 }
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
index c4ea371bf7..dc4f1c424a 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
@@ -12,7 +12,7 @@
   />
 
   <ods-button-with-spinner
-    [stateResource]="deleteOrganisationsEinheitStateResource"
+    [stateResource]="deleteStateResource"
     (clickEmitter)="delete.emit()"
     variant="outline"
     text="Löschen"
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
index 755251ab19..af90956f84 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
@@ -45,7 +45,7 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => {
     describe('delete button', () => {
       it('should exist', () => {
         const stateResource: StateResource<unknown> = createEmptyStateResource();
-        component.deleteOrganisationsEinheitStateResource = stateResource;
+        component.deleteStateResource = stateResource;
 
         fixture.detectChanges();
 
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
index 5b946e192c..9d8e8f4bd9 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
@@ -10,7 +10,7 @@ import { ButtonWithSpinnerComponent } from '@ods/component';
 })
 export class OrganisationsEinheitDeleteDialogComponent {
   @Input() organisationsEinheitName: string;
-  @Input() deleteOrganisationsEinheitStateResource: StateResource<unknown>;
+  @Input() deleteStateResource: StateResource<unknown>;
   @Output() cancel: EventEmitter<void> = new EventEmitter<void>();
   @Output() delete: EventEmitter<void> = new EventEmitter<void>();
 }
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
index 5256146d2d..c70ba97b42 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
@@ -31,7 +31,7 @@
           <dt class="sr-only">Name</dt>
           <dd data-test-id="organisations-einheit-name">{{ organisationsEinheit.name }}</dd>
         </dl>
-        <admin-organisations-einheit-delete-button [organisationsEinheitName]="organisationsEinheit.name"/>
+        <admin-organisations-einheit-delete-button [organisationsEinheitName]="organisationsEinheit.name" [organisationsEinheitId]="organisationsEinheit.id"/>
       </div>
     </ods-list-item>
   }
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
index cedf580df1..7d4f9b9af5 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
@@ -107,6 +107,7 @@ describe('OrganisationsEinheitListComponent', () => {
         OrganisationsEinheitDeleteButtonComponent,
       );
       expect(button.organisationsEinheitName).toBe(component.organisationsEinheitList[0].name);
+      expect(button.organisationsEinheitId).toBe(component.organisationsEinheitList[0].id);
     });
   });
 });
-- 
GitLab


From e5d76403058bf205c7a2acc626b6f8d82e9de005 Mon Sep 17 00:00:00 2001
From: Albert <Albert.Bruns@mgm-tp.com>
Date: Tue, 25 Feb 2025 16:19:37 +0100
Subject: [PATCH 04/18] OZG-7507-7819 UI/UX

---
 ...tions-einheit-delete-button.component.html | 13 ++++---
 ...sations-einheit-delete-button.component.ts |  3 +-
 ...tions-einheit-delete-dialog.component.html | 34 +++++++++----------
 3 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html
index e180bccebc..ecda066c3e 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html
@@ -1,6 +1,9 @@
-<ods-button-with-spinner
-  (clickEmitter)="openDeleteDialog()"
-  variant="outline"
-  text="Löschen"
+<ods-button
+  (click)="openDeleteDialog()"
+  [tooltip]="'Organisationseinheit löschen'"
+  variant="ghost"
+  size="fit"
   dataTestId="delete-button"
-/>
\ No newline at end of file
+>
+  <ods-delete-icon icon/>
+</ods-button>
\ No newline at end of file
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
index 0107b57855..d04e53f3a6 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
@@ -1,6 +1,7 @@
 import { OzgcloudDialogService } from '@alfa-client/ui';
 import { Component, inject, Input } from '@angular/core';
 import { ButtonWithSpinnerComponent } from '@ods/component';
+import { ButtonComponent, DeleteIconComponent, TooltipDirective } from '@ods/system';
 import {
   OrganisationsEinheitDeleteDialogContainerComponent,
   OrganisationsEinheitDeleteDialogData,
@@ -9,7 +10,7 @@ import {
 @Component({
   selector: 'admin-organisations-einheit-delete-button',
   standalone: true,
-  imports: [ButtonWithSpinnerComponent],
+  imports: [ButtonWithSpinnerComponent, DeleteIconComponent, ButtonComponent, TooltipDirective],
   templateUrl: './organisations-einheit-delete-button.component.html',
 })
 export class OrganisationsEinheitDeleteButtonComponent {
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
index dc4f1c424a..127651d3f6 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
@@ -1,21 +1,21 @@
-<h1>Organisationseinheit</h1>
+<div class="block flex flex-col gap-4 bg-background-100 p-8 max-w-xl">
+  <h1 class="text-xl">Organisationseinheit</h1>
 
-<h2>{{organisationsEinheitName}} </h2>
+  <h2 class="text-lg">{{ organisationsEinheitName }}</h2>
 
-<p>Achtung: Durch das Entfernen der Organisationseinheit aus dieser Liste wird die Organisationseinheit auch für alle Benutzer entfernt. Benutzer sind dieser Organisationseinheit dann nicht mehr zugewiesen.</p>
+  <p>
+    <span class="font-bold">Achtung:</span> Durch das Entfernen der Organisationseinheit aus dieser Liste wird die Organisationseinheit auch für alle Benutzer
+    entfernt.
+  </p>
 
-<div class="flex justify-between">
-  <ods-button-with-spinner
-    (clickEmitter)="cancel.emit()"
-    text="Abbrechen"
-    dataTestId="dialog-cancel-button"
-  />
+  <div class="flex justify-between">
+    <ods-button-with-spinner (clickEmitter)="cancel.emit()" variant="outline" text="Abbrechen" dataTestId="dialog-cancel-button" />
 
-  <ods-button-with-spinner
-    [stateResource]="deleteStateResource"
-    (clickEmitter)="delete.emit()"
-    variant="outline"
-    text="Löschen"
-    dataTestId="dialog-delete-button"
-  />
-</div>
\ No newline at end of file
+    <ods-button-with-spinner
+      [stateResource]="deleteStateResource"
+      (clickEmitter)="delete.emit()"
+      text="Löschen"
+      dataTestId="dialog-delete-button"
+    />
+  </div>
+</div>
-- 
GitLab


From 058f297b0795d1092e9f3547405e56be75f1d9cf Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Thu, 27 Feb 2025 23:44:59 +0100
Subject: [PATCH 05/18] OZG-7507 use new open dialog button

Sub task: OZG-7821
---
 ...tions-einheit-delete-button.component.html |  9 ---
 ...ns-einheit-delete-button.component.spec.ts | 66 -------------------
 ...sations-einheit-delete-button.component.ts | 29 --------
 .../organisations-einheit-list.component.html | 10 ++-
 ...ganisations-einheit-list.component.spec.ts | 39 ++++++-----
 .../organisations-einheit-list.component.ts   | 17 ++++-
 .../open-dialog-button.component.spec.ts      | 27 +++++++-
 .../open-dialog-button.component.ts           | 14 ++--
 .../src/lib/service/component.factory.spec.ts |  9 ++-
 .../src/lib/service/component.factory.ts      | 23 +++++--
 alfa-client/libs/test-utils/src/lib/dialog.ts |  8 ++-
 11 files changed, 111 insertions(+), 140 deletions(-)
 delete mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html
 delete mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
 delete mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html
deleted file mode 100644
index ecda066c3e..0000000000
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<ods-button
-  (click)="openDeleteDialog()"
-  [tooltip]="'Organisationseinheit löschen'"
-  variant="ghost"
-  size="fit"
-  dataTestId="delete-button"
->
-  <ods-delete-icon icon/>
-</ods-button>
\ No newline at end of file
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
deleted file mode 100644
index 22e9242b1a..0000000000
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { dispatchEventFromFixture, existsAsHtmlElement, mock, Mock } from '@alfa-client/test-utils';
-import { OzgcloudDialogService } from '@alfa-client/ui';
-import { faker } from '@faker-js/faker';
-import { getDataTestIdAttributeOf } from '../../../../../../../tech-shared/test/data-test';
-import { OrganisationsEinheitDeleteDialogContainerComponent } from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component';
-import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button.component';
-
-describe('OrganisationsEinheitDeleteButtonComponent', () => {
-  let component: OrganisationsEinheitDeleteButtonComponent;
-  let fixture: ComponentFixture<OrganisationsEinheitDeleteButtonComponent>;
-
-  const deleteButton: string = getDataTestIdAttributeOf('delete-button');
-
-  let dialogService: Mock<OzgcloudDialogService>;
-
-  beforeEach(() => {
-    dialogService = mock(OzgcloudDialogService);
-
-    TestBed.configureTestingModule({
-      imports: [OrganisationsEinheitDeleteButtonComponent],
-      providers: [{ provide: OzgcloudDialogService, useValue: dialogService }],
-    }).compileComponents();
-
-    fixture = TestBed.createComponent(OrganisationsEinheitDeleteButtonComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-
-  describe('component', () => {
-    describe('delete', () => {
-      it('should open dialog', () => {
-        component.organisationsEinheitName = faker.word.sample();
-        component.organisationsEinheitId = faker.string.uuid();
-
-        component.openDeleteDialog();
-
-        expect(dialogService.open).toHaveBeenCalledWith(OrganisationsEinheitDeleteDialogContainerComponent, {
-          organisationsEinheitName: component.organisationsEinheitName,
-          organisationsEinheitId: component.organisationsEinheitId,
-        });
-      });
-    });
-  });
-
-  describe('template', () => {
-    describe('button with spinner', () => {
-      it('should exist', () => {
-        existsAsHtmlElement(fixture, deleteButton);
-      });
-
-      it('should open delete dialog on click', () => {
-        component.openDeleteDialog = jest.fn();
-
-        dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter');
-
-        expect(component.openDeleteDialog).toHaveBeenCalled();
-      });
-    });
-  });
-});
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
deleted file mode 100644
index d04e53f3a6..0000000000
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { OzgcloudDialogService } from '@alfa-client/ui';
-import { Component, inject, Input } from '@angular/core';
-import { ButtonWithSpinnerComponent } from '@ods/component';
-import { ButtonComponent, DeleteIconComponent, TooltipDirective } from '@ods/system';
-import {
-  OrganisationsEinheitDeleteDialogContainerComponent,
-  OrganisationsEinheitDeleteDialogData,
-} from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component';
-
-@Component({
-  selector: 'admin-organisations-einheit-delete-button',
-  standalone: true,
-  imports: [ButtonWithSpinnerComponent, DeleteIconComponent, ButtonComponent, TooltipDirective],
-  templateUrl: './organisations-einheit-delete-button.component.html',
-})
-export class OrganisationsEinheitDeleteButtonComponent {
-  private readonly dialogService = inject(OzgcloudDialogService);
-
-  @Input() organisationsEinheitName: string;
-  @Input() organisationsEinheitId: string;
-
-  public openDeleteDialog(): void {
-    const dialogData: OrganisationsEinheitDeleteDialogData = {
-      organisationsEinheitName: this.organisationsEinheitName,
-      organisationsEinheitId: this.organisationsEinheitId,
-    };
-    this.dialogService.open(OrganisationsEinheitDeleteDialogContainerComponent, dialogData);
-  }
-}
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
index c70ba97b42..a990131625 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
@@ -31,7 +31,15 @@
           <dt class="sr-only">Name</dt>
           <dd data-test-id="organisations-einheit-name">{{ organisationsEinheit.name }}</dd>
         </dl>
-        <admin-organisations-einheit-delete-button [organisationsEinheitName]="organisationsEinheit.name" [organisationsEinheitId]="organisationsEinheit.id"/>
+        <ods-open-dialog-button
+          [tooltip]="'Organisationseinheit löschen'"
+          variant="ghost"
+          size="fit"
+          dataTestId="delete-button"
+          [dialogData]="{ organisationsEinheitName: organisationsEinheit.name, organisationsEinheitId: organisationsEinheit.id }"
+        >
+          <ods-delete-icon icon />
+        </ods-open-dialog-button>
       </div>
     </ods-list-item>
   }
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
index 7d4f9b9af5..75e0c4dd8e 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
@@ -23,15 +23,15 @@
  */
 import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared';
 import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
-import { existsAsHtmlElement, getElementFromFixture, getMockComponent, mock } from '@alfa-client/test-utils';
+import { existsAsHtmlElement, getElementFromFixture, getElementFromFixtureByType, mock } from '@alfa-client/test-utils';
 import { CommonModule } from '@angular/common';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ActivatedRoute } from '@angular/router';
+import { OpenDialogButtonComponent } from '@ods/component';
 import { ExclamationIconComponent, ListComponent, ListItemComponent } from '@ods/system';
-import { getConvertedDataTestIdOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { getConvertedDataTestIdOf, getDataTestIdAttributeOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
 import { createAdminOrganisationsEinheit } from '../../../../../organisations-einheit-shared/src/test/organisations-einheit';
-import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button/organisations-einheit-delete-button.component';
 import { OrganisationsEinheitListComponent } from './organisations-einheit-list.component';
 
 describe('OrganisationsEinheitListComponent', () => {
@@ -40,6 +40,7 @@ describe('OrganisationsEinheitListComponent', () => {
 
   const listSelector: string = getDataTestIdOf('organisations-einheit-list');
   const listItemSuffux: string = '-organisation-item';
+  const deleteButtonTestId: string = getDataTestIdAttributeOf('delete-button');
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
@@ -49,13 +50,12 @@ describe('OrganisationsEinheitListComponent', () => {
           useValue: mock(ActivatedRoute),
         },
       ],
-      imports: [CommonModule, ConvertForDataTestPipe],
+      imports: [CommonModule, ConvertForDataTestPipe, MockComponent(OpenDialogButtonComponent)],
       declarations: [
         OrganisationsEinheitListComponent,
         MockComponent(ListComponent),
         MockComponent(ListItemComponent),
         MockComponent(ExclamationIconComponent),
-        MockComponent(OrganisationsEinheitDeleteButtonComponent),
       ],
     }).compileComponents();
 
@@ -94,20 +94,27 @@ describe('OrganisationsEinheitListComponent', () => {
         });
       });
     });
-  });
 
-  describe('organisationsEinheit delete button', () => {
-    it('should exist', () => {
-      component.organisationsEinheitList = [createAdminOrganisationsEinheit()];
+    describe('open delete dialog button', () => {
+      const organisationsEinheit: AdminOrganisationsEinheit = createAdminOrganisationsEinheit();
+
+      it('should exist', () => {
+        component.organisationsEinheitList = [organisationsEinheit];
 
-      fixture.detectChanges();
+        fixture.detectChanges();
+
+        existsAsHtmlElement(fixture, deleteButtonTestId);
+      });
 
-      const button: OrganisationsEinheitDeleteButtonComponent = getMockComponent(
-        fixture,
-        OrganisationsEinheitDeleteButtonComponent,
-      );
-      expect(button.organisationsEinheitName).toBe(component.organisationsEinheitList[0].name);
-      expect(button.organisationsEinheitId).toBe(component.organisationsEinheitList[0].id);
+      it('should have inputs', () => {
+        component.organisationsEinheitList = [organisationsEinheit];
+
+        fixture.detectChanges();
+        const dialog: OpenDialogButtonComponent = getElementFromFixtureByType(fixture, OpenDialogButtonComponent);
+
+        expect(dialog.dialogData.organisationsEinheitName).toBe(organisationsEinheit.name);
+        expect(dialog.dialogData.organisationsEinheitId).toBe(organisationsEinheit.id);
+      });
     });
   });
 });
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts
index f268484b86..9fabaed44e 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts
@@ -23,16 +23,27 @@
  */
 import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared';
 import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
+import { DIALOG_COMPONENT } from '@alfa-client/ui';
 import { CommonModule } from '@angular/common';
 import { Component, Input } from '@angular/core';
-import { ListComponent, ListItemComponent } from '@ods/system';
-import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button/organisations-einheit-delete-button.component';
+import { OpenDialogButtonComponent } from '@ods/component';
+import { DeleteIconComponent, ListComponent, ListItemComponent, TooltipDirective } from '@ods/system';
+import { OrganisationsEinheitDeleteDialogContainerComponent } from './organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component';
 
 @Component({
   selector: 'admin-organisations-einheit-list',
   templateUrl: './organisations-einheit-list.component.html',
   standalone: true,
-  imports: [CommonModule, ListComponent, ListItemComponent, ConvertForDataTestPipe, OrganisationsEinheitDeleteButtonComponent],
+  providers: [{ provide: DIALOG_COMPONENT, useValue: OrganisationsEinheitDeleteDialogContainerComponent }],
+  imports: [
+    CommonModule,
+    ListComponent,
+    ListItemComponent,
+    ConvertForDataTestPipe,
+    OpenDialogButtonComponent,
+    TooltipDirective,
+    DeleteIconComponent,
+  ],
 })
 export class OrganisationsEinheitListComponent {
   @Input() public organisationsEinheitList: AdminOrganisationsEinheit[] = [];
diff --git a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts
index 8cbe8c1ae0..220ba4a752 100644
--- a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts
+++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts
@@ -1,9 +1,18 @@
 import { OzgCloudComponentFactory } from '@alfa-client/tech-shared';
-import { dispatchEventFromFixture, Mock, mock, MockEvent, mockGetValue } from '@alfa-client/test-utils';
+import {
+  createdClosedDialogRefMock,
+  dispatchEventFromFixture,
+  Mock,
+  mock,
+  MockEvent,
+  mockGetValue,
+} from '@alfa-client/test-utils';
 import { DIALOG_COMPONENT, OzgcloudDialogService } from '@alfa-client/ui';
+import { DIALOG_DATA } from '@angular/cdk/dialog';
 import { ComponentType } from '@angular/cdk/portal';
 import { ComponentRef, Injector, ViewContainerRef } from '@angular/core';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { expect } from '@jest/globals';
 import { ButtonComponent } from '@ods/system';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
@@ -24,6 +33,7 @@ describe('OpenDialogButtonComponent', () => {
 
   const componentRef: ComponentRef<any> = <any>{ instance: { constructor: null } };
   const dialogResponse: any = {};
+  const dummyDialogData: any = { someField: 'someValue' };
 
   beforeEach(async () => {
     dialogComponent = {};
@@ -74,9 +84,15 @@ describe('OpenDialogButtonComponent', () => {
     });
 
     it('should call dialog service to open dialog', () => {
+      component.dialogData = dummyDialogData;
+
       dispatchEventFromFixture(fixture, openDialog, MockEvent.CLICK);
 
-      expect(dialogService.openInContext).toHaveBeenCalledWith(componentRef.instance.constructor, viewContainerRef);
+      expect(dialogService.openInContext).toHaveBeenCalledWith(
+        componentRef.instance.constructor,
+        viewContainerRef,
+        dummyDialogData,
+      );
     });
   });
 
@@ -87,6 +103,7 @@ describe('OpenDialogButtonComponent', () => {
 
     it('should emit close emitter on dialog close', () => {
       component.close.emit = jest.fn();
+      dialogService.openInContext.mockReturnValue(createdClosedDialogRefMock());
 
       component.open();
 
@@ -96,9 +113,13 @@ describe('OpenDialogButtonComponent', () => {
 
   describe('create component', () => {
     it('should call component factory to create component', () => {
+      component.dialogData = dummyDialogData;
+
       component._createComponent();
 
-      expect(componentFactory.createComponent).toHaveBeenCalledWith(dialogComponent, injector);
+      expect(componentFactory.createComponent).toHaveBeenCalledWith(dialogComponent, injector, [
+        { provide: DIALOG_DATA, useValue: dummyDialogData },
+      ]);
     });
   });
 });
diff --git a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
index 2815aab6fd..833c45112b 100644
--- a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
+++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
@@ -1,5 +1,6 @@
 import { OzgCloudComponentFactory } from '@alfa-client/tech-shared';
 import { DIALOG_COMPONENT, OzgcloudDialogService } from '@alfa-client/ui';
+import { DIALOG_DATA } from '@angular/cdk/dialog';
 import { ComponentType } from '@angular/cdk/portal';
 import { Component, ComponentRef, EventEmitter, inject, Injector, Input, Output, ViewContainerRef } from '@angular/core';
 import { ButtonComponent, ButtonVariants } from '@ods/system';
@@ -9,10 +10,11 @@ import { first } from 'rxjs';
   selector: 'ods-open-dialog-button',
   standalone: true,
   imports: [ButtonComponent],
-  template: `<ods-button
+  template: ` <ods-button
     (clickEmitter)="open()"
     [variant]="variant"
     [text]="label"
+    [size]="size"
     [dataTestId]="dataTestId"
     data-test-id="open-dialog"
   >
@@ -33,17 +35,21 @@ export class OpenDialogButtonComponent {
   @Input() label: string;
   @Input() dataTestId: string;
   @Input() variant: ButtonVariants['variant'] = 'primary';
+  @Input() dialogData: any;
+  @Input() size: ButtonVariants['size'];
 
   @Output() close: EventEmitter<void> = new EventEmitter();
 
   public open(): void {
     this.dialogService
-      .openInContext(this._createComponent().instance.constructor, this.viewContainerRef)
+      .openInContext(this._createComponent().instance.constructor, this.viewContainerRef, this.dialogData)
       .closed.pipe(first())
-      .subscribe(this.close.emit);
+      .subscribe(() => this.close.emit());
   }
 
   _createComponent(): ComponentRef<any> {
-    return this.componentFactory.createComponent<any>(this.component, this.injector);
+    return this.componentFactory.createComponent<any>(this.component, this.injector, [
+      { provide: DIALOG_DATA, useValue: this.dialogData },
+    ]);
   }
 }
diff --git a/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts b/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts
index 32fb2f6d84..d8a94aec3e 100644
--- a/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts
@@ -1,8 +1,9 @@
 import { Mock, mock, mockGetValue } from '@alfa-client/test-utils';
-import { ApplicationRef, ComponentRef, EnvironmentInjector, Injector, ViewRef } from '@angular/core';
+import { ApplicationRef, ComponentRef, EnvironmentInjector, Injector, Provider, ViewRef } from '@angular/core';
 import { TestBed } from '@angular/core/testing';
 import { OzgCloudComponentFactory } from './component.factory';
 
+import { DIALOG_DATA } from '@angular/cdk/dialog';
 import { ComponentType } from '@angular/cdk/portal';
 
 jest.mock('@angular/core', () => ({
@@ -16,6 +17,8 @@ describe('OzgCloudComponentFactory', () => {
   let appRef: Mock<ApplicationRef>;
   let envInjector: Mock<EnvironmentInjector>;
 
+  const dummyProvider: Provider = { provide: DIALOG_DATA, useValue: { someField: 'value' } } as Provider;
+
   beforeEach(() => {
     appRef = mock(ApplicationRef);
     envInjector = mock(EnvironmentInjector as any);
@@ -45,7 +48,7 @@ describe('OzgCloudComponentFactory', () => {
     });
 
     it('should call createComponent', () => {
-      factory.createComponent(componentType, injector);
+      factory.createComponent(componentType, injector, [dummyProvider]);
 
       expect(createComponentSpy).toHaveBeenCalledWith(componentType, {
         environmentInjector: envInjector,
@@ -76,7 +79,7 @@ describe('OzgCloudComponentFactory', () => {
     });
 
     it('should create an injector by given parent selector', () => {
-      factory._createElementInjector(injectorMock);
+      factory._createElementInjector(injectorMock, [dummyProvider]);
 
       expect(createSpy).toHaveBeenCalled();
     });
diff --git a/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts b/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts
index e54497e9fc..b3d13c11b4 100644
--- a/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts
+++ b/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts
@@ -1,22 +1,35 @@
 import { ComponentType } from '@angular/cdk/portal';
-import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, inject, Injectable, Injector } from '@angular/core';
+import {
+  ApplicationRef,
+  ComponentRef,
+  createComponent,
+  EnvironmentInjector,
+  inject,
+  Injectable,
+  Injector,
+  Provider,
+} from '@angular/core';
 
 @Injectable({ providedIn: 'root' })
 export class OzgCloudComponentFactory {
   private readonly appRef = inject(ApplicationRef);
   private readonly envInjector = inject(EnvironmentInjector);
 
-  public createComponent<T>(componentType: ComponentType<any>, parentInjector: Injector): ComponentRef<T> {
+  public createComponent<T>(
+    componentType: ComponentType<any>,
+    parentInjector: Injector,
+    providers: Provider[] = [],
+  ): ComponentRef<T> {
     const component: ComponentRef<any> = <ComponentRef<any>>createComponent(componentType, {
       environmentInjector: this.envInjector,
-      elementInjector: this._createElementInjector(parentInjector),
+      elementInjector: this._createElementInjector(parentInjector, providers),
     });
     this._registerComponentToChangeDetection(component);
     return component;
   }
 
-  _createElementInjector(parentInjector: Injector): Injector {
-    return Injector.create({ providers: [], parent: parentInjector });
+  _createElementInjector(parentInjector: Injector, providers: Provider[] = []): Injector {
+    return Injector.create({ providers, parent: parentInjector });
   }
 
   _registerComponentToChangeDetection(component: ComponentRef<any>): void {
diff --git a/alfa-client/libs/test-utils/src/lib/dialog.ts b/alfa-client/libs/test-utils/src/lib/dialog.ts
index 7e09b7bea5..5a8c5fe473 100644
--- a/alfa-client/libs/test-utils/src/lib/dialog.ts
+++ b/alfa-client/libs/test-utils/src/lib/dialog.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { jest } from '@jest/globals';
-import { EMPTY, Observable } from 'rxjs';
+import { EMPTY, Observable, of } from 'rxjs';
 
 export class DialogRefMock<R = unknown> {
   public keydownEvents: Observable<KeyboardEvent> = EMPTY;
@@ -34,3 +34,9 @@ export class DialogRefMock<R = unknown> {
 export function createDialogRefMock<R = unknown>(): DialogRefMock<R> {
   return new DialogRefMock();
 }
+
+export function createdClosedDialogRefMock<R = unknown>(result?: R): DialogRefMock<R> {
+  const dialogRefMock = createDialogRefMock<R>();
+  dialogRefMock.closed = of(result);
+  return dialogRefMock;
+}
-- 
GitLab


From a3d558941bdae4cfc393c89c40238bd679898a94 Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Fri, 28 Feb 2025 11:56:16 +0100
Subject: [PATCH 06/18] OZG-7507 add data-test-id

---
 ...nisations-einheit-delete-dialog.component.html | 15 +++++++++++----
 ...ations-einheit-delete-dialog.component.spec.ts |  6 +++---
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
index 127651d3f6..be0ce22400 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
@@ -1,21 +1,28 @@
-<div class="block flex flex-col gap-4 bg-background-100 p-8 max-w-xl">
+<div class="block flex max-w-xl flex-col gap-4 bg-background-100 p-8">
   <h1 class="text-xl">Organisationseinheit</h1>
 
   <h2 class="text-lg">{{ organisationsEinheitName }}</h2>
 
   <p>
-    <span class="font-bold">Achtung:</span> Durch das Entfernen der Organisationseinheit aus dieser Liste wird die Organisationseinheit auch für alle Benutzer
-    entfernt.
+    <span class="font-bold">Achtung:</span> Durch das Entfernen der Organisationseinheit aus dieser Liste wird die
+    Organisationseinheit auch für alle Benutzer entfernt.
   </p>
 
   <div class="flex justify-between">
-    <ods-button-with-spinner (clickEmitter)="cancel.emit()" variant="outline" text="Abbrechen" dataTestId="dialog-cancel-button" />
+    <ods-button-with-spinner
+      (clickEmitter)="cancel.emit()"
+      variant="outline"
+      text="Abbrechen"
+      dataTestId="dialog-cancel-button"
+      data-test-id="dialog-cancel-ods-button"
+    />
 
     <ods-button-with-spinner
       [stateResource]="deleteStateResource"
       (clickEmitter)="delete.emit()"
       text="Löschen"
       dataTestId="dialog-delete-button"
+      data-test-id="dialog-delete-ods-button"
     />
   </div>
 </div>
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
index af90956f84..4d242a5a99 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
@@ -3,15 +3,15 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
 import { dispatchEventFromFixture, existsAsHtmlElement, getDebugElementFromFixtureByCss } from '@alfa-client/test-utils';
 import { ButtonWithSpinnerComponent } from '@ods/component';
-import { getDataTestIdAttributeOf } from '../../../../../../../../tech-shared/test/data-test';
+import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test';
 import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog.component';
 
 describe('OrganisationsEinheitDeleteDialogComponent', () => {
   let component: OrganisationsEinheitDeleteDialogComponent;
   let fixture: ComponentFixture<OrganisationsEinheitDeleteDialogComponent>;
 
-  const deleteButton: string = getDataTestIdAttributeOf('dialog-delete-button');
-  const cancelButton: string = getDataTestIdAttributeOf('dialog-cancel-button');
+  const deleteButton: string = getDataTestIdOf('dialog-delete-ods-button');
+  const cancelButton: string = getDataTestIdOf('dialog-cancel-ods-button');
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-- 
GitLab


From bf7e975012d46ada9dc162c4e4f67add59c14656 Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Fri, 28 Feb 2025 11:57:00 +0100
Subject: [PATCH 07/18] OZG-7507 use MockEvent

---
 ...anisations-einheit-delete-dialog.component.spec.ts | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
index 4d242a5a99..78d9d0efc5 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
@@ -1,7 +1,12 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
 import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
-import { dispatchEventFromFixture, existsAsHtmlElement, getDebugElementFromFixtureByCss } from '@alfa-client/test-utils';
+import {
+  dispatchEventFromFixture,
+  existsAsHtmlElement,
+  getDebugElementFromFixtureByCss,
+  MockEvent,
+} from '@alfa-client/test-utils';
 import { ButtonWithSpinnerComponent } from '@ods/component';
 import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test';
 import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog.component';
@@ -36,7 +41,7 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => {
       it('should emit cancel on click', () => {
         component.cancel.emit = jest.fn();
 
-        dispatchEventFromFixture(fixture, cancelButton, 'clickEmitter');
+        dispatchEventFromFixture(fixture, cancelButton, MockEvent.CLICK);
 
         expect(component.cancel.emit).toHaveBeenCalled();
       });
@@ -56,7 +61,7 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => {
       it('should emit delete on click', () => {
         component.delete.emit = jest.fn();
 
-        dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter');
+        dispatchEventFromFixture(fixture, deleteButton, MockEvent.CLICK);
 
         expect(component.delete.emit).toHaveBeenCalled();
       });
-- 
GitLab


From 178e82f3dc81ee2ebbbac179b7387c25a88a412b Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Fri, 28 Feb 2025 11:57:35 +0100
Subject: [PATCH 08/18] OZG-7507 remove empty line

---
 .../organisations-einheit-delete-dialog.component.spec.ts      | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
index 78d9d0efc5..011880a964 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
@@ -1,5 +1,3 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
 import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
 import {
   dispatchEventFromFixture,
@@ -7,6 +5,7 @@ import {
   getDebugElementFromFixtureByCss,
   MockEvent,
 } from '@alfa-client/test-utils';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ButtonWithSpinnerComponent } from '@ods/component';
 import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test';
 import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog.component';
-- 
GitLab


From 4cb9e7b3f88579ee1038601c8845f5ba220fb4db Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Fri, 28 Feb 2025 12:15:22 +0100
Subject: [PATCH 09/18] OZG-7507 use button without spinner

---
 ...ations-einheit-delete-dialog.component.html |  2 +-
 ...ons-einheit-delete-dialog.component.spec.ts | 18 ++++++++++++++----
 ...isations-einheit-delete-dialog.component.ts |  3 ++-
 3 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
index be0ce22400..1c75a946f5 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html
@@ -9,7 +9,7 @@
   </p>
 
   <div class="flex justify-between">
-    <ods-button-with-spinner
+    <ods-button
       (clickEmitter)="cancel.emit()"
       variant="outline"
       text="Abbrechen"
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
index 011880a964..dc175e5e96 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
@@ -2,11 +2,13 @@ import { createEmptyStateResource, StateResource } from '@alfa-client/tech-share
 import {
   dispatchEventFromFixture,
   existsAsHtmlElement,
-  getDebugElementFromFixtureByCss,
+  getElementComponentFromFixtureByCss,
   MockEvent,
 } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ButtonWithSpinnerComponent } from '@ods/component';
+import { ButtonComponent } from '@ods/system';
+import { MockComponent } from 'ng-mocks';
 import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test';
 import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog.component';
 
@@ -19,7 +21,11 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [OrganisationsEinheitDeleteDialogComponent],
+      imports: [
+        OrganisationsEinheitDeleteDialogComponent,
+        MockComponent(ButtonWithSpinnerComponent),
+        MockComponent(ButtonComponent),
+      ],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OrganisationsEinheitDeleteDialogComponent);
@@ -48,13 +54,17 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => {
 
     describe('delete button', () => {
       it('should exist', () => {
+        existsAsHtmlElement(fixture, deleteButton);
+      });
+
+      it('should have inputs', () => {
         const stateResource: StateResource<unknown> = createEmptyStateResource();
         component.deleteStateResource = stateResource;
 
         fixture.detectChanges();
 
-        const button: ButtonWithSpinnerComponent = getDebugElementFromFixtureByCss(fixture, deleteButton).componentInstance;
-        expect(button._stateResource).toBe(stateResource);
+        const button: ButtonWithSpinnerComponent = getElementComponentFromFixtureByCss(fixture, deleteButton);
+        expect(button.stateResource).toBe(stateResource);
       });
 
       it('should emit delete on click', () => {
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
index 9d8e8f4bd9..ac39d47d8c 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
@@ -1,12 +1,13 @@
 import { StateResource } from '@alfa-client/tech-shared';
 import { Component, EventEmitter, Input, Output } from '@angular/core';
 import { ButtonWithSpinnerComponent } from '@ods/component';
+import { ButtonComponent } from '@ods/system';
 
 @Component({
   selector: 'admin-organisations-einheit-delete-dialog',
   standalone: true,
   templateUrl: './organisations-einheit-delete-dialog.component.html',
-  imports: [ButtonWithSpinnerComponent],
+  imports: [ButtonWithSpinnerComponent, ButtonComponent],
 })
 export class OrganisationsEinheitDeleteDialogComponent {
   @Input() organisationsEinheitName: string;
-- 
GitLab


From 8de3618f76fbad39a0b2ef2e8c4e5f100993624a Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Fri, 28 Feb 2025 12:15:42 +0100
Subject: [PATCH 10/18] OZG-7507 add empty lines

---
 .../organisations-einheit-delete-dialog.component.ts             | 1 +
 1 file changed, 1 insertion(+)

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
index ac39d47d8c..fed45f5109 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
@@ -12,6 +12,7 @@ import { ButtonComponent } from '@ods/system';
 export class OrganisationsEinheitDeleteDialogComponent {
   @Input() organisationsEinheitName: string;
   @Input() deleteStateResource: StateResource<unknown>;
+
   @Output() cancel: EventEmitter<void> = new EventEmitter<void>();
   @Output() delete: EventEmitter<void> = new EventEmitter<void>();
 }
-- 
GitLab


From 6b86812cbf18cba7a1b09a4a8d7af8422cf276af Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Fri, 28 Feb 2025 12:26:23 +0100
Subject: [PATCH 11/18] OZG-7507 remove unknown type

---
 .../src/lib/keycloak.resource.service.ts              |  2 +-
 ...-einheit-delete-dialog-container.component.spec.ts | 10 +++++-----
 ...tions-einheit-delete-dialog-container.component.ts | 11 ++++++-----
 ...anisations-einheit-delete-dialog.component.spec.ts |  2 +-
 .../organisations-einheit-delete-dialog.component.ts  |  2 +-
 5 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.resource.service.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.resource.service.ts
index 572761923b..3cd3bdc24a 100644
--- a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.resource.service.ts
+++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.resource.service.ts
@@ -65,7 +65,7 @@ export abstract class KeycloakResourceService<T> {
 
   protected abstract _saveInKeycloak(item: T): Observable<T>;
 
-  public delete(id: string): Observable<StateResource<unknown>> {
+  public delete(id: string): Observable<StateResource<void>> {
     return this.handleLoading(this._deleteInKeycloak(id));
   }
 
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
index a61b437b5e..fad1b24d54 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts
@@ -51,7 +51,7 @@ describe('OrganisationsEinheitDeleteDialogContainerComponent', () => {
   describe('template', () => {
     describe('organisations einheit delete dialog', () => {
       it('should exist', () => {
-        const stateResource: StateResource<unknown> = createEmptyStateResource();
+        const stateResource: StateResource<void> = createEmptyStateResource();
         component.deleteStateResource$ = of(stateResource);
         component.organisationsEinheitName = dialogData.organisationsEinheitName;
 
@@ -104,10 +104,10 @@ describe('OrganisationsEinheitDeleteDialogContainerComponent', () => {
     });
 
     describe('delete', () => {
-      const stateResource: StateResource<unknown> = createEmptyStateResource();
-      const stateResource$: Observable<StateResource<unknown>> = of(stateResource);
-      const loadingStateResource: StateResource<unknown> = createEmptyStateResource(true);
-      const loadingStateResource$: Observable<StateResource<unknown>> = of(loadingStateResource);
+      const stateResource: StateResource<void> = createEmptyStateResource();
+      const stateResource$: Observable<StateResource<void>> = of(stateResource);
+      const loadingStateResource: StateResource<void> = createEmptyStateResource(true);
+      const loadingStateResource$: Observable<StateResource<void>> = of(loadingStateResource);
 
       beforeEach(() => {
         organisationsEinheitService.delete.mockReturnValue(stateResource$);
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
index c870025c8a..256610e511 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
@@ -31,19 +31,20 @@ export class OrganisationsEinheitDeleteDialogContainerComponent {
     this.organisationsEinheitId = this.dialogData.organisationsEinheitId;
   }
 
-  public deleteStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource());
+  public deleteStateResource$: Observable<StateResource<void>> = of(createEmptyStateResource<void>());
 
   public closeDialog(): void {
     this.dialogService.closeAll();
   }
 
   public delete(): void {
-    this.deleteStateResource$ = this.organisationsEinheitService
-      .delete(this.organisationsEinheitId)
-      .pipe(tap((stateResource: StateResource<unknown>) => this.closeDialogOnDeleteDone(stateResource)));
+    this.deleteStateResource$ = this.organisationsEinheitService.delete(this.organisationsEinheitId).pipe(
+      tap(console.info),
+      tap((stateResource: StateResource<void>) => this.closeDialogOnDeleteDone(stateResource)),
+    );
   }
 
-  private closeDialogOnDeleteDone(stateResource: StateResource<unknown>): void {
+  private closeDialogOnDeleteDone(stateResource: StateResource<void>): void {
     if (isNotLoading(stateResource)) {
       this.dialogService.closeAll();
     }
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
index dc175e5e96..5099b902cc 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts
@@ -58,7 +58,7 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => {
       });
 
       it('should have inputs', () => {
-        const stateResource: StateResource<unknown> = createEmptyStateResource();
+        const stateResource: StateResource<void> = createEmptyStateResource();
         component.deleteStateResource = stateResource;
 
         fixture.detectChanges();
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
index fed45f5109..bf433fea87 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts
@@ -11,7 +11,7 @@ import { ButtonComponent } from '@ods/system';
 })
 export class OrganisationsEinheitDeleteDialogComponent {
   @Input() organisationsEinheitName: string;
-  @Input() deleteStateResource: StateResource<unknown>;
+  @Input() deleteStateResource: StateResource<void>;
 
   @Output() cancel: EventEmitter<void> = new EventEmitter<void>();
   @Output() delete: EventEmitter<void> = new EventEmitter<void>();
-- 
GitLab


From 994eadc5fbca651892da91454981ed88ab1ed4dc Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Fri, 28 Feb 2025 12:28:13 +0100
Subject: [PATCH 12/18] OZG-7507 move interface to model

---
 .../src/lib/organisations-einheit.model.ts             |  5 +++++
 ...ations-einheit-delete-dialog-container.component.ts | 10 ++++------
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.model.ts b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.model.ts
index 3a93c42e6b..5fac205bca 100644
--- a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.model.ts
+++ b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.model.ts
@@ -26,3 +26,8 @@ export interface AdminOrganisationsEinheit {
   name: string;
   attributes: { [key: string]: string[] };
 }
+
+export interface OrganisationsEinheitDeleteDialogData {
+  organisationsEinheitName: string;
+  organisationsEinheitId: string;
+}
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
index 256610e511..5ad4b5ec78 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts
@@ -1,4 +1,7 @@
-import { AdminOrganisationsEinheitService } from '@admin-client/organisations-einheit-shared';
+import {
+  AdminOrganisationsEinheitService,
+  OrganisationsEinheitDeleteDialogData,
+} from '@admin-client/organisations-einheit-shared';
 import { createEmptyStateResource, isNotLoading, StateResource } from '@alfa-client/tech-shared';
 import { OzgcloudDialogService } from '@alfa-client/ui';
 import { DIALOG_DATA } from '@angular/cdk/dialog';
@@ -7,11 +10,6 @@ import { Component, inject } from '@angular/core';
 import { Observable, of, tap } from 'rxjs';
 import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component';
 
-export interface OrganisationsEinheitDeleteDialogData {
-  organisationsEinheitName: string;
-  organisationsEinheitId: string;
-}
-
 @Component({
   selector: 'admin-organisations-einheit-delete-dialog-container',
   standalone: true,
-- 
GitLab


From a915b3b20e533f824f9df1a82ed1d02323c532b2 Mon Sep 17 00:00:00 2001
From: Alexander Reifschneider <alexander.reifschneider@mgm-tp.com>
Date: Fri, 28 Feb 2025 13:55:06 +0100
Subject: [PATCH 13/18] OZG-7507 Add missing style

---
 .../organisations-einheit-list.component.html                   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
index a990131625..cb289ca1d9 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
@@ -26,7 +26,7 @@
 <ods-list data-test-id="organisations-einheit-list">
   @for (organisationsEinheit of organisationsEinheitList; track $index) {
     <ods-list-item [attr.data-test-id]="(organisationsEinheit.name | convertForDataTest) + '-organisation-item'">
-      <div class="space-between flex w-full">
+      <div class="space-between flex w-full items-center">
         <dl class="flex-1 basis-3/4 font-semibold">
           <dt class="sr-only">Name</dt>
           <dd data-test-id="organisations-einheit-name">{{ organisationsEinheit.name }}</dd>
-- 
GitLab


From d42d528d418ef5cdf6acf91a2784f47082a19d7d Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Fri, 28 Feb 2025 14:36:14 +0100
Subject: [PATCH 14/18] OZG-7507 fix unit test

Merge conflict error.
---
 .../src/lib/open-dialog-button/open-dialog-button.component.ts  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
index cb85d5517d..59a024a94b 100644
--- a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
+++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
@@ -38,7 +38,7 @@ export class OpenDialogButtonComponent {
   @Input() size: ButtonVariants['size'];
 
   public open(): void {
-    this.dialogService.openInContext(this._createComponent().instance.constructor, this.viewContainerRef);
+    this.dialogService.openInContext(this._createComponent().instance.constructor, this.viewContainerRef, this.dialogData);
   }
 
   _createComponent(): ComponentRef<any> {
-- 
GitLab


From 3a1a3fd1160283862dc780990941da83fe5530a0 Mon Sep 17 00:00:00 2001
From: Martin <git@mail.de>
Date: Fri, 28 Feb 2025 15:32:43 +0100
Subject: [PATCH 15/18] OZG-7507 add data-test-class to components

---
 .../src/lib/open-dialog-button/open-dialog-button.component.ts  | 2 ++
 .../libs/design-system/src/lib/button/button.component.ts       | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
index 833c45112b..ae0e20c3b0 100644
--- a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
+++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
@@ -16,6 +16,7 @@ import { first } from 'rxjs';
     [text]="label"
     [size]="size"
     [dataTestId]="dataTestId"
+    [dataTestClass]="dataTestClass"
     data-test-id="open-dialog"
   >
     <ng-container icon>
@@ -34,6 +35,7 @@ export class OpenDialogButtonComponent {
 
   @Input() label: string;
   @Input() dataTestId: string;
+  @Input() dataTestClass: string;
   @Input() variant: ButtonVariants['variant'] = 'primary';
   @Input() dialogData: any;
   @Input() size: ButtonVariants['size'];
diff --git a/alfa-client/libs/design-system/src/lib/button/button.component.ts b/alfa-client/libs/design-system/src/lib/button/button.component.ts
index c0f7892c3c..47e76172ad 100644
--- a/alfa-client/libs/design-system/src/lib/button/button.component.ts
+++ b/alfa-client/libs/design-system/src/lib/button/button.component.ts
@@ -96,6 +96,7 @@ export type ButtonVariants = VariantProps<typeof buttonVariants>;
     [attr.aria-disabled]="isDisabled"
     [attr.aria-label]="text"
     [attr.data-test-id]="dataTestId"
+    [attr.data-test-class]="dataTestClass"
     (click)="clickEmitter.emit()"
   >
     <ng-content *ngIf="!isLoading" select="[icon]"></ng-content>
@@ -106,6 +107,7 @@ export type ButtonVariants = VariantProps<typeof buttonVariants>;
 export class ButtonComponent {
   @Input() text: string = '';
   @Input() dataTestId: string = '';
+  @Input() dataTestClass: string = '';
   @Input() disabled: boolean = false;
   @Input() isLoading: boolean = false;
   @Input({ transform: booleanAttribute }) destructive: boolean = false;
-- 
GitLab


From 2977c4fed5dfe02d6f9c847b23182ca016f8d327 Mon Sep 17 00:00:00 2001
From: Martin <git@mail.de>
Date: Fri, 28 Feb 2025 15:33:31 +0100
Subject: [PATCH 16/18] OZG-7507 adjust component data-test-id and test

---
 .../organisations-einheit-list.component.html              | 3 ++-
 .../organisations-einheit-list.component.spec.ts           | 4 ++--
 alfa-client/libs/tech-shared/test/data-test.ts             | 7 +++----
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
index a990131625..b09ebf9501 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html
@@ -35,7 +35,8 @@
           [tooltip]="'Organisationseinheit löschen'"
           variant="ghost"
           size="fit"
-          dataTestId="delete-button"
+          dataTestClass="delete-button"
+          data-test-id="delete-organisations-einheit-dialog-button"
           [dialogData]="{ organisationsEinheitName: organisationsEinheit.name, organisationsEinheitId: organisationsEinheit.id }"
         >
           <ods-delete-icon icon />
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
index 75e0c4dd8e..c016c3c9c8 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
@@ -29,7 +29,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ActivatedRoute } from '@angular/router';
 import { OpenDialogButtonComponent } from '@ods/component';
 import { ExclamationIconComponent, ListComponent, ListItemComponent } from '@ods/system';
-import { getConvertedDataTestIdOf, getDataTestIdAttributeOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { getConvertedDataTestIdOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
 import { createAdminOrganisationsEinheit } from '../../../../../organisations-einheit-shared/src/test/organisations-einheit';
 import { OrganisationsEinheitListComponent } from './organisations-einheit-list.component';
@@ -40,7 +40,7 @@ describe('OrganisationsEinheitListComponent', () => {
 
   const listSelector: string = getDataTestIdOf('organisations-einheit-list');
   const listItemSuffux: string = '-organisation-item';
-  const deleteButtonTestId: string = getDataTestIdAttributeOf('delete-button');
+  const deleteButtonTestId: string = getDataTestIdOf('delete-organisations-einheit-dialog-button');
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
diff --git a/alfa-client/libs/tech-shared/test/data-test.ts b/alfa-client/libs/tech-shared/test/data-test.ts
index 795b2dee30..c4fbe01458 100644
--- a/alfa-client/libs/tech-shared/test/data-test.ts
+++ b/alfa-client/libs/tech-shared/test/data-test.ts
@@ -35,10 +35,9 @@ export function getDataTestIdOf(value: string): string {
   return `[data-test-id="${value}"]`;
 }
 
+/**
+ * @deprecated use getDataTestIfOf instead and a direct data-test-id at the component
+ */
 export function getDataTestIdAttributeOf(value: string): string {
   return `[dataTestId="${value}"]`;
 }
-
-export function getDynamicDataTestIdAttributOf(value: string): string {
-  return `[ng-reflect-data-test-id="${value}"]`;
-}
-- 
GitLab


From e3729e3d58a65b75c412d3a0089292ea8fae53f6 Mon Sep 17 00:00:00 2001
From: Martin <git@mail.de>
Date: Fri, 28 Feb 2025 15:34:18 +0100
Subject: [PATCH 17/18] OZG-7507 create delete organisationsEinheit E2E Test;
 adjust test component structure

---
 .../organisationseinheiten.e2e.component.ts   | 49 ++++++++++++---
 .../organisations-einheit.cy.ts               | 53 ++++++++++++++++
 .../organisations-einheiten-page.cy.ts        | 61 +++++++++++++++++++
 .../organisationseinheiten-hinzufuegen.cy.ts  | 48 ---------------
 .../organisationseinheiten-laden.cy.ts        | 56 -----------------
 .../organisations-einheit.executor.ts         | 34 +++++++++++
 .../organisations-einheit.helper.ts           | 19 ++++++
 .../organisations-einheit.navigator.ts        | 21 +++++++
 .../organisations-einheit.verifier.ts         | 17 ++++++
 .../src/model/organisations-einheit.ts        |  4 +-
 .../admin-e2e/src/page-objects/header.po.ts   |  4 +-
 .../admin-e2e/src/page-objects/login.po.ts    |  1 +
 .../page-objects/organisations-einheit.po.ts  | 14 +++++
 13 files changed, 265 insertions(+), 116 deletions(-)
 create mode 100644 alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheit.cy.ts
 create mode 100644 alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheiten-page.cy.ts
 delete mode 100644 alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-hinzufuegen.cy.ts
 delete mode 100644 alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-laden.cy.ts
 create mode 100644 alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.executor.ts
 create mode 100644 alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper.ts
 create mode 100644 alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.navigator.ts
 create mode 100644 alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.verifier.ts
 create mode 100644 alfa-client/apps/admin-e2e/src/page-objects/organisations-einheit.po.ts

diff --git a/alfa-client/apps/admin-e2e/src/components/organisationseinheiten/organisationseinheiten.e2e.component.ts b/alfa-client/apps/admin-e2e/src/components/organisationseinheiten/organisationseinheiten.e2e.component.ts
index bfdf6b624d..ac3917c2dd 100644
--- a/alfa-client/apps/admin-e2e/src/components/organisationseinheiten/organisationseinheiten.e2e.component.ts
+++ b/alfa-client/apps/admin-e2e/src/components/organisationseinheiten/organisationseinheiten.e2e.component.ts
@@ -21,21 +21,52 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+export class OrganisationsEinheitListE2EComponent {
+  private readonly root: string = 'organisations-einheit-list';
+
+  public getRoot(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.root);
+  }
+
+  public getListItem(name: string): OrganisationsEinheitListItemE2EComponent {
+    return new OrganisationsEinheitListItemE2EComponent(name);
+  }
+}
+
+export class OrganisationsEinheitListItemE2EComponent {
+  private root: string;
 
-export class OrganisationsEinheitenE2EComponent {
-  private readonly organisationsEinheitenList: string = 'organisations-einheit-list';
-  private readonly organisationsEinheitHinzufuegen: string = 'add-organisationseinheit-button';
   private readonly organisationsEinheitItemSuffix: string = '-organisation-item';
+  private readonly deleteButton: string = 'delete-button';
+
+  constructor(name: string) {
+    this.root = name;
+  }
+
+  public getRoot(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.root + this.organisationsEinheitItemSuffix);
+  }
+
+  public getDeleteButton(): Cypress.Chainable<Element> {
+    return this.getRoot().findTestElementWithClass(this.deleteButton);
+  }
+}
+
+export class OrganisationsEinheitDeleteDialogE2EComponent {
+  private readonly root: string = 'organisations-einheit-delete-dialog';
+
+  private readonly deleteButton: string = 'dialog-delete-button';
+  private readonly cancelButton: string = 'dialog-cancel-button';
 
-  public getOrganisationsEinheitList(): Cypress.Chainable<Element> {
-    return cy.getTestElement(this.organisationsEinheitenList);
+  public getRoot(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.root);
   }
 
-  public getOrganisationsEinheitHinzufuegenButton(): Cypress.Chainable<Element> {
-    return cy.getTestElement(this.organisationsEinheitHinzufuegen);
+  public getDeleteButton(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.deleteButton);
   }
 
-  public getListItem(name: string) {
-    return cy.getTestElement(name + this.organisationsEinheitItemSuffix);
+  public getCancelButton(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.cancelButton);
   }
 }
diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheit.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheit.cy.ts
new file mode 100644
index 0000000000..2f52b48806
--- /dev/null
+++ b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheit.cy.ts
@@ -0,0 +1,53 @@
+import { E2EOrganisationsEinheitHelper } from 'apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper';
+import { E2EOrganisationsEinheitVerifier } from 'apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.verifier';
+import { OrganisationsEinheitPage } from 'apps/admin-e2e/src/page-objects/organisations-einheit.po';
+import { ZustaendigeStelleDialogE2EComponent } from '../../../components/zustaendige-stelle/zustaendige-stelle-dialog.e2e.component';
+import { exist } from '../../../support/cypress.util';
+import { loginAsAriane } from '../../../support/user-util';
+
+describe('Organisationseinheit', () => {
+  const organisationsEinheitPage: OrganisationsEinheitPage = new OrganisationsEinheitPage();
+
+  const organisationsEinheitHelper: E2EOrganisationsEinheitHelper = new E2EOrganisationsEinheitHelper();
+  const organisationsEinheitVerifier: E2EOrganisationsEinheitVerifier = new E2EOrganisationsEinheitVerifier();
+
+  const zustaendigeStelleSearchComponent: ZustaendigeStelleDialogE2EComponent = new ZustaendigeStelleDialogE2EComponent();
+
+  const organisationsEinheit: string = 'Wasserwerk - Hamburg Wasser - Hamburger Stadtentwässerung';
+
+  before(() => {
+    loginAsAriane();
+  });
+
+  describe('hinzufügen', () => {
+    it('should show search dialog on add button click', () => {
+      organisationsEinheitHelper.openOrganisationsEinheitPage();
+
+      organisationsEinheitPage.getAddButton().click();
+
+      exist(zustaendigeStelleSearchComponent.getZustaendigeStelleForm());
+    });
+
+    it('should find at least one organisationseinheit on search', () => {
+      zustaendigeStelleSearchComponent.enterSearchTerm(organisationsEinheit);
+
+      zustaendigeStelleSearchComponent.expectNumberOfEntriesToBeGreaterThan(1);
+    });
+
+    it('should show organisationseinheit in list', () => {
+      organisationsEinheitHelper.addOrganisationsEinheit(organisationsEinheit);
+
+      organisationsEinheitVerifier.verifyOrganisationsEinheitInList(organisationsEinheit);
+    });
+  });
+
+  describe('löschen', () => {
+    it('should not show entry in list', () => {
+      organisationsEinheitHelper.openOrganisationsEinheitPage();
+
+      organisationsEinheitHelper.deleteOrganisationsEinheit(organisationsEinheit);
+
+      organisationsEinheitVerifier.verifyOrganisationsEinheitNotInList(organisationsEinheit);
+    });
+  });
+});
diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheiten-page.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheiten-page.cy.ts
new file mode 100644
index 0000000000..c17724c86b
--- /dev/null
+++ b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheiten-page.cy.ts
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+import { OrganisationsEinheitListE2EComponent } from 'apps/admin-e2e/src/components/organisationseinheiten/organisationseinheiten.e2e.component';
+import { E2EOrganisationsEinheitHelper } from 'apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper';
+import { OrganisationsEinheitE2E } from 'apps/admin-e2e/src/model/organisations-einheit';
+import { OrganisationsEinheitPage } from 'apps/admin-e2e/src/page-objects/organisations-einheit.po';
+import { exist } from '../../../support/cypress.util';
+import { loginAsAriane } from '../../../support/user-util';
+
+describe('Organisationsheiten page', () => {
+  const organisationsEinheitPage: OrganisationsEinheitPage = new OrganisationsEinheitPage();
+
+  const organisationsEinheitHelper: E2EOrganisationsEinheitHelper = new E2EOrganisationsEinheitHelper();
+
+  const organisationsEinheitList: OrganisationsEinheitListE2EComponent = new OrganisationsEinheitListE2EComponent();
+
+  before(() => {
+    loginAsAriane();
+  });
+
+  it('should show list', () => {
+    organisationsEinheitHelper.openOrganisationsEinheitPage();
+
+    exist(organisationsEinheitPage.getList().getRoot());
+  });
+
+  it('should show add button', () => {
+    organisationsEinheitHelper.openOrganisationsEinheitPage();
+
+    exist(organisationsEinheitPage.getAddButton());
+  });
+
+  it('should show default (Bauamt, Fundstelle, Denkmalpflege) entries', () => {
+    organisationsEinheitHelper.openOrganisationsEinheitPage();
+
+    exist(organisationsEinheitList.getListItem(OrganisationsEinheitE2E.BAUAMT).getRoot());
+    exist(organisationsEinheitList.getListItem(OrganisationsEinheitE2E.FUNDSTELLE).getRoot());
+    exist(organisationsEinheitList.getListItem(OrganisationsEinheitE2E.DENKMALPFLEGE).getRoot());
+  });
+});
diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-hinzufuegen.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-hinzufuegen.cy.ts
deleted file mode 100644
index c88d54bf3d..0000000000
--- a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-hinzufuegen.cy.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { convertToDataTestId } from 'apps/admin-e2e/src/support/tech-util';
-import { OrganisationsEinheitenE2EComponent } from '../../../components/organisationseinheiten/organisationseinheiten.e2e.component';
-import { ZustaendigeStelleDialogE2EComponent } from '../../../components/zustaendige-stelle/zustaendige-stelle-dialog.e2e.component';
-import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
-import { exist } from '../../../support/cypress.util';
-import { loginAsAriane } from '../../../support/user-util';
-
-describe('Organisationseinheiten', () => {
-  const mainPage: MainPage = new MainPage();
-  const organisationsEinheitenComponent: OrganisationsEinheitenE2EComponent = new OrganisationsEinheitenE2EComponent();
-  const zustaendigeStelleSearchComponent: ZustaendigeStelleDialogE2EComponent = new ZustaendigeStelleDialogE2EComponent();
-
-  const searchTerm: string = 'Hamburg';
-
-  before(() => {
-    loginAsAriane();
-  });
-
-  it('should show table with Organisationseinheiten', () => {
-    waitForSpinnerToDisappear();
-    mainPage.clickOrganisationsEinheitenNavigationItem();
-
-    exist(organisationsEinheitenComponent.getOrganisationsEinheitHinzufuegenButton());
-  });
-
-  it('should show button to add Organisationseinheit', () => {
-    exist(organisationsEinheitenComponent.getOrganisationsEinheitHinzufuegenButton());
-  });
-
-  it('should show search Organisationseinheit dialog', () => {
-    organisationsEinheitenComponent.getOrganisationsEinheitHinzufuegenButton().click();
-
-    exist(zustaendigeStelleSearchComponent.getZustaendigeStelleForm());
-  });
-
-  it('should find at least one Organisationseinheit', () => {
-    zustaendigeStelleSearchComponent.enterSearchTerm(searchTerm);
-
-    zustaendigeStelleSearchComponent.expectNumberOfEntriesToBeGreaterThan(1);
-  });
-
-  it('should add first Organisationseinheit', () => {
-    zustaendigeStelleSearchComponent.getZustaendigeStelleTitle(0).then((name: string) => {
-      zustaendigeStelleSearchComponent.clickFoundItem(0);
-      exist(organisationsEinheitenComponent.getListItem(convertToDataTestId(name)));
-    });
-  });
-});
diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-laden.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-laden.cy.ts
deleted file mode 100644
index 2b8eaeb70a..0000000000
--- a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-laden.cy.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-import { OrganisationsEinheitenE2EComponent } from '../../../components/organisationseinheiten/organisationseinheiten.e2e.component';
-import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
-import { exist } from '../../../support/cypress.util';
-import { loginAsAriane } from '../../../support/user-util';
-
-describe('Organisationsheiten list', () => {
-  const mainPage: MainPage = new MainPage();
-  const organisationsEinheitenTab: OrganisationsEinheitenE2EComponent = new OrganisationsEinheitenE2EComponent();
-
-  before(() => {
-    loginAsAriane();
-  });
-
-  it('should show Organisationseinheiten list', () => {
-    waitForSpinnerToDisappear();
-    mainPage.clickOrganisationsEinheitenNavigationItem();
-    waitForSpinnerToDisappear();
-
-    exist(organisationsEinheitenTab.getOrganisationsEinheitList());
-  });
-
-  it('should show entry for Bauamt', () => {
-    exist(organisationsEinheitenTab.getListItem('Bauamt'));
-  });
-
-  it('should show entry for Fundstelle', () => {
-    exist(organisationsEinheitenTab.getListItem('Fundstelle'));
-  });
-
-  it('should show entry for Denkmalpflege', () => {
-    exist(organisationsEinheitenTab.getListItem('Denkmalpflege'));
-  });
-});
diff --git a/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.executor.ts b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.executor.ts
new file mode 100644
index 0000000000..a89ad1f958
--- /dev/null
+++ b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.executor.ts
@@ -0,0 +1,34 @@
+import {
+  OrganisationsEinheitDeleteDialogE2EComponent,
+  OrganisationsEinheitListE2EComponent,
+} from '../../components/organisationseinheiten/organisationseinheiten.e2e.component';
+import { ZustaendigeStelleDialogE2EComponent } from '../../components/zustaendige-stelle/zustaendige-stelle-dialog.e2e.component';
+import { OrganisationsEinheitPage } from '../../page-objects/organisations-einheit.po';
+import { exist } from '../../support/cypress.util';
+import { convertToDataTestId } from '../../support/tech-util';
+
+export class E2EOrganisationsEinheitExecutor {
+  private readonly organisationsEinheitPage: OrganisationsEinheitPage = new OrganisationsEinheitPage();
+  private readonly organisationsEinheitList: OrganisationsEinheitListE2EComponent = this.organisationsEinheitPage.getList();
+
+  private readonly deleteDialog: OrganisationsEinheitDeleteDialogE2EComponent =
+    new OrganisationsEinheitDeleteDialogE2EComponent();
+
+  private readonly zustaendigeStelleSearchComponent: ZustaendigeStelleDialogE2EComponent =
+    new ZustaendigeStelleDialogE2EComponent();
+
+  public addOrganisationsEinheit(name: string): void {
+    //TODO von index auf Name umstellen
+    this.zustaendigeStelleSearchComponent
+      .getZustaendigeStelleTitle(0)
+      .then((name: string) => this.zustaendigeStelleSearchComponent.clickFoundItem(0));
+    exist(this.organisationsEinheitList.getRoot());
+  }
+
+  public deleteOrganisationsEinheit(name: string): void {
+    this.organisationsEinheitList.getListItem(convertToDataTestId(name)).getDeleteButton().click();
+    exist(this.deleteDialog.getRoot());
+    this.deleteDialog.getDeleteButton().click();
+    exist(this.organisationsEinheitList.getRoot());
+  }
+}
diff --git a/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper.ts b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper.ts
new file mode 100644
index 0000000000..339793cde8
--- /dev/null
+++ b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper.ts
@@ -0,0 +1,19 @@
+import { E2EOrganisationsEinheitExecutor } from './organisations-einheit.executor';
+import { E2EOrganisationsEinheitNavigator } from './organisations-einheit.navigator';
+
+export class E2EOrganisationsEinheitHelper {
+  private readonly navigator: E2EOrganisationsEinheitNavigator = new E2EOrganisationsEinheitNavigator();
+  private readonly executor: E2EOrganisationsEinheitExecutor = new E2EOrganisationsEinheitExecutor();
+
+  public openOrganisationsEinheitPage(): void {
+    this.navigator.openOrganisationsEinheitListPage();
+  }
+
+  public addOrganisationsEinheit(name: string): void {
+    this.executor.addOrganisationsEinheit(name);
+  }
+
+  public deleteOrganisationsEinheit(name: string): void {
+    this.executor.deleteOrganisationsEinheit(name);
+  }
+}
diff --git a/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.navigator.ts b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.navigator.ts
new file mode 100644
index 0000000000..6274ee80d4
--- /dev/null
+++ b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.navigator.ts
@@ -0,0 +1,21 @@
+import { OrganisationsEinheitListE2EComponent } from '../../components/organisationseinheiten/organisationseinheiten.e2e.component';
+import { MainPage } from '../../page-objects/main.po';
+import { OrganisationsEinheitPage } from '../../page-objects/organisations-einheit.po';
+import { exist } from '../../support/cypress.util';
+
+export class E2EOrganisationsEinheitNavigator {
+  private readonly mainPage: MainPage = new MainPage();
+
+  private readonly organisationsEinheitPage: OrganisationsEinheitPage = new OrganisationsEinheitPage();
+  private readonly organisationsEinheitList: OrganisationsEinheitListE2EComponent = this.organisationsEinheitPage.getList();
+
+  public openOrganisationsEinheitListPage(): void {
+    this.navigateToDomain();
+    this.mainPage.getOrganisationEinheitNavigationItem().click();
+    exist(this.organisationsEinheitList.getRoot());
+  }
+
+  private navigateToDomain(): void {
+    this.mainPage.getHeader().getLogo().click();
+  }
+}
diff --git a/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.verifier.ts b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.verifier.ts
new file mode 100644
index 0000000000..cb1b430216
--- /dev/null
+++ b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.verifier.ts
@@ -0,0 +1,17 @@
+import { OrganisationsEinheitListE2EComponent } from '../../components/organisationseinheiten/organisationseinheiten.e2e.component';
+import { OrganisationsEinheitPage } from '../../page-objects/organisations-einheit.po';
+import { exist, notExist } from '../../support/cypress.util';
+import { convertToDataTestId } from '../../support/tech-util';
+
+export class E2EOrganisationsEinheitVerifier {
+  private readonly organisationsEinheitPage: OrganisationsEinheitPage = new OrganisationsEinheitPage();
+  private readonly organisationsEinheitList: OrganisationsEinheitListE2EComponent = this.organisationsEinheitPage.getList();
+
+  public verifyOrganisationsEinheitInList(name: string): void {
+    exist(this.organisationsEinheitList.getListItem(convertToDataTestId(name)).getRoot());
+  }
+
+  public verifyOrganisationsEinheitNotInList(name: string): void {
+    notExist(this.organisationsEinheitList.getListItem(convertToDataTestId(name)).getRoot());
+  }
+}
diff --git a/alfa-client/apps/admin-e2e/src/model/organisations-einheit.ts b/alfa-client/apps/admin-e2e/src/model/organisations-einheit.ts
index 9870f7e3f1..311c1bfd5c 100644
--- a/alfa-client/apps/admin-e2e/src/model/organisations-einheit.ts
+++ b/alfa-client/apps/admin-e2e/src/model/organisations-einheit.ts
@@ -1,5 +1,7 @@
 export enum OrganisationsEinheitE2E {
-  ORDNUNGSAMT = 'Ordnungsamt',
+  BAUAMT = 'Bauamt',
   DENKMALPFLEGE = 'Denkmalpflege',
+  FUNDSTELLE = 'Fundstelle',
+  ORDNUNGSAMT = 'Ordnungsamt',
   WIRTSCHAFTSFOERDERUNG = 'Wirtschaftsförderung',
 }
diff --git a/alfa-client/apps/admin-e2e/src/page-objects/header.po.ts b/alfa-client/apps/admin-e2e/src/page-objects/header.po.ts
index fb87e566ca..60fc24b0d4 100644
--- a/alfa-client/apps/admin-e2e/src/page-objects/header.po.ts
+++ b/alfa-client/apps/admin-e2e/src/page-objects/header.po.ts
@@ -24,13 +24,13 @@
 import { CurrentUserProfileE2EComponent } from '../components/user-profile/current-user-profile.component.e2e';
 import { UserSettingsE2EComponent } from '../components/user-settings/user-settings.component.e2e';
 
+//TODO Zu den Componenten packen, nicht zu den page-objects
 export class HeaderE2EComponent {
   private readonly locatorLogo: string = 'logo-link';
   private readonly locatorRoot: string = 'header';
 
   private readonly userSettings: UserSettingsE2EComponent = new UserSettingsE2EComponent();
-  private readonly currentUserProfile: CurrentUserProfileE2EComponent =
-    new CurrentUserProfileE2EComponent();
+  private readonly currentUserProfile: CurrentUserProfileE2EComponent = new CurrentUserProfileE2EComponent();
 
   public getRoot() {
     return cy.getTestElement(this.locatorRoot);
diff --git a/alfa-client/apps/admin-e2e/src/page-objects/login.po.ts b/alfa-client/apps/admin-e2e/src/page-objects/login.po.ts
index 73005caaf6..48a03c246c 100644
--- a/alfa-client/apps/admin-e2e/src/page-objects/login.po.ts
+++ b/alfa-client/apps/admin-e2e/src/page-objects/login.po.ts
@@ -1,3 +1,4 @@
+//TODO Das sollte eher eine Component als eine Page sein
 export class LoginPage {
   private readonly locatorLogin: string = '#kc-login';
   private readonly locatorBarrierefreiheitLink: string = '#kc-barrierefreiheit';
diff --git a/alfa-client/apps/admin-e2e/src/page-objects/organisations-einheit.po.ts b/alfa-client/apps/admin-e2e/src/page-objects/organisations-einheit.po.ts
new file mode 100644
index 0000000000..b37d9a9d3f
--- /dev/null
+++ b/alfa-client/apps/admin-e2e/src/page-objects/organisations-einheit.po.ts
@@ -0,0 +1,14 @@
+import { OrganisationsEinheitListE2EComponent } from '../components/organisationseinheiten/organisationseinheiten.e2e.component';
+
+export class OrganisationsEinheitPage {
+  private readonly addButton: string = 'add-organisationseinheit-button';
+  private readonly list: OrganisationsEinheitListE2EComponent = new OrganisationsEinheitListE2EComponent();
+
+  public getAddButton(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.addButton);
+  }
+
+  public getList(): OrganisationsEinheitListE2EComponent {
+    return this.list;
+  }
+}
-- 
GitLab


From 7e874d408edf1104733fce3b4844ad4f6993bcda Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Sat, 1 Mar 2025 16:58:32 +0100
Subject: [PATCH 18/18] OZG-7507 fix e2e test

---
 .../main-tests/app/user-profile-menu.cy.ts    | 11 +++++++-
 .../apps/admin-e2e/src/support/linkrels.ts    | 26 +++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 alfa-client/apps/admin-e2e/src/support/linkrels.ts

diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/app/user-profile-menu.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/app/user-profile-menu.cy.ts
index 80d2884a5b..19852a5277 100644
--- a/alfa-client/apps/admin-e2e/src/e2e/main-tests/app/user-profile-menu.cy.ts
+++ b/alfa-client/apps/admin-e2e/src/e2e/main-tests/app/user-profile-menu.cy.ts
@@ -21,19 +21,28 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { getUrl } from '@ngxp/rest';
+import { HttpMethodE2E } from '../../../model/util';
 import { HeaderE2EComponent } from '../../../page-objects/header.po';
 import { MainPage } from '../../../page-objects/main.po';
+import { getBaseUrl, intercept, waitOfInterceptor } from '../../../support/cypress-helper';
 import { exist, shouldHaveAttribute } from '../../../support/cypress.util';
+import { ApiRootLinkRelE2E } from '../../../support/linkrels';
 import { loginAsAriane } from '../../../support/user-util';
 
 describe('User Profile Menu', () => {
   const mainPage: MainPage = new MainPage();
   const header: HeaderE2EComponent = mainPage.getHeader();
 
-  const documentationLink: string = 'http://dummy-leitfaden.url';
+  let documentationLink: string = '';
 
   before(() => {
+    const interceptor: string = 'getApiRoot';
+    intercept(HttpMethodE2E.GET, `${getBaseUrl()}/api`).as(interceptor);
     loginAsAriane();
+    waitOfInterceptor(interceptor).then(
+      (interception) => (documentationLink = getUrl(interception?.response?.body, ApiRootLinkRelE2E.DOCUMENTATIONS)),
+    );
   });
 
   describe('open user profile menu', () => {
diff --git a/alfa-client/apps/admin-e2e/src/support/linkrels.ts b/alfa-client/apps/admin-e2e/src/support/linkrels.ts
new file mode 100644
index 0000000000..4891aa61e1
--- /dev/null
+++ b/alfa-client/apps/admin-e2e/src/support/linkrels.ts
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+export enum ApiRootLinkRelE2E {
+  DOCUMENTATIONS = 'documentations',
+}
-- 
GitLab