diff --git a/alfa-client/libs/admin-settings/src/lib/admin-settings.module.ts b/alfa-client/libs/admin-settings/src/lib/admin-settings.module.ts index 6c214a3f3e8547de00d5fe8b2b936923dbbad461..414a929008988e7cddd1dff320d5c941f3fc1d4a 100644 --- a/alfa-client/libs/admin-settings/src/lib/admin-settings.module.ts +++ b/alfa-client/libs/admin-settings/src/lib/admin-settings.module.ts @@ -22,6 +22,7 @@ import KcAdminClient from '@keycloak/keycloak-admin-client'; import { Environment, ENVIRONMENT_CONFIG } from '@alfa-client/environment-shared'; import { MoreMenuComponent } from './shared/more-menu/more-menu.component'; import { MoreItemButtonComponent } from './shared/more-menu/more-item-button/more-item-button.component'; +import { SpinnerComponent } from './shared/spinner/spinner.component'; @NgModule({ declarations: [ @@ -39,6 +40,7 @@ import { MoreItemButtonComponent } from './shared/more-menu/more-item-button/mor OrganisationseinheitListComponent, MoreMenuComponent, MoreItemButtonComponent, + SpinnerComponent, ], imports: [CommonModule, TechSharedModule, RouterModule, ReactiveFormsModule], exports: [ diff --git a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html index a8dbd91dd0c34613866a83772febff81586bb214..dbc6d9eddd9d63fb982da496a7a4636210670ce8 100644 --- a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html +++ b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html @@ -11,10 +11,14 @@ label="Neue Organisationseinheit anlegen" > </admin-secondary-button> +<admin-spinner + data-test-id="organisationseinheit-spinner" + *ngIf="deleteInProgress$ | async" +></admin-spinner> <admin-organisationseinheit-list [organisationseinheitItems]="organisationseinheitItems$ | async" - (editOrganisationseinheit)="editOrganisationseinheit($event)" - (deleteOrganisationseinheit)="deleteOrganisationseinheit($event)" + (editOrganisationseinheit)="edit($event)" + (deleteOrganisationseinheit)="delete($event)" data-test-id="organisationseinheit-list" ></admin-organisationseinheit-list> diff --git a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts index 11a772a0362ad94dfc0eb5e18bfcd8e19ec674ff..d3fa21ecfe2155198424070bcfb43fe74f1fec40 100644 --- a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts +++ b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts @@ -6,9 +6,11 @@ import { SecondaryButtonComponent } from '../../shared/secondary-button/secondar import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { dispatchEventFromFixture, + existsAsHtmlElement, getElementFromFixtureByType, mock, Mock, + notExistsAsHtmlElement, } from '@alfa-client/test-utils'; import { OrganisationseinheitListComponent } from './organisationseinheit-list/organisationseinheit-list.component'; import { UserService } from '../../user/user.service'; @@ -18,6 +20,8 @@ import { createOrganisationseinheitState, } from '../../../../test/keycloak/keycloak'; import { Organisationseinheit } from '../../user/user.model'; +import { singleCold } from '../../../../../tech-shared/src/lib/resource/marbles'; +import { SpinnerComponent } from '../../shared/spinner/spinner.component'; describe('OrganisationseinheitContainerComponent', () => { let component: OrganisationseinheitContainerComponent; @@ -28,6 +32,7 @@ describe('OrganisationseinheitContainerComponent', () => { const dialogOpenButtonSelector: string = getDataTestIdOf( 'organisationseinheit-open-dialog-button', ); + const spinnerSelector: string = getDataTestIdOf('organisationseinheit-spinner'); const organisationseinheitItems: Organisationseinheit[] = [createOrganisationseinheit()]; @@ -41,6 +46,7 @@ describe('OrganisationseinheitContainerComponent', () => { MockComponent(SecondaryButtonComponent), MockComponent(OrganisationseinheitFormComponent), MockComponent(OrganisationseinheitListComponent), + MockComponent(SpinnerComponent), ], providers: [{ provide: UserService, useValue: userService }], }).compileComponents(); @@ -70,7 +76,6 @@ describe('OrganisationseinheitContainerComponent', () => { }); describe('organisationseinheit list', () => { - it('should open form for editing on editOrganisationseinheit event', () => { const organisationseinheit: Organisationseinheit = organisationseinheitItems[0]; formComponent.openEdit = jest.fn(); @@ -80,13 +85,48 @@ describe('OrganisationseinheitContainerComponent', () => { expect(formComponent.openEdit).toHaveBeenCalledWith(organisationseinheit); }); - it('should call delete form on deleteOrganisationseinheit event', () => { + it('should call deleteOrganisationseinheit form on deleteOrganisationseinheit event', () => { const organisationseinheit: Organisationseinheit = organisationseinheitItems[0]; - formComponent.delete = jest.fn(); + component.delete = jest.fn(); listComponent.deleteOrganisationseinheit.emit(organisationseinheit); - expect(formComponent.delete).toHaveBeenCalledWith(organisationseinheit); + expect(component.delete).toHaveBeenCalledWith(organisationseinheit); + }); + }); + + describe('delete', () => { + const organisationseinheit: Organisationseinheit = organisationseinheitItems[0]; + + beforeEach(() => { + userService.deleteOrganisationseinheit = jest.fn().mockReturnValue(singleCold(true)); + }); + + it('should call service method', () => { + component.delete(organisationseinheit); + + expect(userService.deleteOrganisationseinheit).toHaveBeenCalledWith(organisationseinheit.id); + }); + + it('should assign delete progress observable', () => { + component.delete(organisationseinheit); + + expect(component.deleteInProgress$).toBeObservable(singleCold(true)); + }); + }); + + describe('spinner', () => { + it('should not show if delete in not progress', () => { + fixture.detectChanges(); + + notExistsAsHtmlElement(fixture, spinnerSelector); + }); + it('should show if delete in progress', () => { + component.deleteInProgress$ = of(true); + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, spinnerSelector); }); }); }); diff --git a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts index 9750b725ddfbf7741e9097226c237dfbf613383a..efa637313dfce71fe1904be3658658cb2dd34518 100644 --- a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts +++ b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { Organisationseinheit } from '../../user/user.model'; import { UserService } from '../../user/user.service'; -import { Observable } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { OrganisationseinheitFormComponent } from './organisationseinheit-form/organisationseinheit-form.component'; @Component({ @@ -10,6 +10,7 @@ import { OrganisationseinheitFormComponent } from './organisationseinheit-form/o }) export class OrganisationseinheitContainerComponent implements OnInit { organisationseinheitItems$: Observable<Organisationseinheit[]>; + deleteInProgress$: Observable<boolean> = of(false); @ViewChild(OrganisationseinheitFormComponent) private form!: OrganisationseinheitFormComponent; @@ -24,11 +25,11 @@ export class OrganisationseinheitContainerComponent implements OnInit { this.form.open(); } - public editOrganisationseinheit(organisationseinheit: Organisationseinheit): void { + public edit(organisationseinheit: Organisationseinheit): void { this.form.openEdit(organisationseinheit); } - public deleteOrganisationseinheit(organisationseinheit: Organisationseinheit): void { - this.form.delete(organisationseinheit); + public delete(organisationseinheit: Organisationseinheit): void { + this.deleteInProgress$ = this.userService.deleteOrganisationseinheit(organisationseinheit.id); } } diff --git a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts index 9e1f39437be6685174546f19c2f00e1307870c6f..fa05ca78075a471e82b3b1f9f4ff323dc4578660 100644 --- a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts +++ b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts @@ -278,8 +278,6 @@ describe('OrganisationseinheitFormComponent', () => { expect(component.dialog.showModal).toHaveBeenCalled(); }); - - it('should patch form', () => { component.formService.patch = jest.fn(); @@ -289,23 +287,6 @@ describe('OrganisationseinheitFormComponent', () => { }); }); - describe('delete', () => { - const organisationseinheit: Organisationseinheit = createOrganisationseinheit(); - - it('should not open dialog', () => { - expect(component.dialog.showModal).not.toHaveBeenCalled(); - }); - - it('should call form service delete with organisationseinheit id', fakeAsync(() => { - component.formService.delete = jest.fn(); - - component.delete(organisationseinheit); - tick(); - - expect(component.formService.delete).toHaveBeenCalledWith(organisationseinheit.id); - })); - }); - describe('header', () => { it('should show label text', () => { const text: string = 'test-text'; diff --git a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.ts b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.ts index 2d831680baf34f61aaf30833fb8263e84d4c0995..a751de2bce0712f5d8bc5a1d97b9000fa6ed78ec 100644 --- a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.ts +++ b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.ts @@ -57,10 +57,6 @@ export class OrganisationseinheitFormComponent implements AfterViewInit { this.dialog.showModal(); } - public delete(organisationseinheit: Organisationseinheit): void { - this.submitInProgress$ = this.formService.delete(organisationseinheit.id); - } - complete(): void { this.dialog.close(); this.formService.reset(); diff --git a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit.formservice.ts b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit.formservice.ts index 3a1eda71d536a2db797080ba90504e99fe0d9c7d..a5b71af7536c8a763466a3600cd3f67c9487d3dd 100644 --- a/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit.formservice.ts +++ b/alfa-client/libs/admin-settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit.formservice.ts @@ -117,8 +117,4 @@ export class OrganisationseinheitFormservice { public isInvalid(): boolean { return this.form.invalid; } - - public delete(id: string): Observable<boolean> { - return this.userService.deleteOrganisationseinheit(id); - } }