oikeuttaelaimille / gatsby-drupal-webform

React component for Drupal webforms
MIT License
21 stars 9 forks source link

Gatsby Drupal Webform

Build Status

React component for webforms. Goal of this project is to have a react component that generates bootstrap like HTML from webform YAML configuration.

Setup

npm install --save gatsby-drupal-webform

Example

import Webfrom from 'gatsby-drupal-webform'

import { navigate } from 'gatsby'

const ContactForm = ({ data: { webformWebform: webform } }) => (
    <Webform
        webform={webform}
        endpoint="http://localhost:8888/react_webform_backend/submit"
        onSuccess={(response) => navigate(response.settings.confirmation_url)}
    />
)

const query = graphql`
    query {
        webformWebform(drupal_internal__id: { eq: "contact" }) {
            drupal_internal__id
            elements {
                name
                type
                attributes {
                    name
                    value
                }
            }
        }
    }

`

Custom components

This module only provides basic components (textfield, number, textarea etc.) out of the box. More advanced webform components or composite components should be built as custom components. See: WebformEntityRadios for an example.

import React from 'react'
import { useStaticQuery, graphql } from 'gatsby'
import { useWebformElement, WebformElementWrapper } from 'gatsby-drupal-webform'

const WebformEntityRadios = ({ element, error }) => {
    const {
        allTaxonomyTermTags: { nodes: tags }
    } = useStaticQuery(graphql`
        {
            allTaxonomyTermTags {
                nodes {
                    drupal_internal__tid
                    name
                }
            }
        }
    `)

    const [inputProps, settings] = useWebformElement(element, {
        name: element.name,
        type: 'radio'
    })

    return (
        <WebformElementWrapper settings={settings} error={error}>
            {tags.map(({ drupal_internal__tid: tid, name }) => (
                <div className="form-check" key={tid}>
                    <inputid={`tags-${tid}`} className="form-check" defaultChecked={parseInt(inputProps.defaultValue, 10) === tid} {...inputProps} />
                    <label htmlFor={`tags-${tid}`} className="form-check-radio">
                        {name}
                    </label>
                </div>
            ))}
        </WebformElementWrapper>
    )
}

const SelectTagForm = () => (
    <Webform
        id="webform"
        webform={props.data.webformWebform}
        endpoint={config.env.ENDPOINT}
        customComponents={{
            webform_entity_radios: WebformEntityRadios
        }}
        onSuccess={() => {
            setSubmitted(true)
        }}
    />
)