diff --git a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.html b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.html index d07cea93308d33ecfb5af0d917ad1fdfd84629d6..ec5c2b1f2a356d87ce90983eb5206fe24245c0c4 100644 --- a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.html +++ b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.html @@ -31,6 +31,7 @@ " [disabled]="isDisabled" [matTooltip]="toolTip" + [matMenuTriggerFor]="matMenuTriggerFor" (click)="clickEmitter.emit($event)" type="button" > 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/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.ts b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.ts index aac12cd1ba42b1995fc8c188498c08f5ab0c7211..aac1f896a23e916e76a4f59e07d6e9294d0f6dc5 100644 --- a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.ts +++ b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.ts @@ -21,8 +21,8 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ +import { StateResource, createEmptyStateResource } from '@alfa-client/tech-shared'; import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; import { Resource } from '@ngxp/rest'; import { isNil } from 'lodash-es'; @@ -34,6 +34,7 @@ import { isNil } from 'lodash-es'; export class IconButtonWithSpinnerComponent { @Input() icon: string; @Input() svgIcon: string; + @Input() matMenuTriggerFor: string; @Input() stateResource: StateResource<Resource>; @Input() toolTip: string = ''; @Input() showSpinner: boolean = false; diff --git a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.html b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.html index 5fa5cdf3ab2ef420c6aba8fdafb9fe6b64f8dd17..f455cb99443c2e6a9be7146de5e4ed7e15022704 100644 --- a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.html +++ b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.html @@ -28,7 +28,7 @@ [matMenuTriggerFor]="menu.matMenu" (menuOpened)="showUserProfileSearch()" (menuClosed)="hideUserProfileSearch()" - aria-label="Bearbeiter ändern" + [attr.aria-label]="userButtonLabel" class="user-profile-button" > <alfa-user-icon diff --git a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.spec.ts b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.spec.ts index 4464f2f109503b0424b404266a04c7bd80bee70b..6c12e1395e939a926ad075df0c40159f9ae04cb4 100644 --- a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.spec.ts +++ b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.spec.ts @@ -21,10 +21,11 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; import { mock } from '@alfa-client/test-utils'; import { OzgcloudMenuComponent, UiModule } from '@alfa-client/ui'; -import { UserProfileService } from '@alfa-client/user-profile-shared'; +import { UserProfileResource, UserProfileService } from '@alfa-client/user-profile-shared'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MockComponent } from 'ng-mocks'; import { BehaviorSubject } from 'rxjs'; import { UserIconComponent } from '../../../user-icon/user-icon.component'; @@ -114,4 +115,31 @@ describe('UserProfileButtonContainerComponent', () => { expect(userProfileService.hideUserProfileSearch).toHaveBeenCalled(); }); }); + + describe('getUserButtonLabel', () => { + it('should return label', () => { + component.userProfile = createEmptyStateResource(); + + const result = component.getUserButtonLabel(); + + expect(result).toBe('Bearbeiter ändern. Aktueller Bearbeiter: Unbekannter Benutzer'); + }); + }); + + describe('set userProfile', () => { + const userProfileStateResource: StateResource<UserProfileResource> = createEmptyStateResource(); + it('should set userProfile', () => { + component.userProfile = userProfileStateResource; + + expect(component.userProfile).toBe(userProfileStateResource); + }); + + it('should get label for user button', () => { + component.getUserButtonLabel = jest.fn(); + + component.userProfile = userProfileStateResource; + + expect(component.getUserButtonLabel).toHaveBeenCalled(); + }); + }); }); diff --git a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts index 1c7451882382e8bdd72e1b6a66b44c48a3b1dc01..e559f74639d522733a7506a840c689091f6460fe 100644 --- a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts +++ b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts @@ -21,10 +21,14 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ +import { StateResource } from '@alfa-client/tech-shared'; +import { + getUserName, + UserProfileResource, + UserProfileService, +} from '@alfa-client/user-profile-shared'; import { Component, Input, OnInit, ViewChild } from '@angular/core'; import { MatMenuTrigger } from '@angular/material/menu'; -import { StateResource } from '@alfa-client/tech-shared'; -import { UserProfileResource, UserProfileService } from '@alfa-client/user-profile-shared'; import { Observable, tap } from 'rxjs'; @Component({ @@ -33,11 +37,21 @@ import { Observable, tap } from 'rxjs'; styleUrls: ['./user-profile-button-container.component.scss'], }) export class UserProfileButtonContainerComponent implements OnInit { - @Input() userProfile: StateResource<UserProfileResource>; + @Input() + set userProfile(value: StateResource<UserProfileResource>) { + this._userProfile = value; + this.userButtonLabel = this.getUserButtonLabel(); + } + + get userProfile() { + return this._userProfile; + } @ViewChild(MatMenuTrigger) menuTrigger: MatMenuTrigger; showUserProfileSearch$: Observable<boolean>; + private _userProfile: StateResource<UserProfileResource>; + userButtonLabel: string; constructor(public userProfileService: UserProfileService) {} @@ -64,4 +78,8 @@ export class UserProfileButtonContainerComponent implements OnInit { public hideUserProfileSearch(): void { this.userProfileService.hideUserProfileSearch(); } + + public getUserButtonLabel(): string { + return `Bearbeiter ändern. Aktueller Bearbeiter: ${getUserName(this.userProfile.resource)}`; + } } diff --git a/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings-menu-button/user-settings-menu-button.component.html b/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings-menu-button/user-settings-menu-button.component.html index b5c75e65e763c68cd0300190f8c1ff422738c3fc..b13bac6befba485ab93860d409d3f1b79492ebec 100644 --- a/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings-menu-button/user-settings-menu-button.component.html +++ b/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings-menu-button/user-settings-menu-button.component.html @@ -27,4 +27,5 @@ icon="settings" toolTip="Einstellungen" data-test-id="menu-button" + [matMenuTriggerFor]="matMenuTriggerFor" ></ozgcloud-icon-button-with-spinner> diff --git a/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings-menu-button/user-settings-menu-button.component.ts b/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings-menu-button/user-settings-menu-button.component.ts index 5151de3ca312af3db73cc04385d649a4d3c7ee92..e952c3b73d18d4ee756c56cabfc23f2a3d2cb5d5 100644 --- a/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings-menu-button/user-settings-menu-button.component.ts +++ b/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings-menu-button/user-settings-menu-button.component.ts @@ -21,11 +21,13 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component } from '@angular/core'; +import { Component, Input } from '@angular/core'; @Component({ selector: 'alfa-user-settings-menu-button', templateUrl: './user-settings-menu-button.component.html', styleUrls: ['./user-settings-menu-button.component.scss'], }) -export class UserSettingsMenuButtonComponent {} +export class UserSettingsMenuButtonComponent { + @Input() matMenuTriggerFor: string; +} 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..0c9700bd02d85554970bdcad3706bd6f808c8e3b 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,25 @@ * 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, + createEmptyStateResource, + 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'; @@ -41,6 +54,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { getDataTestClassOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang'; import { MockComponent, MockModule } from 'ng-mocks'; +import { of } from 'rxjs'; import { VorgangBescheidStatusComponent } from './vorgang-bescheid-status/vorgang-bescheid-status.component'; import { VorgangCreatedAtComponent } from './vorgang-created-at/vorgang-created-at.component'; import { VorgangListItemComponent } from './vorgang-list-item.component'; @@ -52,6 +66,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 +95,7 @@ describe('VorgangListItemComponent', () => { MockModule(MatTooltipModule), ], providers: [ + { provide: UserProfileService, useValue: userProfileService }, { provide: LOCALE_ID, useValue: 'de' }, { provide: MAT_DATE_LOCALE, useValue: 'de-DE' }, ], @@ -96,6 +113,48 @@ 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', () => { + beforeEach(() => { + component.userProfileService.getAssignedUserProfile = jest + .fn() + .mockReturnValue(of(createEmptyStateResource())); + }); + + it('should not get profile if vorgang has no "assigned to" link', () => { + component.vorgang = createVorgangResource(); + + component.ngOnInit(); + + expect(component.userProfileService.getAssignedUserProfile).not.toHaveBeenCalled(); + }); + + it('should get profile', () => { + 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 +316,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..b695b0b3740025faa936742b5e531aa68997b44d 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,29 @@ * 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, + isNotNull, + 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'; +import { first } from 'rxjs'; @Component({ selector: 'alfa-vorgang-list-item', @@ -35,10 +53,23 @@ 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) + .pipe(first(isNotNull)) + .subscribe((userProfileStateResource: StateResource<UserProfileResource>) => { + this.userProfile = userProfileStateResource; + }); + } + this.status = this.getStatus(); this.buildAriaLabel(); } @@ -46,10 +77,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 +99,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'; + } }