Hello to all, welcome to therichpost.com. In this post, I will tell you, Angular 16 Step form working demo with validation.
Guys with this we will cover below things:
- Angular 16 Reactive Form Implelemtnation.
- Reactive forms validation email with valid format.
- Angular custom stepper
- Angular16 Reactive Form Responsiveness with Bootstrap 5.

Angular16 came and if you are new then you must check below link:
Here is the code snippet and please use carefully:
1. Very first guys, here are common basics steps to add angular 16 application on your machine and also we must have latest nodejs version installed for angular 16:
$ npm install -g @angular/cli $ ng new angularform // Set Angular 16 Application on your pc cd angularform // Go inside project folder
2. Now run below commands to set bootstrap 5 modules into our angular 16 application for responsiveness (optional):
npm install bootstrap npm i @popperjs/core
3. Now friends we just need to add below code into angularform/angular.json file (optional):
"styles": [
...
"node_modules/bootstrap/dist/css/bootstrap.min.css"
],
"scripts": [
...
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"
]
4. Now guys we will add below code into our angularform/src/app/app.module.ts file:
...
import { FormsModule } from '@angular/forms';
import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
declarations: [
AppComponent
],
imports: [
...
ReactiveFormsModule,
FormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
5. Now guys we will add below code into our angularform/src/app/app.component.ts file:
import { Component } from '@angular/core';
import { FormControl,FormGroup,Validators,FormBuilder } from '@angular/forms';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'angular13bestcode';
personalDetails:any = FormGroup;
addressDetails:any= FormGroup;
educationalDetails:any= FormGroup;
personal_step = false;
address_step = false;
education_step = false;
step = 1;
constructor(private formBuilder: FormBuilder) { }
ngOnInit() {
this.personalDetails = this.formBuilder.group({
name: ['', Validators.required],
email: ['', Validators.required],
phone: ['',Validators.required]
});
this.addressDetails = this.formBuilder.group({
city: ['', Validators.required],
address: ['', Validators.required],
pincode: ['',Validators.required]
});
this.educationalDetails = this.formBuilder.group({
highest_qualification: ['', Validators.required],
university: ['', Validators.required],
total_marks: ['',Validators.required]
});
}
get personal() { return this.personalDetails.controls; }
get address() { return this.addressDetails.controls; }
get education() { return this.educationalDetails.controls; }
next(){
if(this.step==1){
this.personal_step = true;
if (this.personalDetails.invalid) { return }
this.step++
}
else if(this.step==2){
this.address_step = true;
if (this.addressDetails.invalid) { return }
this.step++;
}
}
previous(){
this.step--
if(this.step==1){
this.address_step = false;
}
if(this.step==2){
this.education_step = false;
}
}
submit(){
if(this.step==3){
this.education_step = true;
if (this.educationalDetails.invalid) { return }
alert("Well done!!")
}
}
}
6. Finally we will add below code into our angularform/src/app/app.component.html file:
<div class="container py-5">
<div class="row">
<div class="col-md-12 col-md-offset-3">
<form [formGroup]="personalDetails" id="msform">
<!-- progressbar -->
<ul id="progressbar">
<li [ngClass]="step>=1 ? 'active ' : 'inactive'">Personal Details</li>
<li [ngClass]="step>=2 ? 'active' : 'inactive'">Social Profiles</li>
<li [ngClass]="step==3 ? 'active' : 'inactive'">Account Setup</li>
</ul>
<!-- fieldsets -->
<fieldset *ngIf="step == 1" >
<h2 class="fs-title">Personal Details</h2>
<input type="text" formControlName="name" [ngClass]="{ 'is-invalid': personal_step && personal.name.errors }" placeholder="Full Name"/>
<div *ngIf="personal_step && personalDetails.controls.name.errors">
<div *ngIf="personal.name.errors?.required">Name is required</div>
</div>
<input type="text" formControlName="email" name="email" placeholder="Email"/>
<div *ngIf="personal_step && personalDetails.controls.email.errors">
<div *ngIf="personal.email.errors?.required">Email is required</div>
</div>
<input type="text" formControlName="phone" name="phone" placeholder="Phone"/>
<div *ngIf="personal_step && personalDetails.controls.phone.errors">
<div *ngIf="personal.phone.errors?.required">Phone is required</div>
</div>
<input (click)="next()" type="button" name="next" class="next action-button" value="Next"/>
</fieldset>
</form>
<form [formGroup]="addressDetails" id="msform">
<fieldset *ngIf="step == 2" >
<h2 class="fs-title">Address Details</h2>
<input type="text" formControlName="city" placeholder="City"/>
<div *ngIf="address_step && addressDetails.controls.city.errors">
<div *ngIf="address.city.errors?.required">City is required</div>
</div>
<textarea rows="5" cols="5" formControlName="address" placeholder="address"></textarea>
<div *ngIf="address_step && addressDetails.controls.address.errors">
<div *ngIf="address.address.errors?.required">Address is required</div>
</div>
<input type="text" formControlName="pincode" placeholder="Pincode"/>
<div *ngIf="address_step && addressDetails.controls.pincode.errors">
<div *ngIf="address.pincode.errors?.required">Pincode is required</div>
</div>
<input (click)="previous()" type="button" name="previous" class="previous action-button-previous" value="Previous"/>
<input (click)="next()" type="button" name="next" class="next action-button" value="Next"/>
</fieldset>
</form>
<form [formGroup]="educationalDetails" id="msform">
<fieldset *ngIf="step == 3">
<h2 class="fs-title">Educational Details</h2>
<input type="text" formControlName="highest_qualification" placeholder="Highest Qualification"/>
<div *ngIf="education_step && educationalDetails.controls.highest_qualification.errors">
<div *ngIf="education.highest_qualification.errors?.required">Highest qualification is required</div>
</div>
<input type="text" formControlName="university" placeholder="University"/>
<div *ngIf="education_step && educationalDetails.controls.university.errors">
<div *ngIf="education.university.errors?.required">University is required</div>
</div>
<input type="text" formControlName="total_marks" placeholder="Total Marks"/>
<div *ngIf="education_step && educationalDetails.controls.total_marks.errors">
<div *ngIf="education.total_marks.errors?.required">Total marks is required</div>
</div>
<input (click)="previous()" type="button" name="previous" class="previous action-button-previous" value="Previous"/>
<input (click)="submit()"type="submit" name="submit" class="submit action-button" value="Submit"/>
</fieldset>
</form>
</div>
</div>
</div>
7. Guys we will add below code into our angularform/src/app/app.component.css file:
#msform {
text-align: center;
position: relative;
margin-top: 30px;
color: red;
}
#msform fieldset {
background: white;
border: 0 none;
border-radius: 0px;
box-shadow: 0 0 15px 1px rgba(0, 0, 0, 0.4);
padding: 20px 30px;
box-sizing: border-box;
width: 80%;
margin: 0 10%;
/*stacking fieldsets above each other*/
position: relative;
}
/*Hide all except first fieldset*/
#msform fieldset:not(:first-of-type) {
display: none;
}
/*inputs*/
#msform input, #msform textarea {
padding: 15px;
border: 1px solid #ccc;
border-radius: 0px;
margin-bottom: 10px;
width: 100%;
box-sizing: border-box;
font-family: montserrat;
color: #2C3E50;
font-size: 18px;
}
#msform input:focus, #msform textarea:focus {
-moz-box-shadow: none !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
border: 1px solid #ee0979;
outline-width: 0;
transition: All 0.5s ease-in;
-webkit-transition: All 0.5s ease-in;
-moz-transition: All 0.5s ease-in;
-o-transition: All 0.5s ease-in;
}
/*buttons*/
#msform .action-button {
width: 100px;
background: #ee0979;
font-weight: bold;
color: white;
border: 0 none;
border-radius: 25px;
cursor: pointer;
padding: 10px 5px;
margin: 10px 5px;
}
#msform .action-button:hover, #msform .action-button:focus {
box-shadow: 0 0 0 2px white, 0 0 0 3px #ee0979;
}
#msform .action-button-previous {
width: 100px;
background: #C5C5F1;
font-weight: bold;
color: white;
border: 0 none;
border-radius: 25px;
cursor: pointer;
padding: 10px 5px;
margin: 10px 5px;
}
#msform .action-button-previous:hover, #msform .action-button-previous:focus {
box-shadow: 0 0 0 2px white, 0 0 0 3px #C5C5F1;
}
/*headings*/
.fs-title {
font-size: 18px;
text-transform: uppercase;
color: #2C3E50;
margin-bottom: 10px;
letter-spacing: 2px;
font-weight: bold;
}
.fs-subtitle {
font-weight: normal;
font-size: 13px;
color: #666;
margin-bottom: 20px;
}
/*progressbar*/
#progressbar {
margin-bottom: 30px;
overflow: hidden;
/*CSS counters to number the steps*/
counter-reset: step;
}
#progressbar li {
list-style-type: none;
color: white;
text-transform: uppercase;
font-size: 9px;
width: 33.33%;
float: left;
position: relative;
letter-spacing: 1px;
}
#progressbar li:before {
content: counter(step);
counter-increment: step;
width: 24px;
height: 24px;
line-height: 26px;
display: block;
font-size: 12px;
color: #333;
background: white;
border-radius: 25px;
margin: 0 auto 10px auto;
}
/*progressbar connectors*/
#progressbar li:after {
content: '';
width: 100%;
height: 2px;
background: white;
position: absolute;
left: -50%;
top: 9px;
z-index: -1; /*put it behind the numbers*/
}
#progressbar li:first-child:after {
/*connector not needed before the first step*/
content: none;
}
/*marking active/completed steps green*/
/*The number of the step and the connector before it = green*/
#progressbar li.active:before, #progressbar li.active:after {
background: #ee0979;
color: white;
}
#progressbar li.inactive:before{
background: burlywood;
color: #000;
}
fieldset {
/* for chrome and safari*/
-webkit-animation-duration: .25ms;-webkit-animation-name: slidein;
/*for firefox*/
-moz-animation-duration: 1s;-moz-animation-name: slidein;
/* for opera*/
-o-animation-duration: 1s;-o-animation-name: slidein;
/* Standard syntax*/
animation-duration: 1s;animation-name: slidein;
}
@-webkit-keyframes slidein {
from { margin-right:100%;width:300%;}
to { margin-right: 0%;width: 100%; }
}
@-moz-keyframes slidein {
from {
margin-left: 100%;width: 300%;
}
to {
margin-left: 0%; width: 100%;
}
}
@-o-keyframes slidein {
from {
margin-left: 100%;width: 300%;
}
to {
margin-left: 0%;width: 100%;
}
}
@keyframes slidein {
from {
margin-left: 100%;width: 300%;
}
to {
margin-left: 0%;width: 100%;
}
}
Now we are done friends and please run ng serve command to check the output in browser(locahost:4200) and if you have any kind of query then please do comment below.
Note: Friends, I just tell the basic setup and things, you can change the code according to your requirements. For better understanding please watch video above.
Guys I will appreciate that if you will tell your views for this post. Nothing matters if your views will be good or bad.
Jassa
Thanks
