feat: add setup page
This commit is contained in:
		
							
								
								
									
										32
									
								
								src/pages/setup/setup.component.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/pages/setup/setup.component.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | .setup p { | ||||||
|  |   letter-spacing: 0.55px; | ||||||
|  |   font-size: 16px; | ||||||
|  |   line-height: 26px; | ||||||
|  |   margin: 15px 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .setup .secondary { | ||||||
|  |   filter: brightness(0.8); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .setup hr { | ||||||
|  |   margin: 10px 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .setup { | ||||||
|  |   display: flex; | ||||||
|  |   padding: 20px; | ||||||
|  |   justify-content: center; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .setup-card { | ||||||
|  |   padding: 15px 20px; | ||||||
|  |   max-width: 750px; | ||||||
|  |   width: 100%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .setup-navigation { | ||||||
|  |   display: flex; | ||||||
|  |   justify-content: space-between; | ||||||
|  |   margin: 15px 0; | ||||||
|  | } | ||||||
							
								
								
									
										32
									
								
								src/pages/setup/setup.component.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/pages/setup/setup.component.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | <mat-sidenav-container> | ||||||
|  |   <div class="setup"> | ||||||
|  |     <mat-card class="setup-card"> | ||||||
|  |       <router-outlet/> | ||||||
|  |       <div class="setup-navigation"> | ||||||
|  |         <div> | ||||||
|  |           <button mat-flat-button color="accent" | ||||||
|  |                   [disabled]="previousButtonDisabled" | ||||||
|  |                   [hidden]="previousButtonRoute === ''" | ||||||
|  |                   (click)="onPreviousClick()" | ||||||
|  |                   [routerLink]="previousButtonRoute"> | ||||||
|  |             Назад | ||||||
|  |           </button> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         @if (loaderActive) { | ||||||
|  |           <app-data-spinner [scale]="40"/> | ||||||
|  |         } @else { | ||||||
|  |           <button mat-flat-button color="accent" | ||||||
|  |                   [disabled]="nextButtonDisabled" | ||||||
|  |                   (click)="onNextClick()"> | ||||||
|  |             @if (getIndex === routes.length - 1) { | ||||||
|  |               Завершить | ||||||
|  |             } @else { | ||||||
|  |               Далее | ||||||
|  |             } | ||||||
|  |           </button> | ||||||
|  |         } | ||||||
|  |       </div> | ||||||
|  |     </mat-card> | ||||||
|  |   </div> | ||||||
|  | </mat-sidenav-container> | ||||||
							
								
								
									
										101
									
								
								src/pages/setup/setup.component.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								src/pages/setup/setup.component.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | |||||||
|  | import {Component, ViewEncapsulation} from '@angular/core'; | ||||||
|  | import {MatSidenavModule} from "@angular/material/sidenav"; | ||||||
|  | import {Router, RouterLink, 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"; | ||||||
|  |  | ||||||
|  | @Component({ | ||||||
|  |   selector: 'app-setup', | ||||||
|  |   standalone: true, | ||||||
|  |   imports: [ | ||||||
|  |     MatSidenavModule, | ||||||
|  |     RouterOutlet, | ||||||
|  |     MatCard, | ||||||
|  |     MatButton, | ||||||
|  |     RouterLink, | ||||||
|  |     DataSpinnerComponent | ||||||
|  |   ], | ||||||
|  |   templateUrl: './setup.component.html', | ||||||
|  |   styleUrl: './setup.component.css', | ||||||
|  |   encapsulation: ViewEncapsulation.None, | ||||||
|  |   providers: [SetupService] | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | export class SetupComponent { | ||||||
|  |   protected previousButtonDisabled: boolean = false; | ||||||
|  |   protected previousButtonRoute: string = ''; | ||||||
|  |  | ||||||
|  |   protected nextButtonDisabled: boolean = false; | ||||||
|  |   protected nextButtonRoute!: string; | ||||||
|  |  | ||||||
|  |   protected loaderActive: boolean = false; | ||||||
|  |  | ||||||
|  |   protected routes: Array<string> = ['', 'welcome', 'database', 'cache', 'create-admin', 'schedule', 'logging', 'summary']; | ||||||
|  |   private index: number = 1; | ||||||
|  |  | ||||||
|  |   protected get getIndex() { | ||||||
|  |     return this.index; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   constructor(private router: Router, private navigationService: NavigationService, api: SetupService) { | ||||||
|  |     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.setRoutes(); | ||||||
|  |     this.navigationService.nextButtonState$.subscribe(state => { | ||||||
|  |       this.nextButtonDisabled = !state; | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     this.navigationService.skipNavigation.subscribe(action => { | ||||||
|  |       this.executeAction(action); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private setRoutes() { | ||||||
|  |     this.previousButtonRoute = this.routes[this.index - 1]; | ||||||
|  |     this.nextButtonRoute = this.routes[this.index + 1]; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private executeAction(action: () => Observable<boolean>) { | ||||||
|  |     this.loaderActive = true; | ||||||
|  |     action().pipe( | ||||||
|  |       catchError(error => { | ||||||
|  |         this.nextButtonDisabled = true; | ||||||
|  |         this.loaderActive = false; | ||||||
|  |         throw error; | ||||||
|  |       }) | ||||||
|  |     ) | ||||||
|  |       .subscribe(x => { | ||||||
|  |         this.nextButtonDisabled = x; | ||||||
|  |         this.loaderActive = !x; | ||||||
|  |         if (x) { | ||||||
|  |           if (this.index < this.routes.length - 1) { | ||||||
|  |             this.router.navigate(['setup/', this.nextButtonRoute]).then(); | ||||||
|  |             this.index++; | ||||||
|  |             this.setRoutes(); | ||||||
|  |           } else | ||||||
|  |             this.router.navigate(['/']).then(); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   protected onNextClick() { | ||||||
|  |     this.executeAction(this.navigationService.nextButtonAction); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   protected onPreviousClick() { | ||||||
|  |     if (this.index - 1 > 0) { | ||||||
|  |       this.index--; | ||||||
|  |       this.setRoutes(); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user