feat: add setup/create-admin page
This commit is contained in:
		
							
								
								
									
										109
									
								
								src/pages/setup/create-admin/create-admin.component.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								src/pages/setup/create-admin/create-admin.component.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | ||||
| <h1>Создание администратора</h1> | ||||
| <hr/> | ||||
| <p class="mat-body-2 secondary"> | ||||
|   На этой странице вы можете создать учетную запись администратора. | ||||
| </p> | ||||
| <p class="mat-body-2 secondary"> | ||||
|   Заполните необходимые поля, такие как имя пользователя, адрес электронной почты и пароль, чтобы создать учетную запись | ||||
|   с правами администратора для управления приложением. | ||||
| </p> | ||||
|  | ||||
| <form [formGroup]="createAdminForm"> | ||||
|   <p> | ||||
|     Ведите данные для создания аккаунта администратора: | ||||
|   </p> | ||||
|   <div style="display:flex; flex-direction: column;"> | ||||
|     <mat-form-field color="accent"> | ||||
|       <mat-label>Имя пользователя</mat-label> | ||||
|       <input matInput | ||||
|              matTooltip='Укажите имя пользователя используя латинские буквы и цифры без пробелов' | ||||
|              required | ||||
|              formControlName="user"> | ||||
|  | ||||
|       @if (createAdminForm.get('user')?.hasError('required')) { | ||||
|         <mat-error> | ||||
|           Имя пользователя является <i>обязательным</i> | ||||
|         </mat-error> | ||||
|       } | ||||
|  | ||||
|       @if (createAdminForm.get('user')?.hasError('pattern')) { | ||||
|         <mat-error> | ||||
|           Имя пользователя должен содержать латинские сиволы и цифры и быть не менее 4 символов | ||||
|         </mat-error> | ||||
|       } | ||||
|     </mat-form-field> | ||||
|  | ||||
|     <mat-form-field color="accent"> | ||||
|       <mat-label>Email</mat-label> | ||||
|       <input matInput | ||||
|              matTooltip="Укажите email администратора" | ||||
|              required | ||||
|              formControlName="email"> | ||||
|  | ||||
|       @if (createAdminForm.get('email')?.hasError('required')) { | ||||
|         <mat-error> | ||||
|           Email является <i>обязательным</i> | ||||
|         </mat-error> | ||||
|       } | ||||
|  | ||||
|       @if (createAdminForm.get('email')?.hasError('email')) { | ||||
|         <mat-error> | ||||
|           Введите корректный Email адрес | ||||
|         </mat-error> | ||||
|       } | ||||
|     </mat-form-field> | ||||
|  | ||||
|     <mat-form-field color="accent" style="margin-bottom: 20px"> | ||||
|       <mat-label>Пароль</mat-label> | ||||
|       <input matInput | ||||
|              matTooltip="Укажите пароль" | ||||
|              formControlName="password" | ||||
|              required | ||||
|              [type]="hidePass ? 'password' : 'text'"> | ||||
|  | ||||
|       <button mat-icon-button matSuffix (click)="togglePassword($event)" [attr.aria-label]="'Hide password'" | ||||
|               [attr.aria-pressed]="hidePass"> | ||||
|         <mat-icon>{{ hidePass ? 'visibility_off' : 'visibility' }}</mat-icon> | ||||
|       </button> | ||||
|  | ||||
|       @if (createAdminForm.get('password')?.hasError('required')) { | ||||
|         <mat-error> | ||||
|           Пароль является <i>обязательным</i> | ||||
|         </mat-error> | ||||
|       } | ||||
|  | ||||
|       @if (createAdminForm.get('password')?.hasError('minlength')) { | ||||
|         <mat-error> | ||||
|           Пароль должен быть не менее 8 символов | ||||
|         </mat-error> | ||||
|       } | ||||
|  | ||||
|       @if (createAdminForm.get('password')?.hasError('pattern')) { | ||||
|         <mat-error> | ||||
|           Пароль должен содержать хотя бы один латинский символ верхнего регистра и специальный символ (!@#$%^&*) | ||||
|         </mat-error> | ||||
|       } | ||||
|     </mat-form-field> | ||||
|  | ||||
|     <mat-form-field color="accent"> | ||||
|       <mat-label>Повторите пароль</mat-label> | ||||
|       <input matInput | ||||
|              matTooltip="Укажите пароль, который был указан ранее" | ||||
|              formControlName="retype" | ||||
|              required | ||||
|              [type]="hideRetypePass ? 'password' : 'text'" | ||||
|              onpaste="return false;"> | ||||
|  | ||||
|       <button mat-icon-button matSuffix (click)="toggleRetypePassword($event)" [attr.aria-label]="'Hide password'" | ||||
|               [attr.aria-pressed]="hideRetypePass"> | ||||
|         <mat-icon>{{ hideRetypePass ? 'visibility_off' : 'visibility' }}</mat-icon> | ||||
|       </button> | ||||
|  | ||||
|       @if (createAdminForm.get('retype')?.hasError('passwordsMismatch')) { | ||||
|         <mat-error> | ||||
|           Пароли не совпадают | ||||
|         </mat-error> | ||||
|       } | ||||
|     </mat-form-field> | ||||
|   </div> | ||||
| </form> | ||||
							
								
								
									
										74
									
								
								src/pages/setup/create-admin/create-admin.component.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/pages/setup/create-admin/create-admin.component.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| import {Component} from '@angular/core'; | ||||
| import {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from "@angular/forms"; | ||||
| import {NavigationService} from "@service/navigation.service"; | ||||
| import {passwordMatchValidator} from '@service/password-match.validator'; | ||||
| import SetupService from "@api/v1/setup.service"; | ||||
| import {MatFormFieldModule} from "@angular/material/form-field"; | ||||
| import {MatSelectModule} from "@angular/material/select"; | ||||
| import {MatInput} from "@angular/material/input"; | ||||
| import {MatTooltip} from "@angular/material/tooltip"; | ||||
| import {MatIconButton} from "@angular/material/button"; | ||||
| import {MatIcon} from "@angular/material/icon"; | ||||
|  | ||||
| @Component({ | ||||
|   selector: 'app-create-admin', | ||||
|   standalone: true, | ||||
|   imports: [ | ||||
|     ReactiveFormsModule, | ||||
|     MatFormFieldModule, | ||||
|     MatSelectModule, | ||||
|     MatInput, | ||||
|     MatTooltip, | ||||
|     MatIconButton, | ||||
|     MatIcon | ||||
|   ], | ||||
|   templateUrl: './create-admin.component.html' | ||||
| }) | ||||
|  | ||||
| export class CreateAdminComponent { | ||||
|   protected createAdminForm!: FormGroup; | ||||
|   protected hidePass = true; | ||||
|   protected hideRetypePass = true; | ||||
|  | ||||
|   constructor( | ||||
|     private navigationService: NavigationService, private formBuilder: FormBuilder, private api: SetupService) { | ||||
|     this.createAdminForm = this.formBuilder.group({ | ||||
|         user: ['', Validators.pattern(/^([A-Za-z0-9]){4,}$/)], | ||||
|         email: ['', Validators.email], | ||||
|         password: ['', Validators.required], | ||||
|         retype: ['', Validators.required] | ||||
|       }, | ||||
|       {validators: passwordMatchValidator('password', 'retype')} | ||||
|     ); | ||||
|  | ||||
|     this.createAdminForm.get('password')?.setValidators([Validators.required, | ||||
|       Validators.pattern(/[A-Z]/), | ||||
|       Validators.pattern(/[!@#$%^&*]/), | ||||
|       Validators.minLength(8) | ||||
|     ]); | ||||
|  | ||||
|     this.navigationService.setNextButtonState(false); | ||||
|     this.createAdminForm.valueChanges.subscribe(() => { | ||||
|       this.navigationService.setNextButtonState(this.createAdminForm.valid); | ||||
|     }); | ||||
|  | ||||
|     this.navigationService.nextButtonAction = () => { | ||||
|       return this.api.createAdmin({ | ||||
|           "email": this.createAdminForm.get('email')?.value, | ||||
|           "username": this.createAdminForm.get('user')?.value, | ||||
|           "password": this.createAdminForm.get('password')?.value | ||||
|         } | ||||
|       ); | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   protected togglePassword(event: MouseEvent) { | ||||
|     this.hidePass = !this.hidePass; | ||||
|     event.stopPropagation(); | ||||
|   } | ||||
|  | ||||
|   protected toggleRetypePassword(event: MouseEvent) { | ||||
|     this.hideRetypePass = !this.hideRetypePass; | ||||
|     event.stopPropagation(); | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user