mehdibha / dotUI

✨ Accessible, mobile friendly, modern UI components.
https://dotui.org
MIT License
1.1k stars 25 forks source link

[feat] Add Forms Support #23

Open dulranga opened 1 month ago

dulranga commented 1 month ago

Feature description

Overview

I would love to add Forms support to this library with the clean declarative approach inspired by Ant Design with the use of react-hook-form and Zod as the validation library.

Benefits

What the developer has to do is structure the form and give the zod schema, the <Form.Item> will handle all the validation internally, and onFinish only calls when the form is validated.

Proposed Structure

const AddNewUser = () => {
  const form = useForm({
    resolver: zodResolver(
      z.object({
        firstName: z.string().max(20),
        lastName: z.string().max(20).optional()
      })
    )
  })

  return (
    <Form form={form} onFinish={data => console.log(data)}>
      <div className='grid gap-x-10'>
        <Form.Item label='First Name' name='firstName'>
          <CustomTextField />
        </Form.Item>
        <Form.Item label='Last Name' name='lastName'>
          <CustomTextField />
        </Form.Item>
      </div>

      <Button type='submit'>Submit</Button>
    </Form>
  )
}

Affected component/components

All Input fields

Additional Context

No response

Before submitting

dulranga commented 1 month ago

Since current input components return actual data as the first argument, this might need to be changed to work with react-form-hooks as it expects the onChange event

devongovett commented 1 month ago

I'd recommend taking a look at our forms guide in React Aria: https://react-spectrum.adobe.com/react-aria/forms.html. In many cases you don't even need react-hook-form or zod because the builtin validations are enough. There is a section about using those libraries, but I'd recommend starting simple and only adding them if needed. React Aria Components supports constraint validation, custom validation functions, server validation, etc. It's best to do zod-style validations on the server for security, and you can send the errors back to display via React Aria as well.

dulranga commented 1 month ago

I see. What do you think about DX? which way is easier to build complex forms?

Here are my thoughts about the way I proposed,

The React Aria approach and shadcn/ui approach both do it well but its lot of repetitive codes in each input.

Let me know about your thoughts