]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - client/src/app/shared/shared-forms/form-validator.service.ts
Support ICU in TS components
[github/Chocobozzz/PeerTube.git] / client / src / app / shared / shared-forms / form-validator.service.ts
CommitLineData
d18d6478 1import { Injectable } from '@angular/core'
cc4bf76c 2import { AsyncValidatorFn, FormArray, FormBuilder, FormControl, FormGroup, ValidatorFn } from '@angular/forms'
7ed1edbb
C
3import { BuildFormArgument, BuildFormDefaultValues } from '../form-validators/form-validator.model'
4import { FormReactiveErrors, FormReactiveValidationMessages } from './form-reactive'
d18d6478
C
5
6@Injectable()
7export class FormValidatorService {
8
9 constructor (
b4a929ac 10 private formBuilder: FormBuilder
d18d6478
C
11 ) {}
12
13 buildForm (obj: BuildFormArgument, defaultValues: BuildFormDefaultValues = {}) {
14 const formErrors: FormReactiveErrors = {}
15 const validationMessages: FormReactiveValidationMessages = {}
16 const group: { [key: string]: any } = {}
17
18 for (const name of Object.keys(obj)) {
19 formErrors[name] = ''
20
21 const field = obj[name]
3866f1a0
C
22 if (this.isRecursiveField(field)) {
23 const result = this.buildForm(field as BuildFormArgument, defaultValues[name] as BuildFormDefaultValues)
24 group[name] = result.form
25 formErrors[name] = result.formErrors
26 validationMessages[name] = result.validationMessages
27
28 continue
29 }
30
9df52d66 31 if (field?.MESSAGES) validationMessages[name] = field.MESSAGES as { [ name: string ]: string }
d18d6478 32
c729caf6 33 const defaultValue = defaultValues[name] ?? ''
d18d6478 34
9df52d66 35 if (field?.VALIDATORS) group[name] = [ defaultValue, field.VALIDATORS ]
d18d6478
C
36 else group[name] = [ defaultValue ]
37 }
38
39 const form = this.formBuilder.group(group)
40 return { form, formErrors, validationMessages }
41 }
42
3c065fe3 43 updateFormGroup (
d18d6478
C
44 form: FormGroup,
45 formErrors: FormReactiveErrors,
46 validationMessages: FormReactiveValidationMessages,
47 obj: BuildFormArgument,
48 defaultValues: BuildFormDefaultValues = {}
49 ) {
50 for (const name of Object.keys(obj)) {
51 formErrors[name] = ''
52
53 const field = obj[name]
3866f1a0 54 if (this.isRecursiveField(field)) {
3c065fe3 55 this.updateFormGroup(
3866f1a0
C
56 form[name],
57 formErrors[name] as FormReactiveErrors,
58 validationMessages[name] as FormReactiveValidationMessages,
59 obj[name] as BuildFormArgument,
60 defaultValues[name] as BuildFormDefaultValues
61 )
62 continue
63 }
64
9df52d66 65 if (field?.MESSAGES) validationMessages[name] = field.MESSAGES as { [ name: string ]: string }
d18d6478
C
66
67 const defaultValue = defaultValues[name] || ''
68
3c065fe3
C
69 form.addControl(
70 name,
cc4bf76c 71 new FormControl(defaultValue, field?.VALIDATORS as ValidatorFn[], field?.ASYNC_VALIDATORS as AsyncValidatorFn[])
3c065fe3 72 )
d18d6478
C
73 }
74 }
75
cc4bf76c
C
76 updateTreeValidity (group: FormGroup | FormArray): void {
77 for (const key of Object.keys(group.controls)) {
78 const abstractControl = group.controls[key] as FormControl
79
80 if (abstractControl instanceof FormGroup || abstractControl instanceof FormArray) {
81 this.updateTreeValidity(abstractControl)
82 } else {
83 abstractControl.updateValueAndValidity({ emitEvent: false })
84 }
85 }
86 }
87
3866f1a0
C
88 private isRecursiveField (field: any) {
89 return field && typeof field === 'object' && !field.MESSAGES && !field.VALIDATORS
90 }
d18d6478 91}