diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts index 865f904f83dbfd0ad22873ec8578531815b1c8dd..7cd0b9ff96f257d7e06ccdd68846796a083b056a 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts @@ -26,6 +26,7 @@ import { Injectable } from '@angular/core'; import { TestBed } from '@angular/core/testing'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { ActivatedRoute, UrlSegment } from '@angular/router'; +import { faker } from '@faker-js/faker/.'; import { createDummy, Dummy } from 'libs/tech-shared/test/dummy'; import { singleCold, singleHot } from 'libs/tech-shared/test/marbles'; import { createSpy, mock, Mock } from 'libs/test-utils/src/lib/mocking'; @@ -261,6 +262,19 @@ describe('KeycloakFormService', () => { expect(isInvalid).toBeTruthy(); }); }); + + describe('get id', () => { + const patchConfigId: string = faker.string.alphanumeric(); + const patchConfig: PatchConfig = { id: patchConfigId, doPatch: false }; + + it('should return id from patch config', () => { + service._patchConfig = patchConfig; + + const id: string = service.getId(); + + expect(id).toBe(patchConfigId); + }); + }); }); @Injectable() diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts index f0aae76ba36f97b4d3508ad517764a02b2b3b5f2..49a2e6c84e3fdbf69b22ca324ee0100a34ae6763 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts @@ -75,10 +75,6 @@ export abstract class KeycloakFormService<T> { abstract _doSubmit(): Observable<StateResource<T>>; - public delete(): Observable<StateResource<T>> { - return null; - } - _patch(valueToPatch: T): void { this.form.reset(); @@ -98,6 +94,10 @@ export abstract class KeycloakFormService<T> { public isInvalid(): boolean { return this.form.invalid; } + + public getId(): string { + return this._patchConfig.id; + } } export interface PatchConfig { diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.html deleted file mode 100644 index e180bccebc7c5139936430630b94d8b40fbe4f21..0000000000000000000000000000000000000000 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.html +++ /dev/null @@ -1,6 +0,0 @@ -<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/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.spec.ts deleted file mode 100644 index cc2b06b8107649c5e49586a99ce3a8d14cf7252f..0000000000000000000000000000000000000000 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { dispatchEventFromFixture, existsAsHtmlElement, Mock, mock } from '@alfa-client/test-utils'; -import { DialogService } from '@alfa-client/ui'; -import { ButtonWithSpinnerComponent } from '@ods/component'; -import { MockComponent } from 'ng-mocks'; -import { getDataTestIdAttributeOf } from '../../../../../../tech-shared/test/data-test'; -import { UserFormDeleteDialogContainerComponent } from '../user-form-delete-dialog-container/user-form-delete-dialog-container.component'; -import { UserFormDeleteButtonComponent } from './user-form-delete-button.component'; - -describe('UserFormDeleteButtonComponent', () => { - let component: UserFormDeleteButtonComponent; - let fixture: ComponentFixture<UserFormDeleteButtonComponent>; - - const deleteButton: string = getDataTestIdAttributeOf('delete-button'); - - let dialogService: Mock<DialogService>; - - beforeEach(async () => { - dialogService = mock(DialogService); - - await TestBed.configureTestingModule({ - imports: [UserFormDeleteButtonComponent], - declarations: [MockComponent(ButtonWithSpinnerComponent)], - providers: [{ provide: DialogService, useValue: dialogService }], - }).compileComponents(); - - fixture = TestBed.createComponent(UserFormDeleteButtonComponent); - 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(UserFormDeleteDialogContainerComponent); - }); - }); - }); - - 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/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.ts deleted file mode 100644 index 7cbef8bf523992dd16a0dd070b3650bdde11ca2e..0000000000000000000000000000000000000000 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { DialogService } from '@alfa-client/ui'; -import { Component, inject } from '@angular/core'; -import { ButtonWithSpinnerComponent } from '@ods/component'; -import { UserFormDeleteDialogContainerComponent } from '../user-form-delete-dialog-container/user-form-delete-dialog-container.component'; - -@Component({ - selector: 'admin-user-form-delete-button', - standalone: true, - imports: [ButtonWithSpinnerComponent], - templateUrl: './user-form-delete-button.component.html', -}) -export class UserFormDeleteButtonComponent { - private readonly dialogService = inject(DialogService); - - public openDeleteDialog(): void { - this.dialogService.openWidely(UserFormDeleteDialogContainerComponent); - } -} diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html index 2e2466e86c47be1080b899ed4d92277eb3cb0263..0bc050817641fda6d8b2bb0b253e073136590b61 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html @@ -1,7 +1,6 @@ <admin-user-form-delete-dialog - [username]="getUsername()" + [username]="formService.getUserName()" [deleteUserStateResource]="deleteUserStateResource$ | async" - (cancel)="closeDeleteDialog()" (delete)="deleteUser()" data-test-id="delete-dialog" -/> \ No newline at end of file +/> diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts index 5a25c702488c11df6a470fb68eb4ac9d139d134f..085218ad36f025930942f38789eaf8f7383a46a2 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts @@ -2,7 +2,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; import { dispatchEventFromFixture, getMockComponent, Mock, mock } from '@alfa-client/test-utils'; -import { FormControl } from '@angular/forms'; import { faker } from '@faker-js/faker/locale/de'; import { of } from 'rxjs'; import { getDataTestIdOf } from '../../../../../../tech-shared/test/data-test'; @@ -41,26 +40,17 @@ describe('UserFormDeleteDialogComponent', () => { }); describe('user form delete dialog', () => { - it('should exist', () => { + it('should be called', () => { const username: string = faker.word.sample(); - const state: StateResource<unknown> = createEmptyStateResource(); - component.getUsername = jest.fn().mockReturnValue(username); - component.deleteUserStateResource$ = of(state); + const stateResource: StateResource<unknown> = createEmptyStateResource(); + formService.getUserName = jest.fn().mockReturnValue(username); + component.deleteUserStateResource$ = of(stateResource); fixture.detectChanges(); const deleteDialog: UserFormDeleteDialogComponent = getMockComponent(fixture, UserFormDeleteDialogComponent); - expect(deleteDialog).toBeTruthy(); expect(deleteDialog.username).toBe(username); - expect(deleteDialog.deleteUserStateResource).toBe(state); - }); - - it('should call closeDeteleDialog on emit cancel', () => { - component.closeDeleteDialog = jest.fn(); - - dispatchEventFromFixture(fixture, 'admin-user-form-delete-dialog', 'cancel'); - - expect(component.closeDeleteDialog).toHaveBeenCalled(); + expect(deleteDialog.deleteUserStateResource).toBe(stateResource); }); it('should call deleteUser on emit delete', () => { @@ -71,46 +61,4 @@ describe('UserFormDeleteDialogComponent', () => { expect(component.deleteUser).toHaveBeenCalled(); }); }); - - describe('component', () => { - describe('getUsername', () => { - it('should return username', () => { - const username: string = faker.word.sample(); - jest.spyOn(formService.form as any, 'get').mockReturnValue(new FormControl(username)); - - const result: string = component.getUsername(); - - expect(result).toBe(username); - }); - }); - - describe('closeDeleteDialog', () => { - it('should call dialogService closeAll', () => { - component.dialogService.closeAll = jest.fn(); - - component.closeDeleteDialog(); - - expect(component.dialogService.closeAll).toHaveBeenCalled(); - }); - }); - - describe('deleteUser', () => { - it('should call userFormService delete ', () => { - formService.delete = jest.fn(); - - component.deleteUser(); - - expect(formService.delete).toHaveBeenCalled(); - }); - - it('should set deleteUserState', () => { - const state: StateResource<unknown> = createEmptyStateResource(); - formService.delete = jest.fn().mockReturnValue(state); - - component.deleteUser(); - - expect(component.deleteUserStateResource$).toBe(state); - }); - }); - }); }); diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts index b5ff2dc0d480b561a567f4639e876700d0358b26..3837d6fb96449fd7daa01b2123daed6896d789c3 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts @@ -1,5 +1,4 @@ import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; -import { DialogService } from '@alfa-client/ui'; import { AsyncPipe } from '@angular/common'; import { Component, inject } from '@angular/core'; import { Observable, of } from 'rxjs'; @@ -11,25 +10,14 @@ import { UserFormDeleteDialogComponent } from './user-form-delete-dialog/user-fo standalone: true, imports: [UserFormDeleteDialogComponent, AsyncPipe], templateUrl: './user-form-delete-dialog-container.component.html', - providers: [UserFormService], }) +//TODO Rename -> DeleteUserDialogContainerComponent export class UserFormDeleteDialogContainerComponent { public readonly formService = inject(UserFormService); - public readonly dialogService = inject(DialogService); public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource()); - protected readonly UserFormService = UserFormService; - - getUsername(): string { - return this.formService.form.get(UserFormService.USERNAME).value; - } - - public closeDeleteDialog(): void { - this.dialogService.closeAll(); - } - public deleteUser(): void { - this.deleteUserStateResource$ = this.formService.delete(); + //Implement me } } diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html index b261057d5fabafbec8e598d12dcd0b737dd89676..33e600ca06996f160ef265262bfba2a749e6a2c4 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html @@ -1,17 +1,13 @@ -<p>Sind Sie sicher, dass sie {{username}} löschen möchten? Hinweis: Die zugewiesenen Vorgänge bleiben bestehen.</p> +<p>Sind Sie sicher, dass sie {{ username }} löschen möchten? Hinweis: Die zugewiesenen Vorgänge bleiben bestehen.</p> <div class="flex justify-between"> - <ods-button-with-spinner - (clickEmitter)="cancel.emit()" - text="Abbrechen" - dataTestId="dialog-abbrechen-button" - /> - + <ods-cancel-dialog-button data-test-id="dialog-cancel-button-host" /> <ods-button-with-spinner [stateResource]="deleteUserStateResource" (clickEmitter)="delete.emit()" variant="outline" text="Löschen" - dataTestId="dialog-delete-button" + dataTestId="dialog-delete" + data-test-id="dialog-delete-button-host" /> -</div> \ No newline at end of file +</div> diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts index 1ca1f2ad8fff971770c45b30f98b433accfc31f3..0d9ab4a5d968a014fdbe8dfa0d9b0f0b3678b5c6 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts @@ -1,21 +1,22 @@ -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 { dispatchEventFromFixture, existsAsHtmlElement, getMockComponent, MockEvent } from '@alfa-client/test-utils'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ButtonWithSpinnerComponent, CancelDialogButtonComponent } from '@ods/component'; +import { MockComponent } from 'ng-mocks'; +import { getDataTestIdOf } from '../../../../../../../tech-shared/test/data-test'; import { UserFormDeleteDialogComponent } from './user-form-delete-dialog.component'; describe('UserFormDeleteDialogComponent', () => { let component: UserFormDeleteDialogComponent; let fixture: ComponentFixture<UserFormDeleteDialogComponent>; - const deleteButton: string = getDataTestIdAttributeOf('dialog-delete-button'); - const cancelButton: string = getDataTestIdAttributeOf('dialog-cancel-button'); + const deleteButton: string = getDataTestIdOf('dialog-delete-button-host'); + const cancelButton: string = getDataTestIdOf('dialog-cancel-button-host'); beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [UserFormDeleteDialogComponent, ButtonWithSpinnerComponent], + imports: [UserFormDeleteDialogComponent], + declarations: [MockComponent(CancelDialogButtonComponent), MockComponent(ButtonWithSpinnerComponent)], }).compileComponents(); fixture = TestBed.createComponent(UserFormDeleteDialogComponent); @@ -32,14 +33,6 @@ describe('UserFormDeleteDialogComponent', () => { 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', () => { @@ -49,14 +42,13 @@ describe('UserFormDeleteDialogComponent', () => { fixture.detectChanges(); - const button: ButtonWithSpinnerComponent = getDebugElementFromFixtureByCss(fixture, deleteButton).componentInstance; - expect(button._stateResource).toBe(stateResource); + expect(getMockComponent(fixture, ButtonWithSpinnerComponent).stateResource).toBe(stateResource); }); 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(); }); diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts index f48fe94e09e8bc6bcf9daef759ab22d6a85403c1..a5ca4d3f99253778536011b590ff06c3abeffe99 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts @@ -1,16 +1,16 @@ import { StateResource } from '@alfa-client/tech-shared'; import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { ButtonWithSpinnerComponent } from '@ods/component'; +import { ButtonWithSpinnerComponent, CancelDialogButtonComponent } from '@ods/component'; @Component({ selector: 'admin-user-form-delete-dialog', standalone: true, - imports: [ButtonWithSpinnerComponent], + imports: [ButtonWithSpinnerComponent, CancelDialogButtonComponent], templateUrl: './user-form-delete-dialog.component.html', }) export class UserFormDeleteDialogComponent { @Input() username: string; @Input() deleteUserStateResource: StateResource<unknown>; - @Output() cancel: EventEmitter<void> = new EventEmitter<void>(); + @Output() delete: EventEmitter<void> = new EventEmitter<void>(); } diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html index 944e7a1c13b0512ed9ef2a39f7471dbada63007d..2dd292b2672fc600b501d9d4385852fc90faf8a2 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html @@ -34,8 +34,8 @@ /> <div class="flex justify-between"> <admin-user-form-save-button /> - @if(formService.isPatch()){ - <admin-user-form-delete-button data-test-id="delete-button-host"/> + @if (formService.isPatch()) { + <ods-open-dialog-button label="Löschen" dataTestId="delete-user" data-test-id="delete-user-button-host" /> } </div> </div> diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts index 6d3e2413240c63953cfb608858fab4df2f8e9552..091b77f6ef1dc06a225827807b8f66c6f8535295 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts @@ -24,6 +24,7 @@ import { User } from '@admin-client/user-shared'; import { createEmptyStateResource, createStateResource, StateResource } from '@alfa-client/tech-shared'; import { existsAsHtmlElement, getMockComponent, mock, Mock, notExistsAsHtmlElement } from '@alfa-client/test-utils'; +import { DIALOG_COMPONENT } from '@alfa-client/ui'; import { CommonModule } from '@angular/common'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormGroup, ReactiveFormsModule } from '@angular/forms'; @@ -34,7 +35,6 @@ import { MockComponent } from 'ng-mocks'; import { of } from 'rxjs'; import { getDataTestIdOf } from '../../../../../tech-shared/test/data-test'; import { UserFormDataComponent } from './user-form-data/user-form-data.component'; -import { UserFormDeleteButtonComponent } from './user-form-delete-button/user-form-delete-button.component'; import { UserFormHeadlineComponent } from './user-form-headline/user-form-headline.component'; import { UserFormOrganisationsEinheitListComponent } from './user-form-organisations-einheit-list/user-form-organisations-einheit-list.component'; import { UserFormRolesComponent } from './user-form-roles/user-form-roles.component'; @@ -48,7 +48,7 @@ describe('UserFormComponent', () => { let formService: Mock<UserFormService>; const userContent: string = getDataTestIdOf('user-content'); - const deleteButton: string = getDataTestIdOf('delete-button-host'); + const deleteButton: string = getDataTestIdOf('delete-user-button-host'); beforeEach(async () => { formService = <any>{ @@ -68,8 +68,8 @@ describe('UserFormComponent', () => { MockComponent(UserFormOrganisationsEinheitListComponent), MockComponent(UserFormRolesComponent), MockComponent(UserFormHeadlineComponent), - MockComponent(UserFormDeleteButtonComponent), ], + providers: [{ provide: DIALOG_COMPONENT, useValue: {} }], }) .overrideComponent(UserFormComponent, { set: { diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts index d671aee05003b1b27f84bee9f03eeda63cf1f1b2..9fc048a1ff3e96fff626248ddbf0f0d03ac4b8ed 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts @@ -23,13 +23,14 @@ */ import { User } from '@admin-client/user-shared'; import { StateResource } from '@alfa-client/tech-shared'; +import { DIALOG_COMPONENT } from '@alfa-client/ui'; import { AsyncPipe } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { SpinnerComponent } from '@ods/component'; +import { OpenDialogButtonComponent, SpinnerComponent } from '@ods/component'; import { Observable } from 'rxjs'; import { UserFormDataComponent } from './user-form-data/user-form-data.component'; -import { UserFormDeleteButtonComponent } from './user-form-delete-button/user-form-delete-button.component'; +import { UserFormDeleteDialogContainerComponent } from './user-form-delete-dialog-container/user-form-delete-dialog-container.component'; import { UserFormHeadlineComponent } from './user-form-headline/user-form-headline.component'; import { UserFormOrganisationsEinheitListComponent } from './user-form-organisations-einheit-list/user-form-organisations-einheit-list.component'; import { UserFormRolesComponent } from './user-form-roles/user-form-roles.component'; @@ -38,7 +39,7 @@ import { UserFormService } from './user.formservice'; @Component({ selector: 'admin-user-form', - providers: [UserFormService], + providers: [UserFormService, { provide: DIALOG_COMPONENT, useValue: UserFormDeleteDialogContainerComponent }], templateUrl: './user-form.component.html', standalone: true, imports: [ @@ -51,7 +52,7 @@ import { UserFormService } from './user.formservice'; UserFormOrganisationsEinheitListComponent, UserFormHeadlineComponent, UserFormSaveButtonComponent, - UserFormDeleteButtonComponent, + OpenDialogButtonComponent, ], }) export class UserFormComponent implements OnInit { diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts index 8e823be03c1f064fe2cd152da724bb3e0fcdc001..a7d60371fbecc62f86d23f23171f47bc323dc4ca 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts @@ -30,7 +30,7 @@ import { createEmptyStateResource, createStateResource, EMPTY_ARRAY, StateResour import { Mock, mock } from '@alfa-client/test-utils'; import { SnackBarService } from '@alfa-client/ui'; import { fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { AbstractControl, FormControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { AbstractControl, FormControl, FormGroup, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { ActivatedRoute, UrlSegment } from '@angular/router'; import { faker } from '@faker-js/faker/locale/de'; import { cold } from 'jest-marbles'; @@ -45,6 +45,7 @@ import SpyInstance = jest.SpyInstance; describe('UserFormService', () => { let formService: UserFormService; + let roleGroup: UntypedFormGroup; let alfaGroup: UntypedFormGroup; let organisationsEinheitenGroup: UntypedFormGroup; @@ -456,4 +457,14 @@ describe('UserFormService', () => { expect(formService._initOrganisationsEinheiten$.unsubscribe).toHaveBeenCalled(); }); }); + + describe('get userName', () => { + it('should return form control value of userName', () => { + formService.form = new FormGroup({ [UserFormService.USERNAME]: new FormControl('userNameDummy') }); + + const userName: string = formService.getUserName(); + + expect(userName).toBe('userNameDummy'); + }); + }); }); diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts index e7e537b362cf5938842d80e3ededcf7297665b78..a456872659a6b1ebd15a0bb570080b5834069fdd 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts @@ -263,4 +263,8 @@ export class UserFormService extends KeycloakFormService<User> implements OnDest ngOnDestroy(): void { this._initOrganisationsEinheiten$.unsubscribe(); } + + public getUserName(): string { + return this.form.get(UserFormService.USERNAME).value; + } } diff --git a/alfa-client/libs/design-component/src/index.ts b/alfa-client/libs/design-component/src/index.ts index 745720be72b8665fb259372141e6ab5537efbfbe..9eec827c3a019115cc42c751521816fdde5c87a7 100644 --- a/alfa-client/libs/design-component/src/index.ts +++ b/alfa-client/libs/design-component/src/index.ts @@ -22,6 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ export * from './lib/button-with-spinner/button-with-spinner.component'; +export * from './lib/cancel-dialog-button/cancel-dialog-button.component'; export * from './lib/download-button/download-button.component'; export * from './lib/form/button-toggle-group/button-toggle-group.component'; export * from './lib/form/checkbox-editor/checkbox-editor.component'; @@ -30,5 +31,6 @@ export * from './lib/form/formcontrol-editor.abstract.component'; export * from './lib/form/single-file-upload-editor/single-file-upload-editor.component'; export * from './lib/form/text-editor/text-editor.component'; export * from './lib/form/textarea-editor/textarea-editor.component'; +export * from './lib/open-dialog-button/open-dialog-button.component'; export * from './lib/routing-button/routing-button.component'; export * from './lib/spinner/spinner.component'; diff --git a/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.spec.ts b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..110c81e4d4072ef0417676ea9966a7fa3394f144 --- /dev/null +++ b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.spec.ts @@ -0,0 +1,47 @@ +import { dispatchEventFromFixture, mock, Mock, MockEvent } from '@alfa-client/test-utils'; +import { OzgcloudDialogService } from '@alfa-client/ui'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ButtonComponent } from '@ods/system'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { MockComponent } from 'ng-mocks'; +import { CancelDialogButtonComponent } from './cancel-dialog-button.component'; + +describe('CancelDialogButtonComponent', () => { + let component: CancelDialogButtonComponent; + let fixture: ComponentFixture<CancelDialogButtonComponent>; + + let dialogService: Mock<OzgcloudDialogService>; + + const cancelDialog: string = getDataTestIdOf('cancel-dialog'); + + beforeEach(async () => { + dialogService = mock(OzgcloudDialogService); + + await TestBed.configureTestingModule({ + imports: [CancelDialogButtonComponent], + declarations: [MockComponent(ButtonComponent)], + providers: [ + { + provide: OzgcloudDialogService, + useValue: dialogService, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(CancelDialogButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('on button click', () => { + it('should call dialog service to close all', () => { + dispatchEventFromFixture(fixture, cancelDialog, MockEvent.CLICK); + + expect(dialogService.closeAll).toHaveBeenCalled(); + }); + }); +}); diff --git a/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.ts b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..6fd01cafbed417d086ed524c4c1c910426d2fab0 --- /dev/null +++ b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.ts @@ -0,0 +1,17 @@ +import { OzgcloudDialogService } from '@alfa-client/ui'; +import { Component, inject } from '@angular/core'; +import { ButtonComponent } from '@ods/system'; + +@Component({ + selector: 'ods-cancel-dialog-button', + standalone: true, + imports: [ButtonComponent], + template: `<ods-button (clickEmitter)="cancel()" text="Abbrechen" dataTestId="cancel-dialog" data-test-id="cancel-dialog" />`, +}) +export class CancelDialogButtonComponent { + public readonly dialogService = inject(OzgcloudDialogService); + + public cancel(): void { + this.dialogService.closeAll(); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..8cbe8c1ae06eabaea31340ddd8eb31f710cab503 --- /dev/null +++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts @@ -0,0 +1,104 @@ +import { OzgCloudComponentFactory } from '@alfa-client/tech-shared'; +import { dispatchEventFromFixture, Mock, mock, MockEvent, mockGetValue } from '@alfa-client/test-utils'; +import { DIALOG_COMPONENT, OzgcloudDialogService } from '@alfa-client/ui'; +import { ComponentType } from '@angular/cdk/portal'; +import { ComponentRef, Injector, ViewContainerRef } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ButtonComponent } from '@ods/system'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { MockComponent } from 'ng-mocks'; +import { of } from 'rxjs'; +import { OpenDialogButtonComponent } from './open-dialog-button.component'; + +describe('OpenDialogButtonComponent', () => { + let component: OpenDialogButtonComponent; + let fixture: ComponentFixture<OpenDialogButtonComponent>; + + let dialogComponent: Mock<ComponentType<any>>; + let componentFactory: Mock<OzgCloudComponentFactory>; + let dialogService: Mock<OzgcloudDialogService>; + let viewContainerRef: Mock<ViewContainerRef>; + let injector: Mock<Injector>; + + const openDialog: string = getDataTestIdOf('open-dialog'); + + const componentRef: ComponentRef<any> = <any>{ instance: { constructor: null } }; + const dialogResponse: any = {}; + + beforeEach(async () => { + dialogComponent = {}; + componentFactory = mock(OzgCloudComponentFactory); + dialogService = { ...mock(OzgcloudDialogService), openInContext: jest.fn().mockReturnValue({ closed: of(dialogResponse) }) }; + viewContainerRef = mock(ViewContainerRef as any); + injector = mock(Injector as any); + + await TestBed.configureTestingModule({ + imports: [OpenDialogButtonComponent], + declarations: [MockComponent(ButtonComponent)], + providers: [ + { + provide: DIALOG_COMPONENT, + useValue: dialogComponent, + }, + { + provide: OzgCloudComponentFactory, + useValue: componentFactory, + }, + { + provide: OzgcloudDialogService, + useValue: dialogService, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(OpenDialogButtonComponent); + component = fixture.componentInstance; + mockGetValue(component, 'viewContainerRef', viewContainerRef); + mockGetValue(component, 'injector', injector); + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('on button click', () => { + beforeEach(() => { + component._createComponent = jest.fn().mockReturnValue(componentRef); + }); + + it('should call create component factory to create component', () => { + dispatchEventFromFixture(fixture, openDialog, MockEvent.CLICK); + + expect(component._createComponent).toHaveBeenCalled(); + }); + + it('should call dialog service to open dialog', () => { + dispatchEventFromFixture(fixture, openDialog, MockEvent.CLICK); + + expect(dialogService.openInContext).toHaveBeenCalledWith(componentRef.instance.constructor, viewContainerRef); + }); + }); + + describe('open', () => { + beforeEach(() => { + component._createComponent = jest.fn().mockReturnValue(componentRef); + }); + + it('should emit close emitter on dialog close', () => { + component.close.emit = jest.fn(); + + component.open(); + + expect(component.close.emit).toHaveBeenCalled(); + }); + }); + + describe('create component', () => { + it('should call component factory to create component', () => { + component._createComponent(); + + expect(componentFactory.createComponent).toHaveBeenCalledWith(dialogComponent, injector); + }); + }); +}); 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 new file mode 100644 index 0000000000000000000000000000000000000000..8d5df99f45cc8a1da0c62380afba0592fb4f0d0e --- /dev/null +++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts @@ -0,0 +1,46 @@ +import { OzgCloudComponentFactory } from '@alfa-client/tech-shared'; +import { DIALOG_COMPONENT, OzgcloudDialogService } from '@alfa-client/ui'; +import { ComponentType } from '@angular/cdk/portal'; +import { Component, ComponentRef, EventEmitter, inject, Injector, Input, Output, ViewContainerRef } from '@angular/core'; +import { ButtonComponent } from '@ods/system'; +import { first } from 'rxjs'; + +@Component({ + selector: 'ods-open-dialog-button', + standalone: true, + imports: [ButtonComponent], + template: `<ods-button + (clickEmitter)="open()" + variant="outline" + text="{{ label }}" + [dataTestId]="dataTestId" + data-test-id="open-dialog" + />`, +}) +export class OpenDialogButtonComponent { + private readonly component: ComponentType<any> = inject(DIALOG_COMPONENT); + private readonly componentFactory = inject(OzgCloudComponentFactory); + + private readonly dialogService = inject(OzgcloudDialogService); + + readonly viewContainerRef = inject(ViewContainerRef); + private readonly injector = inject(Injector); + + @Input() label: string; + @Input() dataTestId: string; + + @Output() close: EventEmitter<void> = new EventEmitter(); + + public open(): void { + this.dialogService + .openInContext(this._createComponent().instance.constructor, this.viewContainerRef) + .closed.pipe(first()) + .subscribe(() => { + this.close.emit(); + }); + } + + _createComponent(): ComponentRef<any> { + return this.componentFactory.createComponent<any>(this.component, this.injector); + } +} diff --git a/alfa-client/libs/tech-shared/src/index.ts b/alfa-client/libs/tech-shared/src/index.ts index 6fbc4e5294b1490dd9924a225715b0007c0ba80f..be9ebae3ab1b5b0b13a375f8bd097acbfa8c11e8 100644 --- a/alfa-client/libs/tech-shared/src/index.ts +++ b/alfa-client/libs/tech-shared/src/index.ts @@ -57,6 +57,7 @@ export * from './lib/resource/resource.repository'; export * from './lib/resource/resource.rxjs.operator'; export * from './lib/resource/resource.service'; export * from './lib/resource/resource.util'; +export * from './lib/service/component.factory'; export * from './lib/service/formservice.abstract'; export * from './lib/tech.model'; export * from './lib/tech.util'; 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 new file mode 100644 index 0000000000000000000000000000000000000000..32fb2f6d84f6be4f3699b21359aa61395a0d50f8 --- /dev/null +++ b/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts @@ -0,0 +1,101 @@ +import { Mock, mock, mockGetValue } from '@alfa-client/test-utils'; +import { ApplicationRef, ComponentRef, EnvironmentInjector, Injector, ViewRef } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { OzgCloudComponentFactory } from './component.factory'; + +import { ComponentType } from '@angular/cdk/portal'; + +jest.mock('@angular/core', () => ({ + ...jest.requireActual('@angular/core'), + createComponent: jest.fn(), +})); + +describe('OzgCloudComponentFactory', () => { + let factory: OzgCloudComponentFactory; + + let appRef: Mock<ApplicationRef>; + let envInjector: Mock<EnvironmentInjector>; + + beforeEach(() => { + appRef = mock(ApplicationRef); + envInjector = mock(EnvironmentInjector as any); + + factory = TestBed.inject(OzgCloudComponentFactory); + + mockGetValue(factory, 'appRef', appRef); + mockGetValue(factory, 'envInjector', envInjector); + }); + + it('should be created', () => { + expect(factory).toBeTruthy(); + }); + + describe('create component', () => { + let createComponentSpy: jest.SpyInstance; + const injectorMock: Mock<Injector> = mock(Injector as any); + const componentRefMock: Mock<ComponentRef<any>> = mock(ComponentRef as any); + + const componentType: ComponentType<any> = <any>{}; + const injector: Injector = <any>{}; + + beforeEach(() => { + createComponentSpy = jest.spyOn(require('@angular/core'), 'createComponent').mockReturnValue(componentRefMock); + factory._createElementInjector = jest.fn().mockReturnValue(injectorMock); + factory._registerComponentToChangeDetection = jest.fn(); + }); + + it('should call createComponent', () => { + factory.createComponent(componentType, injector); + + expect(createComponentSpy).toHaveBeenCalledWith(componentType, { + environmentInjector: envInjector, + elementInjector: injectorMock, + }); + }); + + it('should register component to angulars change detection', () => { + factory.createComponent(componentType, injector); + + expect(factory._registerComponentToChangeDetection).toHaveBeenCalledWith(componentRefMock); + }); + + it('should return created component', () => { + const componentRef: ComponentRef<any> = factory.createComponent(componentType, injector); + + expect(componentRef).toBe(componentRefMock); + }); + }); + + describe('create element injector', () => { + const injectorMock: Mock<Injector> = mock(Injector as any); + + let createSpy: jest.SpyInstance; + + beforeEach(() => { + createSpy = jest.spyOn(Injector, 'create').mockReturnValue(injectorMock as Injector); + }); + + it('should create an injector by given parent selector', () => { + factory._createElementInjector(injectorMock); + + expect(createSpy).toHaveBeenCalled(); + }); + + it('should return created injector', () => { + const injector: Injector = factory._createElementInjector(injectorMock); + + expect(injector).toBe(injectorMock); + }); + }); + + describe('register component to angulars change detection', () => { + const hostView: ViewRef = <any>{}; + const componentRef: ComponentRef<any> = <any>{ hostView }; + + it('should set hostview to appRef', () => { + factory._registerComponentToChangeDetection(componentRef); + + expect(appRef.attachView).toHaveBeenCalledWith(hostView); + }); + }); +}); 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 new file mode 100644 index 0000000000000000000000000000000000000000..e54497e9fc92bbb198891d487ddcf7565ffab139 --- /dev/null +++ b/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts @@ -0,0 +1,25 @@ +import { ComponentType } from '@angular/cdk/portal'; +import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, inject, Injectable, Injector } 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> { + const component: ComponentRef<any> = <ComponentRef<any>>createComponent(componentType, { + environmentInjector: this.envInjector, + elementInjector: this._createElementInjector(parentInjector), + }); + this._registerComponentToChangeDetection(component); + return component; + } + + _createElementInjector(parentInjector: Injector): Injector { + return Injector.create({ providers: [], parent: parentInjector }); + } + + _registerComponentToChangeDetection(component: ComponentRef<any>): void { + this.appRef.attachView(component.hostView); + } +} diff --git a/alfa-client/libs/test-utils/src/lib/model.ts b/alfa-client/libs/test-utils/src/lib/model.ts index 1094ac96376b5a8d2d81cf5a7ebf13c69aa2a550..b2564a9ddf9869f6511f01c27ac61a0de6943879 100644 --- a/alfa-client/libs/test-utils/src/lib/model.ts +++ b/alfa-client/libs/test-utils/src/lib/model.ts @@ -30,6 +30,6 @@ export interface EventData<T> { data?: unknown; } -export const MockEvent = { - CLICK: 'clickEmitter', -}; +export enum MockEvent { + CLICK = 'clickEmitter', +} diff --git a/alfa-client/libs/ui/src/index.ts b/alfa-client/libs/ui/src/index.ts index 2db371a18e23b0b2d01eb93bcf1738bd8ef43f61..76832535931b3342403ac5674f6f866c4c7eb58f 100644 --- a/alfa-client/libs/ui/src/index.ts +++ b/alfa-client/libs/ui/src/index.ts @@ -47,6 +47,7 @@ export * from './lib/ui/open-url-button/open-url-button.component'; export * from './lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component'; export * from './lib/ui/ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component'; export * from './lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component'; +export * from './lib/ui/ozgcloud-dialog/ozgcloud-dialog.model'; export * from './lib/ui/ozgcloud-dialog/ozgcloud-dialog.result'; export * from './lib/ui/ozgcloud-dialog/ozgcloud-dialog.service'; export * from './lib/ui/ozgcloud-icon/ozgcloud-icon.component'; diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.model.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..441d097a057ac2121ffd01610740f149e6d6d5b1 --- /dev/null +++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.model.ts @@ -0,0 +1,4 @@ +import { ComponentType } from '@angular/cdk/portal'; +import { InjectionToken } from '@angular/core'; + +export const DIALOG_COMPONENT: InjectionToken<ComponentType<any>> = new InjectionToken<ComponentType<any>>('DialogComponent'); diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts index 91585f64a670993693cd3eb2202a181dc9d805ae..b95396349c8cb79f0e97601877a7fcd108529e56 100644 --- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts +++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { Mock, mock } from '@alfa-client/test-utils'; -import { Dialog, DialogConfig } from '@angular/cdk/dialog'; +import { Dialog, DialogConfig, DialogRef } from '@angular/cdk/dialog'; import { TestBed } from '@angular/core/testing'; import { OzgcloudDialogService } from './ozgcloud-dialog.service'; @@ -82,6 +82,26 @@ describe('OzgcloudDialogService', () => { }); }); + describe('open in context', () => { + const dialogRefMock: Mock<DialogRef> = mock(DialogRef); + + beforeEach(() => { + service.openInCallingComponentContext = jest.fn().mockReturnValue(dialogRefMock); + }); + + it('should call open in calling component context', () => { + service.openInContext(component, viewContainerRef, dialogData); + + expect(service.openInCallingComponentContext).toHaveBeenCalledWith(component, viewContainerRef, dialogData); + }); + + it('should return dialog ref', () => { + const dialogRef: DialogRef = service.openInContext(component, viewContainerRef, dialogData); + + expect(dialogRef).toBe(dialogRefMock); + }); + }); + describe('openInCallingComponentContext', () => { it('should open dialog with data', () => { service.openInCallingComponentContext(component, viewContainerRef, dialogData); diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts index 077780a3e1d01c0e198efc1de9f12244315b1194..aebed88efe5a54fafce9ec09283f0314c744fc5e 100644 --- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts +++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts @@ -30,7 +30,7 @@ import { isNil } from 'lodash-es'; providedIn: 'root', }) export class OzgcloudDialogService { - private dialog = inject(Dialog); + private readonly dialog = inject(Dialog); readonly WIZARD_DIALOG_CONFIG: DialogConfig = { width: '1000px', @@ -47,10 +47,21 @@ export class OzgcloudDialogService { return this.openDialog<C, R>(component, this.buildDialogConfigWithData<D>(data, this.WIZARD_DIALOG_CONFIG)); } + /** + * @deprecated use openInContext instead + */ public open<C, D = unknown, R = unknown>(component: ComponentType<C>, data?: D): DialogRef<R> { return this.openDialog(component, this.buildDialogConfigWithData(data)); } + public openInContext<C, D = unknown, R = unknown>( + component: ComponentType<C>, + viewContainerRef: ViewContainerRef, + data?: D, + ): DialogRef<R> { + return this.openInCallingComponentContext<C, D, R>(component, viewContainerRef, data); + } + public openFullScreenDialog<C, D = unknown, R = unknown>( component: ComponentType<C>, viewContainerRef: ViewContainerRef, @@ -59,6 +70,7 @@ export class OzgcloudDialogService { return this.openInCallingComponentContext<C, D, R>(component, viewContainerRef, data, this.GREY_BLUR_CONFIG); } + //TODO private machen und openInContext bei den jeweiligen Stellen nutzen public openInCallingComponentContext<C, D = unknown, R = unknown>( component: ComponentType<C>, viewContainerRef: ViewContainerRef,