Skip to content

Commit d6aa606

Browse files
authored
Merge pull request #208 from Toastbrot236/role
Show user role on previews and user page
2 parents 7140561 + 9a3e7e0 commit d6aa606

File tree

6 files changed

+94
-7
lines changed

6 files changed

+94
-7
lines changed

src/app/components/items/user-preview.component.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@ import {UserAvatarComponent} from "../ui/photos/user-avatar.component";
66

77
import {UserStatisticsComponent} from "./user-statistics.component";
88
import {UserStatusComponent} from "../ui/info/user-status.component";
9+
import { UserRoleComponent } from "../ui/info/user-role.component";
910

1011
@Component({
1112
selector: 'app-user-preview',
1213
imports: [
1314
UserRouterLinkComponent,
1415
UserAvatarComponent,
1516
UserStatisticsComponent,
16-
UserStatusComponent
17+
UserStatusComponent,
18+
UserRoleComponent
1719
],
1820
template: `
1921
<div class="flex gap-x-2.5 leading-none justify-center">
@@ -22,7 +24,8 @@ import {UserStatusComponent} from "../ui/info/user-status.component";
2224
</app-user-router-link>
2325
<div class="truncate grow">
2426
<app-user-router-link [user]="user">
25-
<p class="font-medium text-lg truncate" [title]=user.username>{{ user.username }}</p>
27+
<span class="font-medium text-lg truncate pr-1" [title]=user.username>{{ user.username }}</span>
28+
<app-user-role [role]="user.role"></app-user-role>
2629
</app-user-router-link>
2730
2831
<app-user-statistics [stats]="user.statistics" [ownRelations]="user.ownRelations" class="text-sm"></app-user-statistics>

src/app/components/ui/header/header-me-menu.component.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {UserStatisticsComponent} from "../../items/user-statistics.component";
88

99
import {DividerComponent} from "../divider.component";
1010
import {NavItem} from "./navtypes";
11+
import { UserRoleComponent } from "../info/user-role.component";
1112

1213
@Component({
1314
selector: 'app-header-me-menu',
@@ -16,7 +17,8 @@ import {NavItem} from "./navtypes";
1617
UserAvatarComponent,
1718
UserRouterLinkComponent,
1819
UserStatisticsComponent,
19-
DividerComponent
20+
DividerComponent,
21+
UserRoleComponent
2022
],
2123
template: `
2224
<div class="absolute z-1 w-64 px-5 py-2.5 flex flex-col rounded-b bg-header-background gap-y-2 right-0 drop-shadow-md">
@@ -26,7 +28,8 @@ import {NavItem} from "./navtypes";
2628
</app-user-router-link>
2729
<div class="truncate grow">
2830
<app-user-router-link [user]="user">
29-
<p class="font-medium text-lg truncate text-" [title]=user.username>{{ user.username }}</p>
31+
<span class="font-medium text-lg truncate text-" [title]=user.username>{{ user.username }}</span>
32+
<app-user-role [role]="user.role" [short]="true"></app-user-role>
3033
</app-user-router-link>
3134
3235
<app-user-statistics [stats]="user.statistics" class="text-xs"></app-user-statistics>
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import {Component, Input} from '@angular/core';
2+
import { UserRoles } from '../../../api/types/users/user-roles';
3+
import { RolePipe } from '../../../pipes/role.pipe';
4+
import { FaIconComponent } from "@fortawesome/angular-fontawesome";
5+
import { IconProp } from '@fortawesome/fontawesome-svg-core';
6+
import { faUser, faUserAltSlash, faUserAstronaut, faUserCheck, faUserGear, faUserLock, faUserPen, faUserShield } from '@fortawesome/free-solid-svg-icons';
7+
import { TooltipComponent } from "../text/tooltip.component";
8+
9+
@Component({
10+
selector: 'app-user-role',
11+
imports: [
12+
RolePipe,
13+
FaIconComponent,
14+
TooltipComponent
15+
],
16+
providers: [
17+
RolePipe
18+
],
19+
template: `
20+
<!-- for some reason Angular doesn't escape the ' if it's prefixed by only one backslash here specifically-->
21+
<app-tooltip [text]="'This user\\\'s role is ' + (role | role)" >
22+
<span class="pl-1 text-gentle text-md">
23+
@if (roleIcon) {
24+
<fa-icon class="text-sm" [icon]="roleIcon"></fa-icon>
25+
}
26+
@if (!short) {
27+
<span class="pl-1">{{ role | role }}</span>
28+
}
29+
</span>
30+
</app-tooltip>
31+
32+
`
33+
})
34+
export class UserRoleComponent {
35+
@Input({required: true}) role: UserRoles = UserRoles.User;
36+
@Input() short: boolean = false;
37+
roleIcon: IconProp | undefined;
38+
39+
ngOnInit() {
40+
switch (this.role) {
41+
case UserRoles.Admin:
42+
this.roleIcon = this.faUserGear;
43+
break;
44+
case UserRoles.Moderator:
45+
this.roleIcon = this.faUserShield;
46+
break;
47+
case UserRoles.Curator:
48+
this.roleIcon = this.faUserPen;
49+
break;
50+
case UserRoles.Trusted:
51+
this.roleIcon = this.faUserCheck;
52+
break;
53+
case UserRoles.User:
54+
this.roleIcon = this.faUser;
55+
break;
56+
case UserRoles.Restricted:
57+
this.roleIcon = this.faUserLock;
58+
break;
59+
case UserRoles.Banned:
60+
this.roleIcon = this.faUserAltSlash;
61+
break;
62+
default:
63+
this.roleIcon = this.faUserAstronaut;
64+
break;
65+
}
66+
}
67+
68+
protected readonly faUserGear = faUserGear;
69+
protected readonly faUserShield = faUserShield;
70+
protected readonly faUserPen = faUserPen;
71+
protected readonly faUserCheck = faUserCheck;
72+
protected readonly faUser = faUser;
73+
protected readonly faUserAltSlash = faUserAltSlash;
74+
protected readonly faUserLock = faUserLock;
75+
protected readonly faUserAstronaut = faUserAstronaut;
76+
}

src/app/components/ui/text/wrappers/user-wrapper.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {User} from "../../../../api/types/users/user";
88
selector: 'app-user-wrapper',
99
imports: [
1010
UserAvatarComponent,
11-
UserRouterLinkComponent
11+
UserRouterLinkComponent,
1212
],
1313
template: `
1414
<div class="flex gap-x-1.5">

src/app/pages/user/user.component.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
[description]="user.description | default: user.username + ' hasn\'t introduced themselves yet.'">
44
<app-user-avatar [user]="user" [size]="(layout.isMobile | async) ? 90 : 176" avatar></app-user-avatar>
55
<ng-container titleSubtext>
6+
<app-user-role [role]="user.role"></app-user-role>
7+
</ng-container>
8+
<div belowTitleRight class="italic text-gentle">
69
Joined
710
<app-date [date]="user.joinDate"></app-date>
811
<br>
9-
</ng-container>
12+
</div>
1013
<ng-container belowTitle>
1114
<app-user-status [activeRoom]="user.activeRoom" [lastSeen]="user.lastLoginDate"></app-user-status>
1215
</ng-container>

src/app/pages/user/user.component.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { UserRelations } from '../../api/types/users/user-relations';
1515
import { FancyHeaderUserButtonsComponent } from "../../components/ui/layouts/fancy-header-user-buttons.component";
1616
import { ExtendedUser } from '../../api/types/users/extended-user';
1717
import { AuthenticationService } from '../../api/authentication.service';
18+
import { UserRoleComponent } from "../../components/ui/info/user-role.component";
1819

1920
@Component({
2021
selector: 'app-user',
@@ -26,7 +27,8 @@ import { AuthenticationService } from '../../api/authentication.service';
2627
AsyncPipe,
2728
UserStatusComponent,
2829
UserStatisticsComponent,
29-
FancyHeaderUserButtonsComponent
30+
FancyHeaderUserButtonsComponent,
31+
UserRoleComponent
3032
],
3133
templateUrl: './user.component.html',
3234
styles: ``

0 commit comments

Comments
 (0)