npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

dynamic-form-generator-o

v1.0.2

Published

A package that allows generation and validation of forms based on a JSON schema definition, combining Zod, Yup, and custom rules. It would create a standardized way to validate complex forms with conditional fields, dependencies, and custom validation log

Downloads

129

Readme

Dynamic Form Generator

Dynamic Form Generator is a React-based package for dynamically generating forms using a JSON schema. It integrates form validation using Zod and offers customization options for developers to define their fields, validation rules, and styles. The package comes with default TailwindCSS styling, but this can be easily overridden to match custom design needs.

Features

  • Dynamic Form Generation: Define forms with any combination of fields in a JSON schema, and the form will be rendered dynamically.
  • Zod Validation: Built-in validation powered by Zod, ensuring that your forms are validated both on the client side and with highly customizable validation rules.
  • Customizable: Default styling is provided with TailwindCSS, but developers can override and apply their custom styles easily.
  • Supports Different Field Types: Text, email, password, select, and more.
  • Error Display: Automatic error display below fields on validation failure.

Installation

To install the package, use the following command:

npm i dynamic-form-generator-o

or with Yarn:

yarn add dynamic-form-generator-o

Usage

  1. Basic Example

Here's a simple example of how to use the package with default settings:

import React from 'react';
import DynamicFormGenerator from 'dynamic-form-generator-o';

const App = () => {
   const onSubmit = (data: Partial<FormData>) => {
      console.log('Form Data:', data);
   };

   return (
      <div>
         <DynamicFormGenerator onSubmit={onSubmit} />
      </div>
   );
};

export default App;
  1. Customizing Form Fields and Styles.

You can provide a custom form schema and styles as props:

import React from 'react';
import DynamicFormGenerator from 'dynamic-form-generator-o';

const customSchema = {
   title: 'Custom Registration Form',
         fields: [
         {
            name: 'username',
            type: 'text' as const,
            label: 'Username',
            placeholder: 'Enter your username',
            validation: { required: true, minLength: 6 },
         },
         {
            name: 'email',
            type: 'email' as const,
            label: 'Email',
            placeholder: 'Enter your email',
            validation: { required: true },
         },
         {
            name: 'password',
            type: 'password' as const,
            label: 'Password',
            placeholder: 'Enter your password',
            validation: { required: true, minLength: 8 },
         },
         {
            name: 'age',
            type: 'number' as const,
            label: 'Age',
            placeholder: 'Enter your age',
            validation: {
               required: false,
               minLength: 2,
            },
         },
         {
            name: 'Sex',
            type: 'select' as const,
            label: 'Sex',
            options: ['male', 'female'],
            placeholder: 'Select your gender',
            validation: { required: true, minLength: 6 },
         },
         {
            name: 'Date',
            type: 'date' as const,
            label: 'Date',
            placeholder: 'Enter Date',
            validation: { required: true, minLength: 6 },
         },
      ],
};

const customStyles = {
   title: 'text-xl text-red-600 font-bold mb-6 text-center',
   formWrapper: 'max-w-2xl mx-auto p-6 shadow-md',
   input: 'w-full p-2 border rounded-md',
   select: 'w-full p-2 border rounded-md',
   label: 'block mb-2 text-sm font-medium text-gray-700',
   errorText: 'text-red-500 text-xs mt-1',
   submitButton:
      'w-full bg-green-500 text-white py-2 rounded-md hover:bg-green-600',
};

const onSubmit = (data: Partial<FormData>) => {
   console.log('Form Data:', data);
};

const App = () => {
   return (
      <div>
         <DynamicFormWithProps
            formSchema={customSchema}
            styles={customStyles}
            onSubmit={onSubmit}
            buttonText="Register"
         />
      </div>
   );
};

export default App;

Validation

Form validation is powered by Zod, and the schema is automatically generated from your form fields' validation rules. You can customize field validation rules with the validation key in the schema.

{
  name: 'email',
  type: 'email'  as const,
  label: 'Email',
  validation: {
    required: true,
    pattern: '[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z]{2,}'
  }
}

Available Field Types

  • text: Basic input field for text.
  • email: Email input with validation.
  • password: Password field.
  • select: Dropdown selection with custom options.

Styling

By default, the form uses TailwindCSS classes for layout and styling. However, you can override these styles by passing a styles object to the DynamicFormGenerator component.

You can replace these classes with your own custom styles as shown in the "Customizing Form Fields and Styles" section.

API

DynamicFormGenerator

| Property | Type | Default | Description | | ---------- | -------- | -------------------------- | ---------------------------------------------------------------------- | | formSchema | object | Default form schema | Object defining the form fields, labels, and validation rules. | | styles | object | Default TailwindCSS styles | Object to override default styles with custom CSS or Tailwind classes. | | onSubmit | function | Required | Function to handle form submission. | | buttonText | string | 'Submit' | Text displayed on the submit button. |

Default Style Classes

| Class Name | Purpose | | ------------ | ------------------------------------- | | formWrapper | Container that wraps the entire form. | | title | Class for form title. | | input | Class for all input fields. | | select | Class for dropdown (select) fields. | | label | Class for field labels. | | errorText | Class for error messages. | | submitButton | Class for the submit button. |

Props

  • schema - The JSON schema that defines the fields and validation rules. Example:
const formSchema = {
   title: 'User Registration',
   fields: [
      {
         name: 'username',
         type: 'text '  as const,
         label: 'Username',
         validation: { required: true, minLength: 3 },
      },
      {
         name: 'email',
         type: 'email'  as const,
         label: 'Email',
         validation: { required: true },
      },
   ],
};
  • onSubmit - A callback function that gets called when the form is submitted successfully with validated data. - Example:
const handleSubmit = (data) => {
   console.log('Form Data:', data);
};
  • styles (optional) - Custom styles for fields and buttons. Example:
const styles = {
   input: 'border p-2 rounded',
   button: 'bg-blue-500 text-white',
   error: 'text-red-500',
};

Customization

Developers can easily override the default styles or add new field types by extending the schema and providing custom form elements.

Example of adding new field types:

const formSchema = {
   title: 'Event Registration',
   fields: [
      {
         name: 'eventDate',
         type: 'date'  as const,
         label: 'Event Date',
         validation: {
            required: true,
         },
      },
   ],
};

License

This package is MIT licensed.

Contribution

Contributions are welcome! If you find any bugs or have feature requests, please feel free to open an issue or submit a pull request on the GitHub repository.

Author

Developed by onah.