Skip to content

Commit 6dd7cd7

Browse files
committed
feat: add Model Driven forms - Form Builder
1 parent 1075294 commit 6dd7cd7

File tree

3 files changed

+57
-23
lines changed

3 files changed

+57
-23
lines changed

src/app/forms/model-builder/model-builder.component.html

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,41 @@
11
<div class="container">
22
<div class="row">
33
<div class="col-md-8">
4-
<form novalidate>
4+
<form [formGroup]="form" (ngSubmit)="signUp(form.value)" novalidate>
55
<div class="card card-signup">
66
<div class="card-header">Profile</div>
77
<div class="card-block">
88
<div class="form-group row">
99
<label for="inputEmail" class="col-sm-3 col-form-label">Email*</label>
1010
<div class="col-sm-9">
1111
<input type="email" class="form-control" id="inputEmail3" placeholder="[email protected]"
12-
name="email" required minlength="5">
12+
formControlName="email" required minlength="5">
1313
</div>
1414
</div>
1515
<div class="form-group row">
1616
<label for="inputFirstName" class="col-sm-3 col-form-label">First Name*</label>
1717
<div class="col-sm-9">
1818
<input type="text" class="form-control" id="inputFirstName" placeholder=""
19-
name="firstName" required maxlength="25">
19+
formControlName="firstName" pattern="[A-Za-z .]*" required maxlength="25">
2020
</div>
2121
</div>
2222
<div class="form-group row">
2323
<label for="inputLastName" class="col-sm-3 col-form-label">Last Name</label>
2424
<div class="col-sm-9">
2525
<input type="text" class="form-control" id="inputLastName" placeholder=""
26-
name="lastName" maxlength="25">
26+
formControlName="lastName" pattern="[A-Za-z .]*" maxlength="25">
2727
</div>
2828
</div>
2929
<fieldset class="form-group row">
3030
<legend class="col-form-legend col-sm-3">Gender</legend>
3131
<div class="col-sm-9 form-radio">
3232
<label class="custom-control custom-radio">
33-
<input id="inputMale" name="gender" type="radio" class="custom-control-input">
33+
<input id="inputMale" formControlName="gender" type="radio" class="custom-control-input" value="Male">
3434
<span class="custom-control-indicator"></span>
3535
<span class="custom-control-description">Male</span>
3636
</label>
3737
<label class="custom-control custom-radio">
38-
<input id="inputFemale" name="gender" type="radio" class="custom-control-input">
38+
<input id="inputFemale" formControlName="gender" type="radio" class="custom-control-input" value="Female">
3939
<span class="custom-control-indicator"></span>
4040
<span class="custom-control-description">Female</span>
4141
</label>
@@ -44,64 +44,64 @@
4444
<div class="form-group row">
4545
<div class="offset-sm-3 col-sm-9">
4646
<label class="custom-control custom-checkbox">
47-
<input type="checkbox" name="notrobot" class="custom-control-input" required>
47+
<input type="checkbox" formControlName="notrobot" class="custom-control-input" required>
4848
<span class="custom-control-indicator"></span>
4949
<span class="custom-control-description">I am not a Robot*</span>
5050
</label>
5151
</div>
5252
</div>
5353
</div>
5454
</div>
55-
<div class="card card-signup">
55+
<div class="card card-signup" formGroupName="address">
5656
<div class="card-header">Address</div>
5757
<div class="card-block">
5858
<div class="form-group row">
5959
<label for="inputAddressLine1" class="col-sm-3 col-form-label">Address Line 1*</label>
6060
<div class="col-sm-9">
6161
<input type="text" class="form-control" id="inputAddressLine1" placeholder="Room/Flat/Plot No. Locality"
62-
name="addressLine1" required>
62+
formControlName="addressLine1" required>
6363
</div>
6464
</div>
6565
<div class="form-group row">
6666
<label for="inputAddressLine2" class="col-sm-3 col-form-label">Address Line 2</label>
6767
<div class="col-sm-9">
6868
<input type="text" class="form-control" id="inputAddressLine2" placeholder="Street, Area"
69-
name="addressLine2">
69+
formControlName="addressLine2">
7070
</div>
7171
</div>
7272
<div class="row">
7373
<div class="form-group">
7474
<label for="inputCity" class="col-sm-3 col-form-label">City*</label>
7575
<div class="col-sm-4">
7676
<input type="text" class="form-control" id="inputCity" placeholder="City"
77-
name="city" required>
77+
formControlName="city" required>
7878
</div>
7979
</div>
8080
<div class="form-group">
8181
<label for="inputZipCode" class="col-sm-1 col-form-label">Zip*</label>
8282
<div class="col-sm-4">
8383
<input type="number" class="form-control" id="inputZipCode" placeholder="Zip code"
84-
name="zipCode" required>
84+
formControlName="zipCode" required>
8585
</div>
8686
</div>
8787
</div>
8888
<div class="form-group row" style="margin-top:1.2rem">
8989
<label for="inputLandmark" class="col-sm-3 col-form-label">Landmark</label>
9090
<div class="col-sm-9">
9191
<input type="text" class="form-control" id="inputLandmark" placeholder="Landmark"
92-
name="landmark" >
92+
formControlName="landmark" >
9393
</div>
9494
</div>
9595
<fieldset class="form-group row">
9696
<legend class="col-form-legend col-sm-3">Type</legend>
9797
<div class="col-sm-9 form-radio">
9898
<label class="custom-control custom-radio">
99-
<input id="inputResidence" name="addressType" type="radio" class="custom-control-input">
99+
<input id="inputResidence" formControlName="addressType" type="radio" class="custom-control-input" value="Residence">
100100
<span class="custom-control-indicator"></span>
101101
<span class="custom-control-description">Residence</span>
102102
</label>
103103
<label class="custom-control custom-radio">
104-
<input id="inputOffice" name="addressType" type="radio" class="custom-control-input">
104+
<input id="inputOffice" formControlName="addressType" type="radio" class="custom-control-input" value="Office">
105105
<span class="custom-control-indicator"></span>
106106
<span class="custom-control-description">Office</span>
107107
</label>
@@ -111,7 +111,7 @@
111111
<div class="form-group">
112112
<label for="inputCountry" class="col-sm-3 col-form-label">Country</label>
113113
<div class="col-sm-6">
114-
<select class="custom-select" id="inputCountry" name="country">
114+
<select class="custom-select" id="inputCountry" formControlName="country">
115115
<option value="" selected>Select Country</option>
116116
<option value="ALA">Åland Islands</option>
117117
<option value="ALB">Albania</option>
@@ -367,13 +367,14 @@
367367
</div>
368368
</div>
369369
</div>
370-
<div class="form-group row">
370+
<div class="row">
371371
<div class="offset-sm-2 col-sm-9">
372-
<button type="submit" class="btn btn-primary">Sign up</button>
372+
<button type="submit" class="btn btn-primary" [disabled]="!form.valid">Sign up</button>
373+
Your form is {{form.valid ? 'valid' : 'invalid'}}
373374
</div>
374375
</div>
375376
</form>
376377
</div>
377-
<div class="col-md-4 jumbotron"></div>
378+
<div class="col-md-4 jumbotron">{{ form.value | json }}</div>
378379
</div>
379380
</div>
Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,37 @@
11
import { Component } from '@angular/core';
2+
import { FormBuilder, FormGroup, FormControl } from '@angular/forms';
3+
4+
import { validateEmailFactory } from '../../shared/validators/email.validator';
5+
import { CheckboxValidator } from '../../shared/validators/checkbox-checked.validator';
26

37
@Component({
48
selector: 'labs-model-builder',
59
templateUrl: 'model-builder.component.html'
610
})
7-
export class ModelBuilderComponent {}
11+
export class ModelBuilderComponent {
12+
form: FormGroup;
13+
14+
constructor(private formBuilder: FormBuilder) {
15+
16+
this.form = this.formBuilder.group({
17+
email: [null, validateEmailFactory()],
18+
firstName: null,
19+
lastName: null,
20+
gender: null,
21+
notrobot: [null, CheckboxValidator.checked],
22+
address: this.formBuilder.group({
23+
addressLine1: null,
24+
addressLine2: null,
25+
city: null,
26+
zipCode: null,
27+
landmark: null,
28+
addressType: null,
29+
country: null
30+
})
31+
});
32+
}
33+
34+
signUp(data: any) {
35+
console.log('Submit the data: ', data);
36+
}
37+
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import { NgModule } from '@angular/core';
2-
import { ModelBuilderComponent } from './model-builder.component.ts';
2+
import { CommonModule } from '@angular/common';
3+
import { ReactiveFormsModule } from '@angular/forms';
4+
import { ModelBuilderComponent } from './model-builder.component';
5+
import { Bootstrap4FormsModule } from '../../shared/bootstrap4/forms/bootstrap4-forms.module';
36

4-
import { moduleRoutes } from './model-builder.routes.ts';
7+
import { moduleRoutes } from './model-builder.routes';
58

69
@NgModule({
7-
imports: [ moduleRoutes ],
10+
imports: [ Bootstrap4FormsModule, CommonModule, ReactiveFormsModule, moduleRoutes ],
811
declarations: [ ModelBuilderComponent ]
912
})
1013
export class ModelBuilderModule {}

0 commit comments

Comments
 (0)