@@ -42,39 +42,63 @@ export function isValidValue<V extends iFormValue = iFormValue>(
42
42
// field not empty, validate
43
43
switch ( input . type ) {
44
44
case eFormType . PHONE :
45
- // TODO: improve phone validation
45
+ // TODO: improve phone & cellphone validation
46
46
return Array . isArray ( value ) && value [ 1 ] . toString ( ) . length >= 7 ;
47
47
case eFormType . CELLPHONE :
48
- // TODO: improve cellphone validation
49
48
return Array . isArray ( value ) && value [ 1 ] . toString ( ) . length === 10 ;
50
49
case eFormType . NEW_PASSWORD :
51
50
return Array . isArray ( value ) && value [ 0 ] === value [ 1 ] ;
52
51
case eFormType . EMAIL :
53
52
return typeof value === "string" && isEmail ( value ) ;
54
53
default :
54
+ // no validation required, assume true
55
55
return true ;
56
56
}
57
57
}
58
58
59
59
/**
60
- * check if FormInput value is valid
60
+ * Check if FormInput value is valid
61
+ *
62
+ * Array.every is truthy for empty arrays
61
63
*/
62
- export const isValidFormInputValue = ( input : FormInput , ignoreRequiredParam = false ) : boolean => {
63
- const { values, multiple, required, min, max } = input ;
64
+ export const isValidFormInputValue = ( input : FormInput , ignoreRequired = false ) : boolean => {
65
+ const { values, multiple, type , required, min, max } = input ;
64
66
65
- if ( ! values ) return false ;
67
+ // When required, false if empty array
68
+ if ( ( ! values || ! values . length ) && required && ! ignoreRequired ) return false ;
66
69
67
70
if ( multiple ) {
68
- if ( values . length < min ) return false ;
69
- if ( values . length > max ) return false ;
71
+ // Bypass if not required
72
+ // The UI should ensure the limits are not surpased
73
+ if ( required && ! ignoreRequired ) {
74
+ if ( values . length < min ) return false ;
75
+ if ( values . length > max ) return false ;
76
+ }
77
+ } else {
78
+ if ( type === eFormType . NUMBER ) {
79
+ // Number in range
80
+ return values . every ( ( number ) => {
81
+ number = Number ( number ) ;
82
+
83
+ return number >= min && number <= max ;
84
+ } ) ;
85
+ } else if ( ! type || type === eFormType . TEXT ) {
86
+ // String length in range
87
+ return values . every ( ( string ) => {
88
+ const length = String ( string ) . length ;
89
+
90
+ return ! string || ( length >= min && length <= max ) ;
91
+ } ) ;
92
+ }
70
93
}
71
94
72
- // value is valid or not
73
- const valid = ! ! values . length && values . every ( ( value ) => isValidValue ( value , input ) ) ;
95
+ // The actual values are valid
96
+ const valid = values . every ( ( value ) => isValidValue ( value , input ) ) ;
97
+ // All values have content
74
98
const notEmpty = values . every ( ( v ) => notEmptyValue ( v , input . defaults ) ) ;
75
99
76
100
// if empty but not required then value is truthy
77
- return valid || ( ! notEmpty && ! required && ! ignoreRequiredParam ) ;
101
+ return valid || ( ! notEmpty && ( ! required || ignoreRequired ) ) ;
78
102
} ;
79
103
80
104
/** suffixes used on values */
@@ -120,10 +144,13 @@ export function getFormInputsValues<V extends Record<string, any>>(
120
144
) : V {
121
145
return inputs . reduce ( ( acc , input , index ) => {
122
146
// inadecuate format, ignore
123
- if ( ! input . name || ! input . values || ! Array . isArray ( input . values ) || ! input . values . length ) {
124
- if ( ! input . name ) console . log ( `Missing name on input with index ${ index } ` ) ;
125
-
126
- return acc ;
147
+ if ( ! input . name ) throw new Error ( `Missing name property on input with index ${ index } ` ) ;
148
+ else if ( ! Array . isArray ( input . values ) || ! input . values . length ) {
149
+ /**
150
+ * Validation expects an array with at least one element
151
+ * SUGGESTION: reconsider this approach
152
+ */
153
+ if ( input . required ) input . values = [ "" ] ;
127
154
}
128
155
129
156
input . values . forEach ( ( value ) => {
@@ -197,7 +224,8 @@ export function getFormInputsValues<V extends Record<string, any>>(
197
224
* Returns the actual data object to send to the api
198
225
*/
199
226
export function getFormValues < V extends Record < string , any > > (
200
- inputs : V | FormInput [ ]
227
+ inputs : V | FormInput [ ] ,
228
+ plainValues = true
201
229
) : iFormResults < V > {
202
230
if ( ! Array . isArray ( inputs ) ) return { values : inputs , invalidInputs : [ ] } ;
203
231
@@ -212,7 +240,7 @@ export function getFormValues<V extends Record<string, any>>(
212
240
} )
213
241
) ;
214
242
215
- const values : V = getFormInputsValues ( inputs ) ;
243
+ const values : V = getFormInputsValues ( inputs , plainValues ) ;
216
244
const invalidInputs = getFormInputsInvalids ( inputs ) . filter ( ( { name } ) => {
217
245
return values [ name ] !== undefined ;
218
246
} ) ;
0 commit comments