diff --git a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts index cc423f9a8086d18af5fdc13a0db41ab2fae861df..47b9ce82546885a666ae26c46fcff54a7acca36c 100644 --- a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts +++ b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts @@ -24,6 +24,7 @@ import { createEmptyStateResource } from '@alfa-client/tech-shared'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIcon } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MockComponent, MockModule } from 'ng-mocks'; import { SpinnerComponent } from '../spinner/spinner.component'; @@ -43,6 +44,7 @@ describe('IconButtonWithSpinnerComponent', () => { MatIcon, MockComponent(SpinnerComponent), MockModule(MatTooltipModule), + MockModule(MatMenuModule), ], }); }); diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.html b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.html index 696169f3474d0aacf9feb45c554a25d291b979fd..f6a1ebd55e0db35ad39e55888ecca1d511452bc1 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.html +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.html @@ -24,5 +24,5 @@ --> <div class="status-name text-sm" data-test-id="vorgang-status-text"> - {{ status | enumToLabel: vorgangStatusLabel }} + {{ status }} </div> diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.spec.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.spec.ts index 4c85845d2178b7a2faadd81cc18a0ee8371f092a..15774e62da602caa5cf4f474762e6464a245dfb9 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.spec.ts +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.spec.ts @@ -22,22 +22,18 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { EnumToLabelPipe } from '@alfa-client/tech-shared'; -import { VorgangResource, VorgangStatusLabel } from '@alfa-client/vorgang-shared'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; -import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang'; import { VorgangStatusTextComponent } from './vorgang-status-text.component'; describe('VorgangStatusTextComponent', () => { let component: VorgangStatusTextComponent; let fixture: ComponentFixture<VorgangStatusTextComponent>; - const vorgang: VorgangResource = createVorgangResource(); const statusTextTestId: string = getDataTestIdOf('vorgang-status-text'); beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [EnumToLabelPipe, VorgangStatusTextComponent], + declarations: [VorgangStatusTextComponent], }).compileComponents(); }); @@ -51,13 +47,12 @@ describe('VorgangStatusTextComponent', () => { expect(component).toBeTruthy(); }); - it('should show status dot', () => { - component.status = vorgang.status; - const statusText: string = VorgangStatusLabel[vorgang.status]; + it('should show status text', () => { + component.status = 'Neu'; fixture.detectChanges(); const statusTextElement: HTMLElement = fixture.nativeElement.querySelector(statusTextTestId); - expect(statusTextElement.innerHTML).toContain(statusText); + expect(statusTextElement.innerHTML).toContain('Neu'); }); }); diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.ts index 4a46a08223176794182bf46222f0f8fe829de4fb..de4e772d0b94942199e6bdd381077201de758b46 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.ts +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.ts @@ -22,7 +22,6 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { Component, Input } from '@angular/core'; -import { VorgangStatus, VorgangStatusLabel } from '@alfa-client/vorgang-shared'; @Component({ selector: 'alfa-vorgang-status-text', @@ -30,6 +29,5 @@ import { VorgangStatus, VorgangStatusLabel } from '@alfa-client/vorgang-shared'; styleUrls: ['./vorgang-status-text.component.scss'], }) export class VorgangStatusTextComponent { - @Input() status: VorgangStatus; - readonly vorgangStatusLabel = VorgangStatusLabel; + @Input() status: string; } diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.html b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.html index 228c9808d45c6f5b81e47b178e21cfe28e4fe01c..d7faafb103e54a0b4abc767e586bec558d2a5982 100644 --- a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.html +++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.html @@ -38,7 +38,7 @@ data-test-class="status-dot" ></alfa-vorgang-status-dot> <alfa-vorgang-status-text - [status]="vorgang.status" + [status]="status" data-test-class="status-text" class="status-text" ></alfa-vorgang-status-text> diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts index 13b574ef5c2fcdc6d993803208437cb01bb5ce3c..033803720354c36ca1b2fa9a84b810e35697869f 100644 --- a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts +++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts @@ -21,12 +21,24 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { convertForDataTest, ConvertForDataTestPipe, EnumToLabelPipe, HasLinkPipe, ToResourceUriPipe } from '@alfa-client/tech-shared'; -import { getElementFromFixture } from '@alfa-client/test-utils'; +import { + convertForDataTest, + ConvertForDataTestPipe, + EnumToLabelPipe, + HasLinkPipe, + ToResourceUriPipe, +} from '@alfa-client/tech-shared'; +import { getElementFromFixture, mock } from '@alfa-client/test-utils'; import { PostfachIconComponent } from '@alfa-client/ui'; import { UserProfileInVorgangListItemContainerComponent } from '@alfa-client/user-profile'; -import { VorgangHeaderLinkRel } from '@alfa-client/vorgang-shared'; -import { AktenzeichenComponent, VorgangNummerComponent, VorgangStatusDotComponent, VorgangStatusTextComponent } from '@alfa-client/vorgang-shared-ui'; +import { UserProfileService } from '@alfa-client/user-profile-shared'; +import { VorgangHeaderLinkRel, VorgangStatus } from '@alfa-client/vorgang-shared'; +import { + AktenzeichenComponent, + VorgangNummerComponent, + VorgangStatusDotComponent, + VorgangStatusTextComponent, +} from '@alfa-client/vorgang-shared-ui'; import { WiedervorlageListInVorgangListContainerComponent } from '@alfa-client/wiedervorlage'; import { registerLocaleData } from '@angular/common'; import localeDe from '@angular/common/locales/de'; @@ -52,6 +64,8 @@ describe('VorgangListItemComponent', () => { let component: VorgangListItemComponent; let fixture: ComponentFixture<VorgangListItemComponent>; + const userProfileService = mock(UserProfileService); + const user: string = getDataTestIdOf('vorgang-user-icon'); const postfachStatus: string = getDataTestClassOf('postfach-icon'); const bescheidStatus: string = getDataTestIdOf('vorgang-list-item-bescheid-status'); @@ -79,6 +93,7 @@ describe('VorgangListItemComponent', () => { MockModule(MatTooltipModule), ], providers: [ + { provide: UserProfileService, useValue: userProfileService }, { provide: LOCALE_ID, useValue: 'de' }, { provide: MAT_DATE_LOCALE, useValue: 'de-DE' }, ], @@ -96,6 +111,46 @@ describe('VorgangListItemComponent', () => { expect(component).toBeTruthy(); }); + describe('ngOnInit', () => { + it('should set status', () => { + component.getStatus = jest.fn().mockReturnValue('Test'); + + component.ngOnInit(); + + expect(component.status).toBe('Test'); + }); + + it('should build aria label', () => { + component.buildAriaLabel = jest.fn(); + + component.ngOnInit(); + + expect(component.buildAriaLabel).toHaveBeenCalled(); + }); + + describe('user profile', () => { + it('should not get profile if vorgang has no "assigned to" link', () => { + component.userProfileService.getAssignedUserProfile = jest.fn(); + component.vorgang = createVorgangResource(); + + component.ngOnInit(); + + expect(component.userProfileService.getAssignedUserProfile).not.toHaveBeenCalled(); + }); + + it('should get profile', () => { + component.userProfileService.getAssignedUserProfile = jest + .fn() + .mockReturnValue({ subscribe: jest.fn() }); + component.vorgang = createVorgangResource([VorgangHeaderLinkRel.ASSIGNED_TO]); + + component.ngOnInit(); + + expect(component.userProfileService.getAssignedUserProfile).toHaveBeenCalled(); + }); + }); + }); + describe('bearbeiter/user-icon', () => { it('should be visible', () => { component.vorgang = createVorgangResource([ @@ -257,4 +312,40 @@ describe('VorgangListItemComponent', () => { expect(element).not.toBeInstanceOf(HTMLElement); }); }); + + describe('getStatus', () => { + it('should return status', () => { + component.vorgang.status = VorgangStatus.NEU; + + const result: string = component.getStatus(); + + expect(result).toBe('Neu'); + }); + }); + + describe('getApprovalText', () => { + it('should return empty string', () => { + component.vorgang.antragBewilligt = undefined; + + const result: string = component.getApprovalText(); + + expect(result).toBe(''); + }); + + it('should return "approved" text', () => { + component.vorgang.antragBewilligt = true; + + const result: string = component.getApprovalText(); + + expect(result).toBe('bewilligt'); + }); + + it('should return "not approved" text', () => { + component.vorgang.antragBewilligt = false; + + const result: string = component.getApprovalText(); + + expect(result).toBe('abgelehnt'); + }); + }); }); diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.ts b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.ts index bdf00833cb720c671cf9bc6ec4b6a0026ea64e1d..3743fbda3476af9f9cf5bbd685714d1ac63726d9 100644 --- a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.ts +++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.ts @@ -21,11 +21,27 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { formatToPrettyDate } from '@alfa-client/tech-shared'; -import { VorgangHeaderLinkRel, VorgangResource } from '@alfa-client/vorgang-shared'; +import { + createEmptyStateResource, + EnumToLabelPipe, + formatFullDateWithTimeWithoutSeconds, + formatToPrettyDate, + StateResource, +} from '@alfa-client/tech-shared'; +import { + getUserName, + UserProfileResource, + UserProfileService, +} from '@alfa-client/user-profile-shared'; +import { + VorgangHeaderLinkRel, + VorgangResource, + VorgangStatusLabel, +} from '@alfa-client/vorgang-shared'; import { getAktenzeichenText } from '@alfa-client/vorgang-shared-ui'; import { Component, Input, OnInit } from '@angular/core'; import { hasLink } from '@ngxp/rest'; +import { isNil } from 'lodash-es'; @Component({ selector: 'alfa-vorgang-list-item', @@ -35,10 +51,22 @@ export class VorgangListItemComponent implements OnInit { @Input() vorgang: VorgangResource; readonly vorgangLinkRel = VorgangHeaderLinkRel; + userProfile: StateResource<UserProfileResource> = createEmptyStateResource<UserProfileResource>(); public ariaLabel: string = ''; + public status: string = ''; + + constructor(public userProfileService: UserProfileService) {} ngOnInit(): void { + if (hasLink(this.vorgang, VorgangHeaderLinkRel.ASSIGNED_TO)) { + this.userProfileService + .getAssignedUserProfile(this.vorgang, VorgangHeaderLinkRel.ASSIGNED_TO) + .subscribe((userProfileStateResource: StateResource<UserProfileResource>) => { + this.userProfile = userProfileStateResource; + }); + } + this.status = this.getStatus(); this.buildAriaLabel(); } @@ -46,10 +74,10 @@ export class VorgangListItemComponent implements OnInit { const name: string = this.vorgang.name; const aktenzeichen: string = getAktenzeichenText(this.vorgang); const nummer: string = this.vorgang.nummer; - const status: string = this.vorgang.status; - const createdAt: string = formatToPrettyDate(this.vorgang.createdAt); + const approvalStatus: string = this.getApprovalText(); + const createdAt: string = formatFullDateWithTimeWithoutSeconds(this.vorgang.createdAt); - this.ariaLabel = `Vorgang: ${name}, Aktenzeichen: ${aktenzeichen}, Nummer: ${nummer} Status: ${status}, Eingang: ${createdAt}`; + this.ariaLabel = `Vorgang: ${name}, Aktenzeichen: ${aktenzeichen}, Nummer: ${nummer} Status: ${this.status} ${approvalStatus}, Eingang: ${createdAt}, Aktuell zugewiesener Nutzer: ${getUserName(this.userProfile.resource)}`; if ( hasLink(this.vorgang, VorgangHeaderLinkRel.WIEDERVORLAGEN) && @@ -68,11 +96,22 @@ export class VorgangListItemComponent implements OnInit { return `, Nächste Wiedervorlage am ${nextFrist}`; } - getPostfachNachricht() { + getPostfachNachricht(): string { if (this.vorgang.hasNewPostfachNachricht) { return ', enthält neue Postfachnachrichten'; } return ', enthält Postfachnachrichten'; } + + getStatus(): string { + const enumToLabel = new EnumToLabelPipe(); + return enumToLabel.transform(this.vorgang.status, VorgangStatusLabel); + } + + getApprovalText(): string { + if (isNil(this.vorgang.antragBewilligt)) return ''; + + return this.vorgang.antragBewilligt ? 'bewilligt' : 'abgelehnt'; + } }