Browse Source

refactor: clean up user detail dialog and improve UI components

pull/5819/head
HydrallHarsh 2 weeks ago
parent
commit
68b626cf4e
  1. 13
      apps/client/src/app/components/admin-users/admin-users.component.ts
  2. 3
      apps/client/src/app/components/admin-users/admin-users.html
  3. 3
      apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts
  4. 17
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss
  5. 21
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts
  6. 14
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html

13
apps/client/src/app/components/admin-users/admin-users.component.ts

@ -80,7 +80,6 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
public displayedColumns: string[] = []; public displayedColumns: string[] = [];
public deviceType: string; public deviceType: string;
public getEmojiFlag = getEmojiFlag; public getEmojiFlag = getEmojiFlag;
public hasImpersonationId: boolean;
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public hasPermissionToImpersonateAllUsers: boolean; public hasPermissionToImpersonateAllUsers: boolean;
public info: InfoItem; public info: InfoItem;
@ -97,10 +96,10 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
private dataService: DataService, private dataService: DataService,
private deviceService: DeviceDetectorService, private deviceService: DeviceDetectorService,
private dialog: MatDialog, private dialog: MatDialog,
private route: ActivatedRoute,
private router: Router,
private impersonationStorageService: ImpersonationStorageService, private impersonationStorageService: ImpersonationStorageService,
private notificationService: NotificationService, private notificationService: NotificationService,
private route: ActivatedRoute,
private router: Router,
private tokenStorageService: TokenStorageService, private tokenStorageService: TokenStorageService,
private userService: UserService private userService: UserService
) { ) {
@ -153,17 +152,16 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
addIcons({ addIcons({
contractOutline, contractOutline,
ellipsisHorizontal, ellipsisHorizontal,
personOutline,
keyOutline, keyOutline,
personOutline,
trashOutline trashOutline
}); });
this.deviceType = this.deviceService.getDeviceInfo().deviceType; this.deviceType = this.deviceService.getDeviceInfo().deviceType;
this.hasImpersonationId = !!this.impersonationStorageService.getId();
this.route.queryParams this.route.queryParams
.pipe(takeUntil(this.unsubscribeSubject)) .pipe(takeUntil(this.unsubscribeSubject))
.subscribe((params) => { .subscribe((params) => {
if (params['userId'] && params['userDetailDialog']) { if (params['userDetailDialog'] && params['userId']) {
this.openUserDetailDialog(params['userId']); this.openUserDetailDialog(params['userId']);
} }
}); });
@ -185,9 +183,8 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
const dialogRef = this.dialog.open(GfUserDetailDialogComponent, { const dialogRef = this.dialog.open(GfUserDetailDialogComponent, {
autoFocus: false, autoFocus: false,
data: { data: {
userId: userId, userId,
deviceType: this.deviceType, deviceType: this.deviceType,
hasImpersonationId: this.hasImpersonationId,
userData: userData // Pass the user data userData: userData // Pass the user data
} as UserDetailDialogParams, } as UserDetailDialogParams,
height: this.deviceType === 'mobile' ? '80vh' : '60vh', height: this.deviceType === 'mobile' ? '80vh' : '60vh',

3
apps/client/src/app/components/admin-users/admin-users.html

@ -264,9 +264,8 @@
></tr> ></tr>
<tr <tr
*matRowDef="let row; columns: displayedColumns" *matRowDef="let row; columns: displayedColumns"
class="mat-mdc-row" class="cursor-pointer mat-mdc-row"
mat-row mat-row
style="cursor: pointer"
(click)="onOpenUserDetailDialog(row.id)" (click)="onOpenUserDetailDialog(row.id)"
></tr> ></tr>
</table> </table>

3
apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts

@ -1,8 +1,7 @@
import { AdminUsers } from '@ghostfolio/common/interfaces'; import { AdminUsers } from '@ghostfolio/common/interfaces';
export interface UserDetailDialogParams { export interface UserDetailDialogParams {
userId: string;
deviceType: string; deviceType: string;
hasImpersonationId: boolean;
userData?: AdminUsers['users'][0]; userData?: AdminUsers['users'][0];
userId: string;
} }

17
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss

@ -4,21 +4,4 @@
.mat-mdc-dialog-content { .mat-mdc-dialog-content {
max-height: unset; max-height: unset;
} }
.text-monospace {
font-family:
'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
font-size: 0.875rem;
}
small {
font-size: 0.75rem;
font-weight: 500;
}
h5 {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 1rem;
}
} }

21
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts

@ -1,6 +1,7 @@
import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component';
import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component';
import { User } from '@ghostfolio/common/interfaces'; import { User } from '@ghostfolio/common/interfaces';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {
@ -28,6 +29,7 @@ import { UserDetailDialogParams } from './interfaces/interfaces';
CommonModule, CommonModule,
GfDialogFooterComponent, GfDialogFooterComponent,
GfDialogHeaderComponent, GfDialogHeaderComponent,
GfValueComponent,
MatButtonModule, MatButtonModule,
MatDialogModule MatDialogModule
], ],
@ -37,11 +39,11 @@ import { UserDetailDialogParams } from './interfaces/interfaces';
templateUrl: './user-detail-dialog.html' templateUrl: './user-detail-dialog.html'
}) })
export class GfUserDetailDialogComponent implements OnDestroy, OnInit { export class GfUserDetailDialogComponent implements OnDestroy, OnInit {
private unsubscribeSubject = new Subject<void>(); public isLoading = false;
public registrationDate: Date;
public user: User; public user: User;
public userId: string; public userId: string;
public registrationDate: Date; private unsubscribeSubject = new Subject<void>();
public isLoading = false;
public constructor( public constructor(
private changeDetectorRef: ChangeDetectorRef, private changeDetectorRef: ChangeDetectorRef,
@ -52,18 +54,14 @@ export class GfUserDetailDialogComponent implements OnDestroy, OnInit {
addIcons({ personOutline }); addIcons({ personOutline });
} }
public ngOnInit(): void { public ngOnInit() {
this.initialize(); this.initialize();
} }
public onClose(): void { public onClose() {
this.dialogRef.close(); this.dialogRef.close();
} }
private initialize(): void {
this.fetchUserDetails();
}
private fetchUserDetails(): void { private fetchUserDetails(): void {
this.isLoading = true; this.isLoading = true;
@ -81,8 +79,11 @@ export class GfUserDetailDialogComponent implements OnDestroy, OnInit {
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
} }
} }
private initialize() {
this.fetchUserDetails();
}
public ngOnDestroy(): void { public ngOnDestroy() {
this.unsubscribeSubject.next(); this.unsubscribeSubject.next();
this.unsubscribeSubject.complete(); this.unsubscribeSubject.complete();
} }

14
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html

@ -9,22 +9,18 @@
<div class="container p-0"> <div class="container p-0">
<div class="row"> <div class="row">
<div class="col-12 mb-3"> <div class="col-12 mb-3">
<h5 i18n>User Information</h5> <gf-value i18n size="medium">User Information</gf-value>
</div> </div>
</div> </div>
<div class="mb-3 row"> <div class="mb-3 row">
<div class="col-6 mb-3"> <div class="col-6 mb-3">
<div class="d-flex flex-column"> <gf-value i18n size="small" [value]="userId">User ID</gf-value>
<small class="text-muted mb-1" i18n>User ID</small>
<span class="text-monospace">{{ userId }}</span>
</div>
</div> </div>
<div class="col-6 mb-3"> <div class="col-6 mb-3">
<div class="d-flex flex-column"> <gf-value i18n size="small" [value]="registrationDate | date: 'medium'"
<small class="text-muted mb-1" i18n>Registration Date</small> >Registration Date</gf-value
<span>{{ registrationDate | date: 'medium' }}</span> >
</div>
</div> </div>
</div> </div>
</div> </div>

Loading…
Cancel
Save