gatsby-plugin-gravity-forms
Version: 
A component to take GraphQl Gravity Forms query data and return a usable form.
96 lines (90 loc) • 2.68 kB
JavaScript
import classnames from "classnames";
import PropTypes from "prop-types";
import React from "react";
import { valueToLowerCase } from "../../utils/helpers";
import { outputDescription } from "../../utils/inputSettings";
const InputWrapper = ({
  children,
  errors,
  inputData: {
    cssClass,
    description,
    descriptionPlacement,
    isRequired,
    label,
    maxLength,
    type,
  },
  labelFor,
  wrapClassName,
  wrapId,
}) => {
  const joinedLabel = `${label}${
    isRequired ? '<span class="gfield_required">*</span>' : ""
  }`;
  return (
    <li
      className={classnames(
        wrapClassName,
        errors?.type && "gravityform__field--error",
        cssClass
      )}
      id={wrapId}
    >
      <label
        className="gravityform__label gfield_label"
        htmlFor={labelFor}
        dangerouslySetInnerHTML={{ __html: joinedLabel }}
      />
      {outputDescription(description, descriptionPlacement, "above", errors)}
      <div
        className={`ginput_container ginput_container_${valueToLowerCase(
          type
        )}`}
      >
        {children}
        {maxLength > 0 && (
          <div className="charleft ginput_counter warningTextareaInfo">
            {maxLengthSentence(maxLength, type)}
          </div>
        )}
        {/* TODO: Implement number min/max, these currently aren't fetch by the source plugin
                    https://docs.gravityforms.com/field-object/#number
                    <div class="instruction ">
                      Please enter a number from <strong>1</strong> to <strong>15</strong>.
                    </div>
                */}
      </div>
      {outputDescription(description, descriptionPlacement, "below", errors)}
      {errors && (
        <div
          aria-live="polite"
          className="gravityform__error_message gfield_description validation_message"
        >
          {errors.message}
        </div>
      )}
    </li>
  );
};
const maxLengthSentence = (length, type) => {
  let word = type === "number" ? "numbers" : "characters";
  return length && ` (maxiumum ${length} ${word})`;
};
export default InputWrapper;
InputWrapper.propTypes = {
  children: PropTypes.node,
  errors: PropTypes.object,
  inputData: PropTypes.shape({
    description: PropTypes.string,
    descriptionPlacement: PropTypes.string,
    label: PropTypes.string,
    isRequired: PropTypes.bool,
    maxLength: PropTypes.number,
    type: PropTypes.string,
    cssClass: PropTypes.string,
  }),
  labelFor: PropTypes.string,
  wrapClassName: PropTypes.string,
  wrapId: PropTypes.string,
};