Implemented better validation inside avvikelse-report
This commit is contained in:
@@ -32,15 +32,11 @@
|
|||||||
afPlaceholder="Välj orsak till avvikelse"
|
afPlaceholder="Välj orsak till avvikelse"
|
||||||
[afSelectItems]="reason"
|
[afSelectItems]="reason"
|
||||||
[afRequired]="true"
|
[afRequired]="true"
|
||||||
|
[afInvalidMessage]="reasonFormControl.errors?.required"
|
||||||
[afAnnounceIfOptional]="true"
|
[afAnnounceIfOptional]="true"
|
||||||
[afDisableValidStyle]="true"
|
[afDisableValidStyle]="true"
|
||||||
[afInvalid]="formControlIsInvalid(reasonFormControl)"
|
[afInvalid]="formControlIsInvalid(reasonFormControl)"
|
||||||
></digi-ng-form-select>
|
></digi-ng-form-select>
|
||||||
<div aria-atomic="true" role="alert">
|
|
||||||
<digi-form-validation-message *ngIf="formControlIsInvalid(reasonFormControl)" af-variation="error"
|
|
||||||
>{{reasonFormControl.errors?.required}}
|
|
||||||
</digi-form-validation-message>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -57,15 +53,11 @@
|
|||||||
[afLabel]="questions[i]?.name"
|
[afLabel]="questions[i]?.name"
|
||||||
[afDisableValidStyle]="true"
|
[afDisableValidStyle]="true"
|
||||||
[afRequired]="questionIsRequired(questions[i])"
|
[afRequired]="questionIsRequired(questions[i])"
|
||||||
|
[afInvalidMessage]="question.errors?.required || question.errors?.invalid"
|
||||||
[afAnnounceIfOptional]="true"
|
[afAnnounceIfOptional]="true"
|
||||||
[afMaxLength]="2000"
|
[afMaxLength]="2000"
|
||||||
[afInvalid]="formControlIsInvalid(question)"
|
[afInvalid]="formControlIsInvalid(question)"
|
||||||
></digi-ng-form-textarea>
|
></digi-ng-form-textarea>
|
||||||
<div aria-atomic="true" role="alert">
|
|
||||||
<digi-form-validation-message *ngIf="formControlIsInvalid(question)" af-variation="error"
|
|
||||||
>{{question.errors?.required}}
|
|
||||||
</digi-form-validation-message>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import { CustomError } from '@msfa-models/error/custom-error';
|
|||||||
import { FragorForAvvikelser } from '@msfa-models/fragor-for-avvikelser.model';
|
import { FragorForAvvikelser } from '@msfa-models/fragor-for-avvikelser.model';
|
||||||
import { OrsaksKoderAvvikelse } from '@msfa-models/orsaks-koder-avvikelse.model';
|
import { OrsaksKoderAvvikelse } from '@msfa-models/orsaks-koder-avvikelse.model';
|
||||||
import { DeltagareApiService } from '@msfa-services/api/deltagare.api.service';
|
import { DeltagareApiService } from '@msfa-services/api/deltagare.api.service';
|
||||||
|
import { markControlsAsDirty } from '@msfa-utils/mark-controls-as-dirty.util';
|
||||||
|
import { RegexValidator } from '@msfa-utils/validators/regex.validator';
|
||||||
import { RequiredValidator } from '@msfa-validators/required.validator';
|
import { RequiredValidator } from '@msfa-validators/required.validator';
|
||||||
import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';
|
import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';
|
||||||
import { map, shareReplay, switchMap, take } from 'rxjs/operators';
|
import { map, shareReplay, switchMap, take } from 'rxjs/operators';
|
||||||
@@ -48,9 +50,9 @@ export class DeltagareAvvikelserapportComponent implements OnInit, OnDestroy {
|
|||||||
shareReplay(1)
|
shareReplay(1)
|
||||||
);
|
);
|
||||||
|
|
||||||
reasons$ = this.deltagareAvvikelseService.getAvvikelseOrsaker$;
|
reasons$: Observable<OrsaksKoderAvvikelse[]> = this.deltagareAvvikelseService.getAvvikelseOrsaker$;
|
||||||
reasonsAsNgDigiFormSelectItems$: Observable<FormSelectItem[]> = this.reasons$.pipe(
|
reasonsAsNgDigiFormSelectItems$: Observable<FormSelectItem[]> = this.reasons$.pipe(
|
||||||
map(reasons => reasons.map(reason => ({ name: reason.name, value: reason.id })))
|
map(reasons => reasons.map(reason => ({ name: reason.name, value: reason.id as string })))
|
||||||
);
|
);
|
||||||
|
|
||||||
allAvvikelseQuestions$ = this.deltagareAvvikelseService.fragorForAvvikelser$;
|
allAvvikelseQuestions$ = this.deltagareAvvikelseService.fragorForAvvikelser$;
|
||||||
@@ -63,8 +65,8 @@ export class DeltagareAvvikelserapportComponent implements OnInit, OnDestroy {
|
|||||||
private subscriptions: Subscription[] = [];
|
private subscriptions: Subscription[] = [];
|
||||||
private todayDateISO = new Date().toISOString().slice(0, 10);
|
private todayDateISO = new Date().toISOString().slice(0, 10);
|
||||||
avvikelseFormGroup = new FormGroup({
|
avvikelseFormGroup = new FormGroup({
|
||||||
[this.reasonFormName]: new FormControl(null, RequiredValidator('Orsak är obligatorisk')),
|
[this.reasonFormName]: new FormControl(null, [RequiredValidator('Orsak är obligatorisk')]),
|
||||||
[this.reportingDateFormName]: new FormControl(this.todayDateISO, RequiredValidator('Datum är obligatoriskt')),
|
[this.reportingDateFormName]: new FormControl(this.todayDateISO, [RequiredValidator('Datum är obligatoriskt')]),
|
||||||
[this.questionsFormName]: new FormArray([]),
|
[this.questionsFormName]: new FormArray([]),
|
||||||
});
|
});
|
||||||
private formData$: Observable<AvvikelseFormData> = this.avvikelseFormGroup
|
private formData$: Observable<AvvikelseFormData> = this.avvikelseFormGroup
|
||||||
@@ -141,6 +143,8 @@ export class DeltagareAvvikelserapportComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
openConfirmDialog(): void {
|
openConfirmDialog(): void {
|
||||||
this.shouldValidate$.next(true);
|
this.shouldValidate$.next(true);
|
||||||
|
markControlsAsDirty(Object.values(this.avvikelseFormGroup.controls));
|
||||||
|
this.avvikelseFormGroup.markAllAsTouched();
|
||||||
|
|
||||||
if (this.avvikelseFormGroup.valid) {
|
if (this.avvikelseFormGroup.valid) {
|
||||||
this.confirmDialogIsOpen$.next(true);
|
this.confirmDialogIsOpen$.next(true);
|
||||||
@@ -184,7 +188,7 @@ export class DeltagareAvvikelserapportComponent implements OnInit, OnDestroy {
|
|||||||
svar: question,
|
svar: question,
|
||||||
})),
|
})),
|
||||||
rapporteringsdatum: formData.reportingDate,
|
rapporteringsdatum: formData.reportingDate,
|
||||||
};
|
} as AvvikelseAlternativ;
|
||||||
|
|
||||||
return { genomforandeReferens, avvikelseAlternativ };
|
return { genomforandeReferens, avvikelseAlternativ };
|
||||||
}
|
}
|
||||||
@@ -199,7 +203,12 @@ export class DeltagareAvvikelserapportComponent implements OnInit, OnDestroy {
|
|||||||
this.currentQuestions.push(question);
|
this.currentQuestions.push(question);
|
||||||
|
|
||||||
this.questionsFormArray.push(
|
this.questionsFormArray.push(
|
||||||
new FormControl('', this.questionIsRequired(question) ? RequiredValidator('Frågan är obligatorisk') : null)
|
new FormControl(
|
||||||
|
'',
|
||||||
|
this.questionIsRequired(question)
|
||||||
|
? [RequiredValidator('Frågan är obligatorisk'), RegexValidator()]
|
||||||
|
: [RegexValidator()]
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
export const EMAIL_REGEX = /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/;
|
export const EMAIL_REGEX = /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/;
|
||||||
export const ISO_DATE_NO_TIME = /^\d{4}[-/\s]?((((0[13578])|(1[02]))[-/\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[-/\s]?(([0-2][0-9])|(30)))|(02[-/\s]?[0-2][0-9]))$/;
|
export const ISO_DATE_NO_TIME = /^\d{4}[-/\s]?((((0[13578])|(1[02]))[-/\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[-/\s]?(([0-2][0-9])|(30)))|(02[-/\s]?[0-2][0-9]))$/;
|
||||||
|
export const CHARACTER_REGEX = /\w/;
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms';
|
||||||
|
|
||||||
|
export function markControlsAsDirty(controls: AbstractControl[]): void {
|
||||||
|
controls.forEach(control => {
|
||||||
|
if (control instanceof FormControl) {
|
||||||
|
control.markAsDirty({ onlySelf: true });
|
||||||
|
} else if (control instanceof FormGroup) {
|
||||||
|
markControlsAsDirty(Object.values(control.controls));
|
||||||
|
} else if (control instanceof FormArray) {
|
||||||
|
markControlsAsDirty(control.controls);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import { AbstractControl, ValidatorFn } from '@angular/forms';
|
||||||
|
import { CHARACTER_REGEX } from '@msfa-constants/regex';
|
||||||
|
import { ValidationError } from '@msfa-models/validation-error.model';
|
||||||
|
|
||||||
|
export function RegexValidator(regex = CHARACTER_REGEX, message = 'Ogiltig värde'): ValidatorFn {
|
||||||
|
return (control: AbstractControl): ValidationError => {
|
||||||
|
if (control && control.value) {
|
||||||
|
if (!regex.test(control.value)) {
|
||||||
|
return { invalid: message };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user