mirror of https://github.com/ghostfolio/ghostfolio
committed by
GitHub
7 changed files with 151 additions and 72 deletions
@ -1,19 +1,58 @@ |
|||
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; |
|||
import { MAT_DIALOG_DATA } from '@angular/material/dialog'; |
|||
import { DataService } from '@ghostfolio/client/services/data.service'; |
|||
|
|||
import { |
|||
ChangeDetectionStrategy, |
|||
ChangeDetectorRef, |
|||
Component, |
|||
ViewChild |
|||
} from '@angular/core'; |
|||
import { MatStepper } from '@angular/material/stepper'; |
|||
import { Subject } from 'rxjs'; |
|||
import { takeUntil } from 'rxjs/operators'; |
|||
|
|||
@Component({ |
|||
selector: 'gf-show-access-token-dialog', |
|||
changeDetection: ChangeDetectionStrategy.OnPush, |
|||
selector: 'gf-show-access-token-dialog', |
|||
standalone: false, |
|||
styleUrls: ['./show-access-token-dialog.scss'], |
|||
templateUrl: 'show-access-token-dialog.html', |
|||
standalone: false |
|||
templateUrl: 'show-access-token-dialog.html' |
|||
}) |
|||
export class ShowAccessTokenDialog { |
|||
public isAgreeButtonDisabled = true; |
|||
@ViewChild(MatStepper) stepper!: MatStepper; |
|||
|
|||
public accessToken: string; |
|||
public authToken: string; |
|||
public isCreateAccountButtonDisabled = true; |
|||
public isDisclaimerChecked = false; |
|||
public role: string; |
|||
|
|||
private unsubscribeSubject = new Subject<void>(); |
|||
|
|||
public constructor( |
|||
private changeDetectorRef: ChangeDetectorRef, |
|||
private dataService: DataService |
|||
) {} |
|||
|
|||
public constructor(@Inject(MAT_DIALOG_DATA) public data: any) {} |
|||
public createAccount() { |
|||
this.dataService |
|||
.postUser() |
|||
.pipe(takeUntil(this.unsubscribeSubject)) |
|||
.subscribe(({ accessToken, authToken, role }) => { |
|||
this.accessToken = accessToken; |
|||
this.authToken = authToken; |
|||
this.role = role; |
|||
|
|||
this.stepper.next(); |
|||
|
|||
this.changeDetectorRef.markForCheck(); |
|||
}); |
|||
} |
|||
|
|||
public enableCreateAccountButton() { |
|||
this.isCreateAccountButtonDisabled = false; |
|||
} |
|||
|
|||
public enableAgreeButton() { |
|||
this.isAgreeButtonDisabled = false; |
|||
public onChangeDislaimerChecked() { |
|||
this.isDisclaimerChecked = !this.isDisclaimerChecked; |
|||
} |
|||
} |
|||
|
@ -1,48 +1,93 @@ |
|||
<h1 mat-dialog-title> |
|||
<span i18n>Create Account</span> |
|||
@if (data.role === 'ADMIN') { |
|||
<span class="badge badge-light ml-2">{{ data.role }}</span> |
|||
@if (role === 'ADMIN') { |
|||
<span class="badge badge-light ml-2">{{ role }}</span> |
|||
} |
|||
</h1> |
|||
<div class="py-3" mat-dialog-content> |
|||
<div> |
|||
<mat-form-field appearance="outline" class="w-100"> |
|||
<mat-label i18n>Security Token</mat-label> |
|||
<textarea |
|||
cdkTextareaAutosize |
|||
matInput |
|||
readonly |
|||
type="text" |
|||
[(value)]="data.accessToken" |
|||
></textarea> |
|||
<div class="float-right mt-3"> |
|||
<button |
|||
color="secondary" |
|||
mat-flat-button |
|||
[cdkCopyToClipboard]="data.accessToken" |
|||
(click)="enableAgreeButton()" |
|||
<div class="px-0" mat-dialog-content> |
|||
<mat-stepper #stepper animationDuration="0ms" linear> |
|||
<mat-step editable="false" [completed]="isDisclaimerChecked"> |
|||
<ng-template i18n matStepLabel>Terms and Conditions</ng-template> |
|||
<div class="pt-2"> |
|||
<ng-container i18n |
|||
>Please keep your security token safe. If you lose it, you will not be |
|||
able to recover your account.</ng-container |
|||
> |
|||
<ion-icon class="mr-1" name="copy-outline" /><span i18n |
|||
>Copy to clipboard</span |
|||
</div> |
|||
<mat-checkbox |
|||
class="pt-2" |
|||
color="primary" |
|||
(change)="onChangeDislaimerChecked()" |
|||
> |
|||
<ng-container i18n |
|||
>I understand that if I lose my security token, I cannot recover my |
|||
account.</ng-container |
|||
> |
|||
</mat-checkbox> |
|||
<div class="mt-3" mat-dialog-actions> |
|||
<div class="flex-grow-1"> |
|||
<button i18n mat-button [mat-dialog-close]="undefined">Cancel</button> |
|||
</div> |
|||
<div> |
|||
<button |
|||
color="primary" |
|||
mat-flat-button |
|||
[disabled]="!isDisclaimerChecked" |
|||
(click)="createAccount()" |
|||
> |
|||
</button> |
|||
<ng-container i18n>Continue</ng-container> |
|||
</button> |
|||
</div> |
|||
</div> |
|||
</mat-form-field> |
|||
</div> |
|||
<p i18n> |
|||
I agree to have stored my <i>Security Token</i> from above in a secure |
|||
place. If I lose it, I cannot get my account back. |
|||
</p> |
|||
</div> |
|||
<div class="justify-content-end" mat-dialog-actions> |
|||
<button i18n mat-flat-button [mat-dialog-close]="undefined">Cancel</button> |
|||
<button |
|||
color="primary" |
|||
mat-flat-button |
|||
[disabled]="isAgreeButtonDisabled" |
|||
[mat-dialog-close]="data" |
|||
> |
|||
<span i18n>Agree and continue</span> |
|||
<ion-icon class="ml-1" name="arrow-forward-outline" /> |
|||
</button> |
|||
</mat-step> |
|||
<mat-step editable="false"> |
|||
<ng-template i18n matStepLabel>Security Token</ng-template> |
|||
<div class="pt-2"> |
|||
<ng-container i18n |
|||
>Here is your security token. It is only visible once, please store |
|||
and keep it in a safe place.</ng-container |
|||
> |
|||
</div> |
|||
<mat-form-field appearance="outline" class="pt-3 w-100 without-hint"> |
|||
<mat-label i18n>Security Token</mat-label> |
|||
<textarea |
|||
cdkTextareaAutosize |
|||
matInput |
|||
readonly |
|||
type="text" |
|||
[(value)]="accessToken" |
|||
></textarea> |
|||
<div class="float-right mt-1"> |
|||
<button |
|||
color="secondary" |
|||
mat-flat-button |
|||
[cdkCopyToClipboard]="accessToken" |
|||
(click)="enableCreateAccountButton()" |
|||
> |
|||
<ion-icon class="mr-1" name="copy-outline" /> |
|||
<span i18n>Copy to clipboard</span> |
|||
</button> |
|||
</div> |
|||
</mat-form-field> |
|||
<div align="end" class="mt-1" mat-dialog-actions> |
|||
<div> |
|||
<button |
|||
color="primary" |
|||
mat-flat-button |
|||
matStepperNext |
|||
[disabled]="isCreateAccountButtonDisabled" |
|||
[mat-dialog-close]="authToken" |
|||
> |
|||
<span i18n>Create Account</span> |
|||
<ion-icon class="ml-1" name="arrow-forward-outline" /> |
|||
</button> |
|||
</div> |
|||
</div> |
|||
</mat-step> |
|||
|
|||
<ng-template matStepperIcon="done"> |
|||
<ion-icon name="checkmark-outline"></ion-icon> |
|||
</ng-template> |
|||
</mat-stepper> |
|||
<div></div> |
|||
</div> |
|||
|
@ -1,2 +1,6 @@ |
|||
:host { |
|||
.mat-mdc-dialog-actions { |
|||
padding-left: 0 !important; |
|||
padding-right: 0 !important; |
|||
} |
|||
} |
|||
|
Loading…
Reference in new issue