129 lines
3.6 KiB
TypeScript
129 lines
3.6 KiB
TypeScript
import {Component, ViewEncapsulation} from '@angular/core';
|
|
import {MatSidenavModule} from "@angular/material/sidenav";
|
|
import {Router, RouterOutlet} from "@angular/router";
|
|
import {MatCard} from "@angular/material/card";
|
|
import {MatButton} from "@angular/material/button";
|
|
import {NavigationService} from "@service/navigation.service";
|
|
import {catchError, Observable} from "rxjs";
|
|
import {DataSpinnerComponent} from "@component/common/data-spinner/data-spinner.component";
|
|
import SetupService from "@api/v1/setup.service";
|
|
import {ToastrService} from "ngx-toastr";
|
|
|
|
@Component({
|
|
selector: 'app-setup',
|
|
standalone: true,
|
|
imports: [
|
|
MatSidenavModule,
|
|
RouterOutlet,
|
|
MatCard,
|
|
MatButton,
|
|
DataSpinnerComponent
|
|
],
|
|
templateUrl: './setup.component.html',
|
|
styleUrl: './setup.component.css',
|
|
encapsulation: ViewEncapsulation.None,
|
|
providers: [SetupService]
|
|
})
|
|
|
|
export class SetupComponent {
|
|
protected nextButtonDisabled: boolean = false;
|
|
protected skipButtonDisabled: boolean = false;
|
|
protected loaderActive: boolean = false;
|
|
|
|
protected routes: Array<string> = ['', 'welcome', 'database', 'cache', 'password-policy', 'schedule', 'logging', 'create-admin', 'two-factor', 'summary'];
|
|
private index: number = 1;
|
|
|
|
protected get getIndex() {
|
|
return this.index;
|
|
}
|
|
|
|
constructor(private router: Router, private navigationService: NavigationService, api: SetupService, private notify: ToastrService) {
|
|
api.isConfigured().subscribe(x => {
|
|
if (x) this.router.navigate(['/']).then();
|
|
});
|
|
|
|
if (!this.router.url.includes(this.routes[this.index])) {
|
|
this.router.navigate(['setup/', this.routes[this.index]]).then();
|
|
}
|
|
|
|
this.initializeButtonSubscriptions();
|
|
|
|
this.navigationService.autoSkipNavigation$.subscribe(action => {
|
|
if (!this.navigationService.isNavigationUserInitiated) {
|
|
this.executeAction(action);
|
|
}
|
|
});
|
|
}
|
|
|
|
private initializeButtonSubscriptions() {
|
|
this.navigationService.nextButtonState$.subscribe(state => {
|
|
this.nextButtonDisabled = !state;
|
|
});
|
|
|
|
this.navigationService.skipButtonState$.subscribe(state => {
|
|
this.skipButtonDisabled = !state;
|
|
});
|
|
}
|
|
|
|
private executeAction(action: () => Observable<boolean>) {
|
|
this.loaderActive = true;
|
|
action()
|
|
.pipe(
|
|
catchError(error => {
|
|
this.nextButtonDisabled = true;
|
|
this.loaderActive = false;
|
|
throw error;
|
|
})
|
|
)
|
|
.subscribe(success => {
|
|
if (success) {
|
|
this.moveToNextPage();
|
|
} else {
|
|
this.notify.error('Некорректно введены данные');
|
|
this.nextButtonDisabled = true;
|
|
}
|
|
|
|
this.loaderActive = false;
|
|
});
|
|
}
|
|
|
|
protected onSkipClick() {
|
|
this.navigationService.skipButtonAction().subscribe(success => {
|
|
if (success) {
|
|
this.moveToNextPage();
|
|
}
|
|
});
|
|
}
|
|
|
|
protected onNextClick() {
|
|
this.executeAction(this.navigationService.nextButtonAction);
|
|
}
|
|
|
|
protected onPreviousClick() {
|
|
this.navigationService.setUserInitiatedNavigation(true);
|
|
this.moveToPreviousPage();
|
|
}
|
|
|
|
private moveToNextPage() {
|
|
if (this.index < this.routes.length - 1) {
|
|
this.index++;
|
|
this.router.navigate(['setup/', this.routes[this.index]]).then();
|
|
this.initializePage();
|
|
} else {
|
|
this.router.navigate(['/']).then();
|
|
}
|
|
}
|
|
|
|
private moveToPreviousPage() {
|
|
if (this.index > 0) {
|
|
this.index--;
|
|
this.router.navigate(['setup/', this.routes[this.index]]).then();
|
|
this.initializePage();
|
|
}
|
|
}
|
|
|
|
private initializePage() {
|
|
this.navigationService.resetButtonStates();
|
|
}
|
|
}
|