diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index d45a2a8b1..8221933dc 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -7309,7 +7309,7 @@ src/app/pipes/username.pipe.ts - 33 + 37 diff --git a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html index 52aa48c2e..4aeb70626 100644 --- a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html +++ b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -70,7 +70,7 @@ } @case (DisplayField.OWNER) { @if (doc.owner) { - {{doc.owner | username}} + {{doc.owner | username | async}} } } @case (DisplayField.ASN) { diff --git a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html index 46399aa32..7c602ec53 100644 --- a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html +++ b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html @@ -136,7 +136,7 @@ } @if (displayFields.includes(DisplayField.OWNER) && document.owner && document.owner !== settingsService.currentUser.id) {
- {{document.owner | username}} + {{document.owner | username | async}}
} @if (displayFields.includes(DisplayField.SHARED) && document.is_shared_by_requester) { diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html index cde273dfe..829de9765 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html @@ -116,7 +116,7 @@ @if (displayFields.includes(DisplayField.OWNER) && document.owner && document.owner !== settingsService.currentUser.id) {
- {{document.owner | username}} + {{document.owner | username | async}}
} @if (displayFields.includes(DisplayField.SHARED) && document.is_shared_by_requester) { diff --git a/src-ui/src/app/components/document-list/document-list.component.html b/src-ui/src/app/components/document-list/document-list.component.html index 73f7a1ce8..9b266dd9a 100644 --- a/src-ui/src/app/components/document-list/document-list.component.html +++ b/src-ui/src/app/components/document-list/document-list.component.html @@ -318,7 +318,7 @@ } @if (activeDisplayFields.includes(DisplayField.OWNER) && permissionService.currentUserCan(PermissionAction.View, PermissionType.User)) { - {{d.owner | username}} + {{d.owner | username | async}} } @if (activeDisplayFields.includes(DisplayField.NOTES) && notesEnabled) { diff --git a/src-ui/src/app/pipes/username.pipe.spec.ts b/src-ui/src/app/pipes/username.pipe.spec.ts index 083816326..cf7c4d677 100644 --- a/src-ui/src/app/pipes/username.pipe.spec.ts +++ b/src-ui/src/app/pipes/username.pipe.spec.ts @@ -38,6 +38,13 @@ describe('UsernamePipe', () => { }) it('should transform user id to username', () => { + let username + const assign = (name) => { + username = name + } + + pipe.transform(2).subscribe(assign) + const req = httpTestingController.expectOne( `${environment.apiBaseUrl}users/?page=1&page_size=100000` ) @@ -55,24 +62,44 @@ describe('UsernamePipe', () => { }, ], }) - - let username = pipe.transform(2) expect(username).toEqual('username2') - username = pipe.transform(3) + pipe.transform(3).subscribe(assign) expect(username).toEqual('User Name3') - username = pipe.transform(4) + pipe.transform(4).subscribe(assign) expect(username).toEqual('') }) - it('should show generic label when no users retrieved', () => { + it('should show generic label when insufficient permissions', () => { + let username + const assign = (name) => { + username = name + } + jest + .spyOn(permissionsService, 'currentUserCan') + .mockImplementation((action, type) => { + return false + }) + pipe.transform(4).subscribe(assign) + httpTestingController.expectNone( + `${environment.apiBaseUrl}users/?page=1&page_size=100000` + ) + + expect(username).toEqual('Shared') + }) + + it('should show empty string when no users retrieved due to error', () => { + let username + const assign = (name) => { + username = name + } + pipe.transform(4).subscribe(assign) const req = httpTestingController.expectOne( `${environment.apiBaseUrl}users/?page=1&page_size=100000` ) - req.flush(null) + req.error(new ProgressEvent('error')) - let username = pipe.transform(4) - expect(username).toEqual('Shared') + expect(username).toEqual('') }) }) diff --git a/src-ui/src/app/pipes/username.pipe.ts b/src-ui/src/app/pipes/username.pipe.ts index 54e8385d8..f8a3be987 100644 --- a/src-ui/src/app/pipes/username.pipe.ts +++ b/src-ui/src/app/pipes/username.pipe.ts @@ -1,9 +1,10 @@ import { Pipe, PipeTransform } from '@angular/core' +import { catchError, map, Observable, of } from 'rxjs' import { User } from '../data/user' import { PermissionAction, - PermissionType, PermissionsService, + PermissionType, } from '../services/permissions.service' import { UserService } from '../services/rest/user.service' @@ -14,25 +15,29 @@ export class UsernamePipe implements PipeTransform { users: User[] constructor( - permissionsService: PermissionsService, - userService: UserService - ) { + private permissionsService: PermissionsService, + private userService: UserService + ) {} + + transform(userID: number): Observable { if ( - permissionsService.currentUserCan( + this.permissionsService.currentUserCan( PermissionAction.View, PermissionType.User ) ) { - userService.listAll().subscribe((r) => (this.users = r.results)) + return this.userService.listAll().pipe( + map((users) => { + this.users = users.results + return this.getName(this.users.find((u) => u.id === userID)) + }), + catchError(() => of('')) + ) + } else { + return of($localize`Shared`) } } - transform(userID: number): string { - return this.users - ? (this.getName(this.users.find((u) => u.id === userID)) ?? '') - : $localize`Shared` - } - getName(user: User): string { if (!user) return '' const name = [user.first_name, user.last_name].join(' ')