Skip to main content

Preference

A checkbox can also be used to control the availability of other fields. For example, you may want a text input to remain disabled until the user selects a specific option (or combination of options). This approach guides users through a logical flow, ensuring they only interact with fields when they are relevant. It’s useful for scenarios like enabling special instructions, unlocking advanced settings, or revealing optional details once a prerequisite choice is made. Refer Conditional Rendering.

This example uses the FormikFormBuilder to render. Each field is validated using Yup and defined in giftWrapFields config variable. Check Validation Rules for more detail.

Code Editor


import { Box, Button } from "@mui/joy";
import { Formik, Form } from "formik";
import { FormBuilder, ConditionAction, ConditionName, InputTypes, useFormBuilder, PostCondition, type FieldType} from "formik-form-builder";

function PreferenceCheckBox() {
const giftWrapFields: FieldType[] = [
{
  field: "orderExtras",
  type: InputTypes.CHECKBOX,
  initialValue: [],
  groupLabel: "Select order extras",
  validation: {
      required: true,
      minLength: 1,
      minLengthRuleMsg: "required",
      maxLength: 1,
      maxLengthRuleMsg: "Please select only one",
    },
  options: [
    { label: "Include Gift Wrap", value: "gift_wrap" },
    { label: "Express Shipping", value: "express" },
  ],
  muiProps: { variant: "outlined", color: "primary" },
},
{
  field: "specialInstructions",
  type: InputTypes.MULTI_TEXT,
  label: "Special Instructions",
  initialValue: "",
  conditions: {
    action: ConditionAction.SHOW,
    groups: [
      {
        group: "gift",
        groupPostCondition: PostCondition.AND,
        logic: [
          {
            field: "orderExtras",
            value: "gift_wrap",
            condition: ConditionName.INCLUDES,
            postCondition: PostCondition.AND,
          },
        ],
      },
    ],
  },
  muiProps: { placeholder: "Enter any special instructions" },
},
];

const { initailValues, yupSchemaValidation } = useFormBuilder(giftWrapFields);
return (
  <Formik
    initialValues={initailValues}
    validationSchema={yupSchemaValidation}
    onSubmit={(values, actions) => {
      console.log(values);
      alert(JSON.stringify(values, null, 2));
      actions.setSubmitting(false);
    }}
  >
    {({ values }) => (
      <Form>
        <FormBuilder
          fields={giftWrapFields}
          data-test="form"
          group="form"
          values={values}
        />
        <Box
          width={"100%"}
          display={"flex"}
          justifyContent={"center"}
          alignItems={"center"}
        >
          <Button variant="solid" type="submit">
            Submit
          </Button>
        </Box>
      </Form>
    )}
  </Formik>
);
}

export default PreferenceCheckBox;