UNPKG

gatsby-gravityforms-component

Version:

A component to take gatsby-source-gravityforms query data and return a usable form.

191 lines (177 loc) 6.92 kB
import classnames from 'classnames' import get from 'lodash/get' import React from 'react' import Captcha from '../../components/Captcha' import Html from '../../components/Html' import Input from '../../components/Input' import InputWrapper from '../../components/InputWrapper' import Multiselect from '../../components/Multiselect' import Select from '../../components/Select' import SelectorList from '../../components/SelectorList' import Textarea from '../../components/Textarea' import { filteredKeys } from '../../utils/helpers' import { ifDefaultValue, islabelHidden } from '../../utils/inputSettings' const FieldBuilder = ({ formData, presetValues = {}, register, errors, setValue, controls = {}, formLoading, setFormLoading, }) => { // Loop through fields and create return formData.formFields.map(field => { // Set the wrapper classes const { descriptionPlacement: fieldDescPlace, isRequired, subLabelPlacement: fieldSubLabelPlace, visibility, } = field const descriptionPlacement = fieldDescPlace || formData.descriptionPlacement const subLabelPlacement = fieldSubLabelPlace || formData.subLabelPlacement const fieldData = { ...field, descriptionPlacement } let inputWrapperClass = classnames( 'gfield', 'gravityform__field', 'gravityform__field__' + field.type, 'gravityform__field--' + field.size, field.cssClass, { 'field-required': field.isRequired }, { 'hidden-label': islabelHidden(field.labelPlacement) }, { gfield_contains_required: isRequired }, { [`field_sublabel_${subLabelPlacement}`]: subLabelPlacement }, `field_description_${descriptionPlacement}`, `gfield_visibility_${visibility}` ) const wrapId = `field_${formData.formId}_${field.id}` //TODO: Should this match GF version "input_form.id_input.id" const inputName = `input_${field.id}` const componentProps = { errors: errors[inputName], formLoading: formLoading, setFormLoading: setFormLoading, fieldData: fieldData, key: field.id, name: inputName, register: register, value: get(presetValues, inputName, false) ? get(presetValues, inputName, false) : ifDefaultValue(field), wrapClassName: inputWrapperClass, wrapId: wrapId, } let errorKey = '' if (controls[field.type]) { return (<InputWrapper inputData={fieldData} labelFor={inputName} {...componentProps}>{React.cloneElement(controls[field.type], componentProps)}</InputWrapper>) } switch (field.type) { // Add note for unsupported captcha field case 'captcha': return ( <Captcha captchaTheme={field.captchaTheme} errors={errors[`input_${field.id}`]} fieldData={fieldData} key={field.id} name={inputName} register={register} setValue={setValue} wrapClassName={inputWrapperClass} /> ) // Start with the standard fields case 'text': case 'number': case 'email': case 'hidden': case 'date': case 'phone': return ( <Input errors={errors[inputName]} fieldData={fieldData} key={field.id} name={inputName} register={register} value={ get(presetValues, inputName, false) ? get(presetValues, inputName, false) : ifDefaultValue(field) } wrapClassName={inputWrapperClass} wrapId={wrapId} /> ) case 'textarea': return ( <Textarea errors={errors[inputName]} fieldData={fieldData} key={field.id} name={inputName} register={register} wrapClassName={inputWrapperClass} wrapId={wrapId} /> ) case 'select': return ( <Select errors={errors[inputName]} fieldData={fieldData} key={field.id} name={inputName} register={register} wrapClassName={inputWrapperClass} wrapId={wrapId} /> ) case 'multiselect': return ( <Multiselect errors={errors[inputName]} fieldData={fieldData} key={field.id} name={inputName} register={register} wrapClassName={inputWrapperClass} wrapId={wrapId} /> ) case 'radio': case 'checkbox': errorKey = filteredKeys(errors, RegExp(`input_${field.id}_`)) return ( <SelectorList errors={ errorKey.length > 0 ? errors[errorKey[0]] : null } fieldData={fieldData} key={field.id} name={inputName} register={register} wrapClassName={inputWrapperClass} wrapId={wrapId} /> ) case 'html': return ( <Html fieldData={fieldData} key={field.id} name={inputName} wrapClassName={inputWrapperClass} wrapId={wrapId} /> ) default: return null } }) } export default FieldBuilder