import {Component} from '@angular/core'; import {FormBuilder, FormGroup, ReactiveFormsModule, ValidatorFn, 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"; import AuthApiService from "@api/v1/authApiService"; import {PasswordPolicy} from "@model/passwordPolicy"; import {OAuthProviders} from "@component/OAuthProviders/OAuthProviders"; import {OAuthProvider} from "@model/oAuthProvider"; @Component({ selector: 'app-create-admin', standalone: true, imports: [ ReactiveFormsModule, MatFormFieldModule, MatSelectModule, MatInput, MatTooltip, MatIconButton, MatIcon, OAuthProviders ], templateUrl: './create-admin.component.html', providers: [AuthApiService] }) export class CreateAdminComponent { protected createAdminForm!: FormGroup; protected hidePass = true; protected hideRetypePass = true; protected policy!: PasswordPolicy; protected activatedProviders: OAuthProvider[] = []; 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.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 } ); }; this.api.passwordPolicyConfiguration().subscribe(policy => { this.policy = policy; const passwordValidators = this.createPasswordValidators(policy); this.createAdminForm.get('password')?.setValidators(passwordValidators); this.createAdminForm.get('password')?.updateValueAndValidity(); }); this.api.adminConfiguration().subscribe(configuration => { if (configuration) { this.createAdminForm.get('email')?.setValue(configuration.email); this.createAdminForm.get('user')?.setValue(configuration.username); this.activatedProviders = configuration.usedOAuthProviders; } }); } private createPasswordValidators(policy: PasswordPolicy): ValidatorFn[] { const validators: ValidatorFn[] = [Validators.required]; if (policy.minimumLength) { validators.push(Validators.minLength(policy.minimumLength)); } if (policy.requireLettersDifferentCase) { validators.push(Validators.pattern(/(?=.*[a-z])(?=.*[A-Z])/)); } else if (policy.requireLetter) { validators.push(Validators.pattern(/[A-Za-z]/)); } else if (policy.requireDigit) { validators.push(Validators.pattern(/\d/)); } if (policy.requireSpecialCharacter) { validators.push(Validators.pattern(/[!@#$%^&*(),.?":{}|<>]/)); } return validators; } protected togglePassword(event: MouseEvent) { this.hidePass = !this.hidePass; event.stopPropagation(); } protected toggleRetypePassword(event: MouseEvent) { this.hideRetypePass = !this.hideRetypePass; event.stopPropagation(); } }