Skip to content

DevOsamaIslam/mui-custom-form

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📝 CustomForm

CustomForm is a versatile React form component designed to simplify your form-building journey. Powered by MUI components and the flexibility of react-hook-form, this package offers an intuitive way to create dynamic and responsive forms.

📚 Table of Contents

🛠 Installation

npm install mui-custom-form

📦 Dependencies:

  • @mui/material
  • @mui/x-date-pickers
  • react-hook-form

✨ Features

  • 🎛 Dynamic Field Types
  • 🎨 MUI Integration
  • 📱 Responsive Design

🚀 Usage

🔧 Props

CustomForm Component

Name Description Is Required?
fieldsGroups 2D array representing groups of fields in the form. Yes
onSubmit Array containing functions for form submission and error handling. Yes
formControl Control object from react-hook-form. Yes
submitButton Boolean to toggle the visibility of the submit button. No
resetButton Boolean to toggle the visibility of the reset button. No
actionButtonsPlacement CSS property for button placement. No
otherProps Any additional props to pass down to the form component. No

CustomField 2D Array

Name Description Is Required?
label The display label of the field. Yes
name The name attribute of the field. Yes
type The type of the field. Yes
list An array of options for select type fields. Conditional
required Is the field mandatory? No
otherProps Any additional props. No
span Grid span for the field. No

* list prop is required when the type is single-select or multi-select.


📖 Examples

Basic Form

const BasicForm = () => {
  const formControl = useForm<{ username: string; birthdate: string }>()

  const fieldsGroups: IFieldGroup = [
    [
      {
        label: "Username",
        name: "username",
        type: "text",
        required: true,
      },
      {
        label: "Birthdate",
        name: "birthdate",
        type: "date",
        required: true,
      },
    ],
  ]

  const handleSubmit = (data: { username: string; birthdate: string }) => {
    console.log({ success: data })
  }

  const submitError = (data: unknown) => {
    console.log({ error: data })
  }

  return (
    <CustomForm
      fieldsGroups={fieldsGroups}
      onSubmit={[handleSubmit, submitError]}
      formControl={formControl}
    />
  )
}

Form with Zod Validation

const GENDERS = ["Male", "Female"] as const
const HOBBIES = ["Coding", "Collections", "Hiking"] as const

const Fields = z.object({
  username: z.string(),
  age: z.number().min(16).max(80),
  gender: z.enum(GENDERS),
  hobbies: z.array(z.enum(HOBBIES)).nonempty("Please choose one"),
  birthDate: z.date(),
  file: z.instanceof(File).optional(),
})

type FieldTypes = z.infer<typeof Fields>

const FormWithZod = () => {
  const formControl = useForm<FieldTypes>({
    resolver: zodResolver(Fields),
  })

  const fieldsGroups: IFieldGroup<FieldTypes> = [
    [
      {
        label: "Username",
        name: "username",
        type: "text",
        required: true,
      },
      {
        label: "Age",
        name: "age",
        type: "number",
        required: true,
      },
    ],
    [
      {
        label: "Gender",
        name: "gender",
        type: "single-select",
        list: GENDERS.map((gender) => ({ label: gender, value: gender })),
      },
      {
        label: "Hobbies",
        name: "hobbies",
        type: "multi-select",
        list: HOBBIES.map((hobby) => ({ label: hobby, value: hobby })),
        required: true,
      },
    ],
    [
      {
        label: "Date of birth",
        name: "birthDate",
        type: "date",
      },
      {
        label: "Upload Image",
        name: "file",
        type: "file",
      },
    ],
  ]

  const onSubmit = (data: FieldTypes) => {
    console.log({ success: data })
  }

  return (
    <CustomForm
      fieldsGroups={fieldsGroups}
      onSubmit={[onSubmit]}
      formControl={formControl}
    />
  )
}

🤝 Contribution

Your contributions are always welcome!

License

This project is licensed under the MIT license.


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published