antd-custom-form
Version:
A custom form component built with Ant Design
187 lines (163 loc) β’ 6.1 kB
Markdown
# antd-custom-form π
Say goodbye to the boilerplate blues! Introducing `antd-custom-form`, your one-stop shop for all things form-related in Ant Design. Create forms that are as easy to set up as they are on the eyes.
## Features π
- π **Versatile Fields**: Text, number, select, date, fileβyou name it, we've got it.
- π **Ant Design BFF**: Seamlessly integrates with your favorite UI library.
- π **Flexible Layout**: Uses Ant Design's grid system to make your forms look like a million bucks.
- π¬ **Action Button Customization**: Place 'em where you want 'em.
- π **Initial Values**: Because sometimes, you just want to give your users a head start.
## Installation π οΈ
```bash
# With npm
npm i antd-custom-form
# Or if you're a yarn person
yarn add antd-custom-form
```
## Props π
### For the Form π
| Prop | Required? | Default | Description |
| ------------------------ | --------- | ------------ | ---------------------------------------------------------------- |
| `fieldGroups` | Yes π¨ | - | An array of field groups. It's like Inception but for forms. |
| `onSubmit` | Yes π¨ | - | What happens in the form, stays in the formβuntil you submit it. |
| `formControl` | No π€· | - | Your very own Ant Design form instance. |
| `initialValue` | No π€· | - | Pre-fill like a pro. |
| `layout` | No π€· | "horizontal" | How do you like your forms? Stacked or side-by-side? |
| `actionButtonsPlacement` | No π€· | "end" | Where the action happens. |
| `submitButton` | No π€· | `true` | The button that seals the deal. |
| `resetButton` | No π€· | `true` | The button that says, "Let's start over, shall we?" |
| `formProps` | No π€· | - | Extra props? Yes, please! |
### For the Fields π±
| Prop | Required? | Default | Description |
| ------------ | -------------- | ------- | ------------------------------------------------ |
| `label` | Yes π¨ | - | What's in a name? Well, a lot actually. |
| `name` | Yes π¨ | - | The key to your field's heart. |
| `type` | Yes π¨ | - | The personality of your field. |
| `list` | Conditional π€ | - | The options that make your select fields happy. |
| `rules` | No π€· | - | Keep your fields in check. |
| `hide` | No π€· | false | Whether to render. |
| `formItemProps` | No π€· | - | The props for each form item. |
| `inputProps` | No π€· | - | The custom spices for each input. |
| `span` | No π€· | `24` | How much personal space to give your field? |
> π€ The `list` prop is only required for `single-select`, `multi-select` and `toggle`. For other field types, it's a "thanks, but no thanks" situation.
## Usage π¨
Ready to create your first masterpiece? Here's a quick example to get you started:
```ts
import React from "react"
import { CustomForm, IFieldGroup } from "antd-custom-form"
import { Typography, Divider } from "antd"
interface Fields {
firstName: string
age: number
color: string
dob: Moment
hobbies: string[]
gender?: "male" | "female"
isEnabled?: boolean
bio: string
}
function App() {
const fieldsGroups: IFieldGroup<Fields> = [
[
{
label: "Name",
name: "firstName",
type: "text",
rules: [{ required: true, message: "Please enter a name" }],
hide: true,
formItemProps: {
validateStatus: "success",
hasFeedback: true,
},
},
{
label: "Age",
name: "age",
type: "number",
},
],
[{
type: 'custom',
label <Divider />
}],
[
{
label: "Favorite Color",
name: ["color"],
type: "single-select",
list: [
{ label: "Red", value: "red" },
{ label: "Blue", value: "blue" },
{ label: "Green", value: "green" },
],
},
{
label: "Date of Birth",
name: "dob",
type: "date",
},
],
[
{
label: "Hobbies",
name: "hobbies",
type: "checkbox",
list: [
{ label: "Hobby 1", value: "h1" },
{ label: "Hobby 2", value: "h2" },
],
},
{
label: "Gender",
name: "gender",
type: "radio",
list: [
{ label: "Male", value: "male" },
{ label: "Female", value: "female" },
],
},
],
[
{
label: "Bio",
name: "bio",
type: "textarea",
},
{
label: "Is Active?",
name: "isEnabled",
type: "toggle",
list: [
{ label: "Yes", value: true },
{ label: "No", value: false },
],
},
],
]
const handleSubmit = (data: Fields) => {
console.log("Form Data:", data)
}
return (
<div style={{ width: "70vw", marginInline: "auto" }}>
<Typography.Title>Basic Form</Typography.Title>
<CustomForm
fieldGroups={fieldsGroups}
onSubmit={handleSubmit}
resetButton={false}
layout="vertical"
initialValues={{
firstName: "Osama",
age: 27,
color: "teal",
dob: moment(),
hobbies: [],
bio: "",
}}
/>
</div>
)
}
```
## License π
MIT