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(' ')