mirror of https://github.com/ghostfolio/ghostfolio
6 changed files with 226 additions and 1 deletions
@ -0,0 +1,8 @@ |
|||||
|
import { AdminUsers } from '@ghostfolio/common/interfaces'; |
||||
|
|
||||
|
export interface UserDetailDialogParams { |
||||
|
userId: string; |
||||
|
deviceType: string; |
||||
|
hasImpersonationId: boolean; |
||||
|
userData?: AdminUsers['users'][0]; |
||||
|
} |
||||
@ -0,0 +1,24 @@ |
|||||
|
:host { |
||||
|
display: block; |
||||
|
|
||||
|
.mat-mdc-dialog-content { |
||||
|
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; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,89 @@ |
|||||
|
import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; |
||||
|
import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; |
||||
|
import { User } from '@ghostfolio/common/interfaces'; |
||||
|
|
||||
|
import { CommonModule } from '@angular/common'; |
||||
|
import { |
||||
|
ChangeDetectionStrategy, |
||||
|
Component, |
||||
|
CUSTOM_ELEMENTS_SCHEMA, |
||||
|
Inject, |
||||
|
OnDestroy, |
||||
|
OnInit, |
||||
|
ChangeDetectorRef |
||||
|
} from '@angular/core'; |
||||
|
import { MatButtonModule } from '@angular/material/button'; |
||||
|
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; |
||||
|
import { MatDialogModule } from '@angular/material/dialog'; |
||||
|
import { addIcons } from 'ionicons'; |
||||
|
import { personOutline } from 'ionicons/icons'; |
||||
|
import { Subject } from 'rxjs'; |
||||
|
|
||||
|
import { UserDetailDialogParams } from './interfaces/interfaces'; |
||||
|
|
||||
|
@Component({ |
||||
|
changeDetection: ChangeDetectionStrategy.OnPush, |
||||
|
host: { class: 'd-flex flex-column h-100' }, |
||||
|
imports: [ |
||||
|
CommonModule, |
||||
|
GfDialogFooterComponent, |
||||
|
GfDialogHeaderComponent, |
||||
|
MatButtonModule, |
||||
|
MatDialogModule |
||||
|
], |
||||
|
schemas: [CUSTOM_ELEMENTS_SCHEMA], |
||||
|
selector: 'gf-user-detail-dialog', |
||||
|
styleUrls: ['./user-detail-dialog.component.scss'], |
||||
|
templateUrl: './user-detail-dialog.html' |
||||
|
}) |
||||
|
export class GfUserDetailDialogComponent implements OnDestroy, OnInit { |
||||
|
private unsubscribeSubject = new Subject<void>(); |
||||
|
public user: User; |
||||
|
public userId: string; |
||||
|
public registrationDate: Date; |
||||
|
public isLoading = false; |
||||
|
|
||||
|
public constructor( |
||||
|
private changeDetectorRef: ChangeDetectorRef, |
||||
|
@Inject(MAT_DIALOG_DATA) public data: UserDetailDialogParams, |
||||
|
public dialogRef: MatDialogRef<GfUserDetailDialogComponent> |
||||
|
) { |
||||
|
this.userId = this.data.userId; |
||||
|
addIcons({ personOutline }); |
||||
|
} |
||||
|
|
||||
|
public ngOnInit(): void { |
||||
|
this.initialize(); |
||||
|
} |
||||
|
|
||||
|
public onClose(): void { |
||||
|
this.dialogRef.close(); |
||||
|
} |
||||
|
|
||||
|
private initialize(): void { |
||||
|
this.fetchUserDetails(); |
||||
|
} |
||||
|
|
||||
|
private fetchUserDetails(): void { |
||||
|
this.isLoading = true; |
||||
|
|
||||
|
// Use the user data passed from the admin users list if available
|
||||
|
if (this.data.userData) { |
||||
|
this.userId = this.data.userData.id; |
||||
|
this.registrationDate = this.data.userData.createdAt; |
||||
|
this.isLoading = false; |
||||
|
this.changeDetectorRef.markForCheck(); |
||||
|
} else { |
||||
|
// Fallback: use the user ID and set a placeholder registration date
|
||||
|
this.userId = this.data.userId; |
||||
|
this.registrationDate = new Date(); // Placeholder
|
||||
|
this.isLoading = false; |
||||
|
this.changeDetectorRef.markForCheck(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public ngOnDestroy(): void { |
||||
|
this.unsubscribeSubject.next(); |
||||
|
this.unsubscribeSubject.complete(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
<gf-dialog-header |
||||
|
position="center" |
||||
|
[deviceType]="data.deviceType" |
||||
|
[title]="userId" |
||||
|
(closeButtonClicked)="onClose()" |
||||
|
/> |
||||
|
|
||||
|
<div class="flex-grow-1" mat-dialog-content> |
||||
|
<div class="container p-0"> |
||||
|
<div class="row"> |
||||
|
<div class="col-12 mb-3"> |
||||
|
<h5 i18n>User Information</h5> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="mb-3 row"> |
||||
|
<div class="col-6 mb-3"> |
||||
|
<div class="d-flex flex-column"> |
||||
|
<small class="text-muted mb-1" i18n>User ID</small> |
||||
|
<span class="text-monospace">{{ userId }}</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-6 mb-3"> |
||||
|
<div class="d-flex flex-column"> |
||||
|
<small class="text-muted mb-1" i18n>Registration Date</small> |
||||
|
<span>{{ registrationDate | date: 'medium' }}</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<gf-dialog-footer |
||||
|
[deviceType]="data.deviceType" |
||||
|
(closeButtonClicked)="onClose()" |
||||
|
/> |
||||
Loading…
Reference in new issue