profile.component.html
<div>
<h1>Edit Your Profile </h1>
<hr>
<div class="col-md-4">
<form [formGroup]="profileForm" (ngSubmit)="saveProfile(profileForm.value)" autocomplete="off" novalidate>
<div class="form-group" [ngClass]="{'error' : !validateFirstName() }">
<label for="firstName">First Name:</label>
<em *ngIf="!validateFirstName() && profileForm.controls.firstName.errors.required">Required</em>
<em *ngIf="!validateFirstName() && profileForm.controls.firstName.errors.pattern">Must start with a letter</em>
<input formControlName="firstName" id="firstName" type="text" class="form-control" placeholder="First Name..." />
</div>
<div class="form-group" [ngClass]="{'error' : !validateLastName() }">
<label for="lastName">Last Name:</label>
<em *ngIf="!validateLastName()">Required</em>
<input formControlName="lastName" id="lastName" type="text" class="form-control" placeholder="Last Name..." />
</div>
<button type="submit" class="btn btn-primary">Save</button>
<button type="button" class="btn btn-default" (click)="cancel()">Cancel</button>
</form>
<div>
</div>
profile.component.ts
import { Component, OnInit } from '@angular/core'
import { FormControl, FormGroup, Validators } from '@angular/forms'
import { AuthService } from './auth.service'
import { Router} from '@angular/router'
@Component({
templateUrl: './profile.component.html',
styles: [`
em {float:right; color:#E05C65; padding-left: 10px;}
.error input {background-color:#E3C3C5;}
.error ::-webkit-input-placeholder { color: #999; }
.error ::-moz-placeholder { color: #999; }
.error :-moz-placeholder { color:#999; }
.error :ms-input-placeholder { color: #999; }
`]
})
export class ProfileComponent implements OnInit {
profileForm:FormGroup
private firstName:FormControl
private lastName:FormControl
constructor(private router:Router, private authService:AuthService) {
}
ngOnInit() {
this.firstName = new FormControl(this.authService.currentUser.firstName, [Validators.required, Validators.pattern('[a-zA-Z].*')])
this.lastName = new FormControl(this.authService.currentUser.lastName, Validators.required)
this.profileForm = new FormGroup({
firstName: this.firstName,
lastName: this.lastName
})
}
saveProfile(formValues) {
console.log('formValues : ', formValues);
if (this.profileForm.valid) {
this.authService.updateCurrentUser(formValues.firstName, formValues.lastName)
this.router.navigate(['events'])
}
}
validateFirstName() {
return this.firstName.valid || this.firstName.untouched
}
validateLastName() {
return this.lastName.valid || this.lastName.untouched
}
cancel() {
this.router.navigate(['events'])
}
}
auth.service.ts
import { Injectable } from '@angular/core'
import { IUser } from './user.model'
@Injectable()
export class AuthService {
currentUser:IUser
loginUser(userName: string, password: string) {
this.currentUser = {
id: 1,
userName: userName,
firstName: 'Bipon',
lastName: 'Biswas'
}
}
isAuthenticated() {
return !!this.currentUser;
}
updateCurrentUser(firstName:string, lastName:string) {
this.currentUser.firstName = firstName
this.currentUser.lastName = lastName
}
}
user.module.ts
import { NgModule } from '@angular/core'
import { CommonModule } from '@angular/common'
import { RouterModule } from '@angular/router'
import { FormsModule, ReactiveFormsModule } from '@angular/forms'
import { userRoutes } from './user.routes'
import { ProfileComponent } from './profile.component'
import { LoginComponent } from './login.component'
@NgModule({
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule,
RouterModule.forChild(userRoutes)
],
declarations: [
ProfileComponent,
LoginComponent
],
providers: [
]
})
export class UserModule { }
user.routes.ts
import { ProfileComponent } from './profile.component'
import { LoginComponent } from './login.component'
export const userRoutes = [
{path: 'profile', component: ProfileComponent},
{path: 'login', component: LoginComponent}
]