Implement daily upload limit (#956)
[oweals/peertube.git] / client / src / app / shared / forms / form-validators / form-validator.service.ts
1 import { FormBuilder, FormControl, FormGroup, ValidatorFn } from '@angular/forms'
2 import { Injectable } from '@angular/core'
3 import { FormReactiveErrors, FormReactiveValidationMessages } from '@app/shared/forms/form-reactive'
4
5 export type BuildFormValidator = {
6   VALIDATORS: ValidatorFn[],
7   MESSAGES: { [ name: string ]: string }
8 }
9 export type BuildFormArgument = {
10   [ id: string ]: BuildFormValidator
11 }
12 export type BuildFormDefaultValues = {
13   [ name: string ]: string | string[]
14 }
15
16 @Injectable()
17 export class FormValidatorService {
18
19   constructor (
20     private formBuilder: FormBuilder
21   ) {}
22
23   buildForm (obj: BuildFormArgument, defaultValues: BuildFormDefaultValues = {}) {
24     const formErrors: FormReactiveErrors = {}
25     const validationMessages: FormReactiveValidationMessages = {}
26     const group: { [key: string]: any } = {}
27
28     for (const name of Object.keys(obj)) {
29       formErrors[name] = ''
30
31       const field = obj[name]
32       if (field && field.MESSAGES) validationMessages[name] = field.MESSAGES
33
34       const defaultValue = defaultValues[name] || ''
35
36       if (field && field.VALIDATORS) group[name] = [ defaultValue, field.VALIDATORS ]
37       else group[name] = [ defaultValue ]
38     }
39
40     const form = this.formBuilder.group(group)
41     return { form, formErrors, validationMessages }
42   }
43
44   updateForm (
45     form: FormGroup,
46     formErrors: FormReactiveErrors,
47     validationMessages: FormReactiveValidationMessages,
48     obj: BuildFormArgument,
49     defaultValues: BuildFormDefaultValues = {}
50   ) {
51     for (const name of Object.keys(obj)) {
52       formErrors[name] = ''
53
54       const field = obj[name]
55       if (field && field.MESSAGES) validationMessages[name] = field.MESSAGES
56
57       const defaultValue = defaultValues[name] || ''
58
59       if (field && field.VALIDATORS) form.addControl(name, new FormControl(defaultValue, field.VALIDATORS))
60       else form.addControl(name, new FormControl(defaultValue))
61     }
62   }
63
64 }