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