mirror of
https://github.com/GNS3/gns3-web-ui.git
synced 2025-05-05 18:18:29 +00:00
update user password + confirm password validator
This commit is contained in:
parent
8df255ebc3
commit
b6b9d735f5
@ -312,6 +312,7 @@ import {MatFormFieldModule} from "@angular/material/form-field";
|
|||||||
import { PermissionsFilterPipe } from './components/permissions-management/permissions-filter.pipe';
|
import { PermissionsFilterPipe } from './components/permissions-management/permissions-filter.pipe';
|
||||||
import { DisplayPathPipe } from './components/permissions-management/display-path.pipe';
|
import { DisplayPathPipe } from './components/permissions-management/display-path.pipe';
|
||||||
import {RolePermissionsComponent} from "@components/role-management/role-detail/role-permissions/role-permissions.component";
|
import {RolePermissionsComponent} from "@components/role-management/role-detail/role-permissions/role-permissions.component";
|
||||||
|
import { ChangeUserPasswordComponent } from './components/user-management/user-detail/change-user-password/change-user-password.component';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [
|
declarations: [
|
||||||
@ -534,11 +535,9 @@ import {RolePermissionsComponent} from "@components/role-management/role-detail/
|
|||||||
FilterCompletePipe,
|
FilterCompletePipe,
|
||||||
UserPermissionsComponent,
|
UserPermissionsComponent,
|
||||||
PermissionsFilterPipe,
|
PermissionsFilterPipe,
|
||||||
FilterCompletePipe,
|
|
||||||
DisplayPathPipe,
|
|
||||||
RolePermissionsComponent,
|
RolePermissionsComponent,
|
||||||
DisplayPathPipe,
|
DisplayPathPipe,
|
||||||
PermissionsFilterPipe,
|
ChangeUserPasswordComponent,
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
import {AbstractControl, FormGroup, ValidationErrors, ValidatorFn} from '@angular/forms';
|
||||||
|
|
||||||
|
|
||||||
|
export function matchingPassword(control: AbstractControl) : ValidationErrors | null {
|
||||||
|
if (control.get('password').value !== control.get('confirmPassword').value) {
|
||||||
|
control.get('confirmPassword').setErrors({confirmPasswordMatch: true});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
@ -26,7 +26,12 @@
|
|||||||
<mat-error *ngIf="form.password?.touched && form.password?.errors"
|
<mat-error *ngIf="form.password?.touched && form.password?.errors"
|
||||||
>A password between 6 and 100 characters is required.</mat-error>
|
>A password between 6 and 100 characters is required.</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
|
<mat-form-field class="input-field">
|
||||||
|
<input matInput type="password" formControlName="confirmPassword" placeholder="Confirm Password"/>
|
||||||
|
<mat-error *ngIf="form.confirmPassword?.touched && form.confirmPassword?.errors"
|
||||||
|
>Password and Confirm password must be the same.
|
||||||
|
</mat-error>
|
||||||
|
</mat-form-field>
|
||||||
|
|
||||||
<mat-checkbox formControlName="is_active">Is active</mat-checkbox>
|
<mat-checkbox formControlName="is_active">Is active</mat-checkbox>
|
||||||
<mat-divider class="my-2"></mat-divider>
|
<mat-divider class="my-2"></mat-divider>
|
||||||
|
@ -25,6 +25,7 @@ import {GroupService} from "@services/group.service";
|
|||||||
import {Observable} from "rxjs/Rx";
|
import {Observable} from "rxjs/Rx";
|
||||||
import {startWith} from "rxjs/operators";
|
import {startWith} from "rxjs/operators";
|
||||||
import {map} from "rxjs//operators";
|
import {map} from "rxjs//operators";
|
||||||
|
import {matchingPassword} from "@components/user-management/ConfirmPasswordValidator";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-add-user-dialog',
|
selector: 'app-add-user-dialog',
|
||||||
@ -58,7 +59,11 @@ export class AddUserDialogComponent implements OnInit {
|
|||||||
[userEmailAsyncValidator(this.server, this.userService)]),
|
[userEmailAsyncValidator(this.server, this.userService)]),
|
||||||
password: new FormControl(null,
|
password: new FormControl(null,
|
||||||
[Validators.required, Validators.minLength(6), Validators.maxLength(100)]),
|
[Validators.required, Validators.minLength(6), Validators.maxLength(100)]),
|
||||||
|
confirmPassword: new FormControl(null,
|
||||||
|
[Validators.minLength(6), Validators.maxLength(100), Validators.required] ),
|
||||||
is_active: new FormControl(true)
|
is_active: new FormControl(true)
|
||||||
|
},{
|
||||||
|
validators: [matchingPassword]
|
||||||
});
|
});
|
||||||
this.groupService.getGroups(this.server)
|
this.groupService.getGroups(this.server)
|
||||||
.subscribe((groups: Group[]) => {
|
.subscribe((groups: Group[]) => {
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
<h1 mat-dialog-title>Change password for user : </h1>
|
||||||
|
<div>
|
||||||
|
<form [formGroup]="editPasswordForm" class="input-field">
|
||||||
|
<mat-form-field class="input-field">
|
||||||
|
<input matInput type="password" formControlName="password" placeholder="Password"/>
|
||||||
|
<mat-error *ngIf="passwordForm.password?.touched && passwordForm.password?.errors"
|
||||||
|
>Password must be between 6 and 100 characters.
|
||||||
|
</mat-error>
|
||||||
|
</mat-form-field>
|
||||||
|
<mat-form-field class="input-field">
|
||||||
|
<input matInput type="password" formControlName="confirmPassword" placeholder="Confirm Password"/>
|
||||||
|
<mat-error *ngIf="passwordForm.confirmPassword?.touched && passwordForm.confirmPassword?.errors"
|
||||||
|
>Password and Confirm password must be the same.
|
||||||
|
</mat-error>
|
||||||
|
</mat-form-field>
|
||||||
|
|
||||||
|
<div mat-dialog-actions class="button-div">
|
||||||
|
<button mat-button (click)="onCancel()" color="accent">Cancel</button>
|
||||||
|
<button mat-button (click)="onPasswordSave()" tabindex="2" class="add-project-button" mat-raised-button color="primary"
|
||||||
|
[disabled]="!editPasswordForm.valid">
|
||||||
|
Change password
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
@ -0,0 +1,7 @@
|
|||||||
|
.input-field {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-div {
|
||||||
|
float: right;
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { ChangeUserPasswordComponent } from './change-user-password.component';
|
||||||
|
|
||||||
|
describe('ChangeUserPasswordComponent', () => {
|
||||||
|
let component: ChangeUserPasswordComponent;
|
||||||
|
let fixture: ComponentFixture<ChangeUserPasswordComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
declarations: [ ChangeUserPasswordComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ChangeUserPasswordComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,67 @@
|
|||||||
|
import {Component, Inject, OnInit} from '@angular/core';
|
||||||
|
import {AbstractControl, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators} from "@angular/forms";
|
||||||
|
import {User} from "@models/users/user";
|
||||||
|
import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog";
|
||||||
|
import {UserService} from "@services/user.service";
|
||||||
|
import {Server} from "@models/server";
|
||||||
|
import {ToasterService} from "@services/toaster.service";
|
||||||
|
import {matchingPassword} from "@components/user-management/ConfirmPasswordValidator";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-change-user-password',
|
||||||
|
templateUrl: './change-user-password.component.html',
|
||||||
|
styleUrls: ['./change-user-password.component.scss']
|
||||||
|
})
|
||||||
|
export class ChangeUserPasswordComponent implements OnInit {
|
||||||
|
|
||||||
|
editPasswordForm: FormGroup;
|
||||||
|
user: User;
|
||||||
|
|
||||||
|
constructor(private dialogRef: MatDialogRef<ChangeUserPasswordComponent>,
|
||||||
|
@Inject(MAT_DIALOG_DATA) public data: { user: User, server: Server },
|
||||||
|
private userService: UserService,
|
||||||
|
private toasterService: ToasterService) { }
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.user = this.data.user;
|
||||||
|
this.editPasswordForm = new FormGroup({
|
||||||
|
password: new FormControl(null,
|
||||||
|
[Validators.minLength(6), Validators.maxLength(100), Validators.required] ),
|
||||||
|
confirmPassword: new FormControl(null,
|
||||||
|
[Validators.minLength(6), Validators.maxLength(100), Validators.required] ),
|
||||||
|
},{
|
||||||
|
validators: [matchingPassword]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
get passwordForm() {
|
||||||
|
return this.editPasswordForm.controls;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
onCancel() {
|
||||||
|
this.dialogRef.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
onPasswordSave() {
|
||||||
|
if (!this.editPasswordForm.valid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const updatedUser = {};
|
||||||
|
updatedUser['password'] = this.editPasswordForm.get('password').value;
|
||||||
|
updatedUser['user_id'] = this.user.user_id;
|
||||||
|
|
||||||
|
console.log(updatedUser);
|
||||||
|
|
||||||
|
this.userService.update(this.data.server, updatedUser)
|
||||||
|
.subscribe((user: User) => {
|
||||||
|
this.toasterService.success(`User ${user.username} password updated`);
|
||||||
|
this.editPasswordForm.reset();
|
||||||
|
this.dialogRef.close(true);
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
this.toasterService.error('Cannot update password for user : ' + error);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -44,15 +44,6 @@
|
|||||||
</mat-error>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
|
|
||||||
|
|
||||||
<mat-form-field class="input-field">
|
|
||||||
<input matInput type="password" formControlName="password" placeholder="Password"/>
|
|
||||||
<mat-error *ngIf="form.password?.touched && form.password?.errors"
|
|
||||||
>Password must be between 6 and 100 characters
|
|
||||||
</mat-error>
|
|
||||||
</mat-form-field>
|
|
||||||
|
|
||||||
|
|
||||||
<mat-checkbox formControlName="is_active">Is active</mat-checkbox>
|
<mat-checkbox formControlName="is_active">Is active</mat-checkbox>
|
||||||
<div>
|
<div>
|
||||||
<mat-checkbox [checked]="user.is_superadmin" disabled>Is Superadmin</mat-checkbox>
|
<mat-checkbox [checked]="user.is_superadmin" disabled>Is Superadmin</mat-checkbox>
|
||||||
@ -65,6 +56,11 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<button mat-button (click)="onChangePassword()" tabindex="2" mat-raised-button color="primary">
|
||||||
|
Change Password
|
||||||
|
</button>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div>Creation date: {{user.created_at}}</div>
|
<div>Creation date: {{user.created_at}}</div>
|
||||||
<div>Last update Date: {{user.updated_at}}</div>
|
<div>Last update Date: {{user.updated_at}}</div>
|
||||||
|
@ -10,6 +10,10 @@ import {userEmailAsyncValidator} from "@components/user-management/add-user-dial
|
|||||||
import {ActivatedRoute, Router} from "@angular/router";
|
import {ActivatedRoute, Router} from "@angular/router";
|
||||||
import {Permission} from "@models/api/permission";
|
import {Permission} from "@models/api/permission";
|
||||||
import {Role} from "@models/api/role";
|
import {Role} from "@models/api/role";
|
||||||
|
import {AddUserDialogComponent} from "@components/user-management/add-user-dialog/add-user-dialog.component";
|
||||||
|
import {MatDialog} from "@angular/material/dialog";
|
||||||
|
import {ChangeUserPasswordComponent} from "@components/user-management/user-detail/change-user-password/change-user-password.component";
|
||||||
|
import {RemoveToGroupDialogComponent} from "@components/group-details/remove-to-group-dialog/remove-to-group-dialog.component";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-user-detail',
|
selector: 'app-user-detail',
|
||||||
@ -24,11 +28,13 @@ export class UserDetailComponent implements OnInit {
|
|||||||
server: Server;
|
server: Server;
|
||||||
user_id: string;
|
user_id: string;
|
||||||
permissions: Permission[];
|
permissions: Permission[];
|
||||||
|
changingPassword: boolean = false;
|
||||||
|
|
||||||
constructor(public userService: UserService,
|
constructor(public userService: UserService,
|
||||||
private toasterService: ToasterService,
|
private toasterService: ToasterService,
|
||||||
private route: ActivatedRoute,
|
private route: ActivatedRoute,
|
||||||
private router: Router) {
|
private router: Router,
|
||||||
|
public dialog: MatDialog) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,8 +63,6 @@ export class UserDetailComponent implements OnInit {
|
|||||||
email: new FormControl(this.user.email,
|
email: new FormControl(this.user.email,
|
||||||
[Validators.email, Validators.required],
|
[Validators.email, Validators.required],
|
||||||
[userEmailAsyncValidator(this.server, this.userService, this.user.email)]),
|
[userEmailAsyncValidator(this.server, this.userService, this.user.email)]),
|
||||||
password: new FormControl(null,
|
|
||||||
[Validators.minLength(6), Validators.maxLength(100)]),
|
|
||||||
is_active: new FormControl(this.user.is_active)
|
is_active: new FormControl(this.user.is_active)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -91,7 +95,7 @@ export class UserDetailComponent implements OnInit {
|
|||||||
.forEach(key => {
|
.forEach(key => {
|
||||||
const currentControl = this.editUserForm.get(key);
|
const currentControl = this.editUserForm.get(key);
|
||||||
|
|
||||||
if (currentControl.dirty && currentControl.value !== this.user[key] && currentControl.value !== '') {
|
if (currentControl.dirty && currentControl.value !== this.user[key]) {
|
||||||
dirtyValues[key] = currentControl.value;
|
dirtyValues[key] = currentControl.value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -99,5 +103,8 @@ export class UserDetailComponent implements OnInit {
|
|||||||
return dirtyValues;
|
return dirtyValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onChangePassword() {
|
||||||
|
this.dialog.open<ChangeUserPasswordComponent>(ChangeUserPasswordComponent,
|
||||||
|
{width: '400px', height: '300px', data: {user: this.user, server: this.server}});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user