Skip to content

Commit 33c4f81

Browse files
committed
[BUGFIX] [ENHANCEMENT] [FEATURE]
- Corrige hasError() - Remodela estrutura de hasError() e prepare2send() - Add validação/mask do nivel da linguagem
1 parent 027d113 commit 33c4f81

File tree

7 files changed

+88
-37
lines changed

7 files changed

+88
-37
lines changed

angular/src/app/core/models/form-models/base/base-form.model.ts

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,6 @@ export abstract class BaseFormModel {
2525
}
2626

2727
private static isFieldValid(field): boolean {
28-
// console.log(field);
29-
// console.log('type checker');
30-
// console.log('isInput: ' + (field.constructor === InputFieldModel));
31-
// console.log('isForm: ' + (field instanceof BaseFormModel));
32-
// console.log('isArray: ' + (field instanceof Array));
3328
if (field instanceof InputFieldModel ||
3429
field instanceof BaseFormModel ||
3530
field instanceof Array) {
@@ -39,22 +34,19 @@ export abstract class BaseFormModel {
3934
return false;
4035
}
4136

42-
// checks if one of the object's fields has an error
43-
// if so returns true
44-
// otherwise returns false
45-
hasError(nonRequiredParam: Array<string> = []): boolean {
46-
const keys = (Object.keys(this));
37+
private static modelHasError(model: BaseFormModel, nonRequiredParam: Array<string> = []): boolean {
38+
const keys = (Object.keys(model));
4739

4840
for (const key of keys) {
49-
const field = this[key];
41+
const field = model[key];
5042

5143
if (!BaseFormModel.isFieldValid(field)) {
5244
throw new Error(INVALID_FORM_MODEL);
5345
}
5446

5547
let hasError = false;
5648
if (field instanceof BaseFormModel) {
57-
hasError = field.hasError(nonRequiredParam);
49+
hasError = this.modelHasError(field, nonRequiredParam);
5850
} else if (field instanceof Array) {
5951
hasError = this.arrayHasError(field, nonRequiredParam);
6052
} else if (field.errors.length > 0 ||
@@ -70,13 +62,12 @@ export abstract class BaseFormModel {
7062
return false;
7163
}
7264

73-
private arrayHasError(fields: Array<any>, nonRequiredParam: Array<string> = []): boolean {
74-
console.log('checking if array has error');
65+
private static arrayHasError(fields: Array<any>, nonRequiredParam: Array<string> = []): boolean {
7566
for (const field of fields) {
7667
let hasError = false;
68+
7769
if (field instanceof BaseFormModel) {
78-
console.log('BaseFormModel');
79-
hasError = field.arrayHasError(nonRequiredParam);
70+
hasError = this.modelHasError(field, nonRequiredParam);
8071
} else if (field instanceof Array) {
8172
hasError = this.arrayHasError(field, nonRequiredParam);
8273
} else if (field.hasOwnProperty('value') && field.hasOwnProperty('errors')) {
@@ -91,16 +82,8 @@ export abstract class BaseFormModel {
9182
return false;
9283
}
9384

94-
// returns an object ready to be sent to the backend
95-
// Ex:
96-
// {
97-
// 'property1': value1,
98-
// 'property2': value2,
99-
// 'property3': value3,
100-
// 'property4': value4
101-
// }
102-
prepare2send(flat = false, propertiesIgnored: Array<string> = []): PREPARE_TO_SEND_RETURN {
103-
const keys = (Object.keys(this));
85+
private static prepareModel2send(model: BaseFormModel, flat = false, propertiesIgnored: Array<string> = []): PREPARE_TO_SEND_RETURN {
86+
const keys = (Object.keys(model));
10487

10588
let ret = {};
10689

@@ -109,14 +92,14 @@ export abstract class BaseFormModel {
10992
continue;
11093
}
11194

112-
const field = this[key];
95+
const field = model[key];
11396

11497
if (!BaseFormModel.isFieldValid(field)) {
11598
throw new Error(INVALID_FORM_MODEL);
11699
}
117100

118101
if (field instanceof BaseFormModel) {
119-
const returnedValue = field.prepare2send(flat, propertiesIgnored);
102+
const returnedValue = this.prepareModel2send(field, flat, propertiesIgnored);
120103

121104
if (flat) {
122105
// merge the objects
@@ -138,14 +121,14 @@ export abstract class BaseFormModel {
138121
return ret;
139122
}
140123

141-
private prepareArray2send(fields: Array<VALID_TYPES>,
142-
flat: boolean, propertiesIgnored: Array<string>):
143-
Array<VALID_TYPES> | null {
124+
private static prepareArray2send(fields: Array<VALID_TYPES>,
125+
flat: boolean, propertiesIgnored: Array<string>):
126+
Array<VALID_TYPES> | null {
144127
const array = [];
145128

146129
for (const field of fields) {
147130
if (field instanceof BaseFormModel) {
148-
const returnedValue = field.prepare2send(flat, propertiesIgnored);
131+
const returnedValue = this.prepareModel2send(field, flat, propertiesIgnored);
149132
array.push(returnedValue);
150133
} else if (field instanceof Array) {
151134
const returnedValue = this.prepareArray2send(field, flat, propertiesIgnored);
@@ -162,6 +145,26 @@ export abstract class BaseFormModel {
162145
return array;
163146
}
164147

148+
// checks if one of the object's fields has an error
149+
// if so returns true
150+
// otherwise returns false
151+
hasError(nonRequiredParam: Array<string> = []): boolean {
152+
return BaseFormModel.modelHasError(this, nonRequiredParam);
153+
}
154+
155+
156+
// returns an object ready to be sent to the backend
157+
// Ex:
158+
// {
159+
// 'property1': value1,
160+
// 'property2': value2,
161+
// 'property3': value3,
162+
// 'property4': value4
163+
// }
164+
prepare2send(flat = false, propertiesIgnored: Array<string> = []) {
165+
return BaseFormModel.prepareModel2send(this, flat, propertiesIgnored)
166+
}
167+
165168
// returns a list of the name of all properties that have input === ''
166169
//
167170
// this function returns a list instead of a boolean because it might be useful

angular/src/app/core/services/mask.service.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,20 @@ export class MaskService {
9797

9898
return value;
9999
}
100+
101+
maskLanguageLevel(value: string): string {
102+
value = value.replace(/[^0-9]/g, '');
103+
104+
const numericalValue = Number(value);
105+
106+
if (numericalValue < 1 || numericalValue > 5) {
107+
if (value.length > 1) {
108+
value = value.substr(0, 1);
109+
} else {
110+
value = '';
111+
}
112+
}
113+
114+
return value;
115+
}
100116
}

angular/src/app/core/services/validation.service.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,23 @@ export class ValidationService {
122122
return invalidPassword ? { invalidPasswordConfirmation: { value: control.value } } : null;
123123
};
124124
}
125+
126+
validateLanguageLevel(): ValidatorFn {
127+
return (control: AbstractControl): RETURN_TYPE | null => {
128+
let invalidLanguageLevel = false;
129+
130+
const validLanguageLevelRegex = /^(\d){1}$/;
131+
invalidLanguageLevel = !validLanguageLevelRegex.test(control.value);
132+
133+
const value = Number(control.value);
134+
135+
if (value < 1 || value > 5) {
136+
invalidLanguageLevel = true;
137+
}
138+
139+
return invalidLanguageLevel
140+
? { invalidLanguageLevel: { value: control.value } }
141+
: null;
142+
};
143+
}
125144
}

angular/src/app/home/pages/register/register.component.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
<div class="body">
22
<h2>Personal Info</h2>
33
<app-input type='email' label='E-mail' placeholder='Ex: email@email.com'
4+
[initialValue]='form.email.value'
45
(emitter)="inputReturn($event, 'email')">
56
</app-input>
67
<app-input type='phone' label='Phone' placeholder='Ex: (123) 456-7890'
8+
[initialValue]='form.phone.value'
79
(emitter)="inputReturn($event, 'phone')">
810
</app-input>
911
<app-input type='city' label='City' placeholder='Ex: San Francisco'
12+
[initialValue]='form.city.value'
1013
(emitter)="inputReturn($event, 'city')">
1114
</app-input>
1215
<app-input type='password' label='Password' placeholder='Ex: Passw0rd!'
16+
[initialValue]='form.password.value'
1317
(emitter)="inputReturn($event, 'password')">
1418
</app-input>
1519
<app-input type='password' label='Password confirmation' placeholder='Ex: Passw0rd!'
20+
[initialValue]='form.passwordConfirmation.value'
1621
(emitter)="inputReturn($event, 'passwordConfirmation')"
1722
[confirmValue]="form ? form.password.value : ''">
1823
</app-input>
@@ -32,7 +37,7 @@ <h2>Languages</h2>
3237
<div class="languages-input-container" *ngFor='let languages of form?.languages; let i = index;'>
3338
<div class="language-input-container">
3439
<app-input type='language' label='Language' placeholder='Ex: English'
35-
(emitter)="inputReturn($event, 'languages', i, 'name')">
40+
(emitter)="inputReturn($event, 'languages', i, 'name')">
3641
</app-input>
3742
<div class="remove-button" (click)="removeLanguages(i)">
3843
Remove

angular/src/app/home/pages/register/register.component.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { InputFieldModel } from './../../../../../../ionic/src/app/models/input-field-model';
2-
import { Component, OnInit, AfterViewInit } from '@angular/core';
2+
import { Component, OnInit, AfterContentInit } from '@angular/core';
33
import { RegisterFormModel } from '../../models/register-form.model';
44
import { LanguageFormModel } from '../../models/language-form.model';
55

@@ -8,15 +8,15 @@ import { LanguageFormModel } from '../../models/language-form.model';
88
templateUrl: './register.component.html',
99
styleUrls: ['./register.component.scss']
1010
})
11-
export class RegisterComponent implements OnInit, AfterViewInit {
11+
export class RegisterComponent implements OnInit, AfterContentInit {
1212
form: RegisterFormModel;
1313

1414
constructor() { }
1515

1616
ngOnInit(): void {
1717
}
1818

19-
ngAfterViewInit(): void {
19+
ngAfterContentInit(): void {
2020
this.form = new RegisterFormModel();
2121
}
2222

@@ -35,6 +35,7 @@ export class RegisterComponent implements OnInit, AfterViewInit {
3535

3636
submit() {
3737
console.log(this.form.prepare2send());
38+
console.log(this.form.getPropertiesByForm());
3839
}
3940

4041
addNewSkill() {

angular/src/app/shared/components/input/input.component.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ export class InputComponent implements OnInit, OnChanges {
5959
case 'cnpj':
6060
validators.push(this.validation.validateCNPJFormat());
6161
break;
62+
case 'language-level':
63+
validators.push(this.validation.validateLanguageLevel());
64+
break;
6265
default:
6366
break;
6467
}
@@ -104,6 +107,9 @@ export class InputComponent implements OnInit, OnChanges {
104107
case 'cnpj':
105108
value = this.mask.maskCNPJ(value);
106109
break;
110+
case 'language-level':
111+
value = this.mask.maskLanguageLevel(value);
112+
break;
107113
default:
108114
break;
109115
}
@@ -170,7 +176,8 @@ export class InputComponent implements OnInit, OnChanges {
170176
' 1 uppercase letter , 1 lowercase letter, 1 number and 1 special character ',
171177
invalidPasswordConfirmation: 'Passwords don\'t match',
172178
invalidCPFFormat: 'Invalid CPF format',
173-
invalidCNPJFormat: 'Invalid CNPJ format'
179+
invalidCNPJFormat: 'Invalid CNPJ format',
180+
invalidLanguageSkill: 'Language level must be between 1 and 5'
174181
};
175182

176183
const error = this.errors[0];
File renamed without changes.

0 commit comments

Comments
 (0)