Coder Social home page Coder Social logo

arkemishub / form Goto Github PK

View Code? Open in Web Editor NEW
11.0 2.0 0.0 5.91 MB

Flexible and extensible form

Home Page: https://form.arkehub.com

License: Apache License 2.0

JavaScript 1.87% TypeScript 88.12% CSS 4.10% Dockerfile 1.53% MDX 4.00% HTML 0.39%
arke form

form's Introduction

@arkejs/form

Form

License

Form component to automate form generation process

Usage

First of all, you need to install the library:

npm install @arkejs/form
pnpm install @arkejs/form

You can create a FormProvider to associate automatically a component from field type:

import { FormConfigProvider } from '@arkejs/form'

function Application() {
  return (
    <FormConfigProvider
        components={{
          boolean: ({field}) => (<input {...field} type="checkbox" onChange={(e) => field.onChange(e.target.value)} />),
          string: ({field}) => (<Input{...field} onChange={(e) => field.onChange(e.target.value)} />)
        }}
    >
      ...
    </FormConfigProvider>
  )
}

Then you're able to import the Form and the FormField components:

import { FormConfigProvider, Form, FormField } from '@arkejs/form'

function Application() {
  return (
    <FormConfigProvider>
       <Form
         onSubmit={(values) => setData(values)}
         onChange={(values) => console.log(values)}
       >
         <div
           style={{
             display: 'grid',
             gridTemplateColumns: 'auto auto auto auto',
             gridGap: '8px 20px',
           }}
         >
           <FormField id="name" type="string" />
           <FormField id="surname" type="string"/>
           <FormField
             id="profile_image"
             // custom render ignore type 
             render={({field, formState, fieldState}) => (
               <AvatarCustomComponent {...field} />
             )}
           />
         </div>
       </Form>
    </FormConfigProvider>
  )
}

You can also use the Form without the general FormConfigProvider and use the components props to define the component by field type

import { Form, FormField } from '@arkejs/form'

function Application() {
    return (
        <Form
            onSubmit={(values) => setData(values)}
            onChange={(values) => console.log(values)}
            // Define here the components
            components={{
                boolean: ({field}) => (<input {...field} type="checkbox" />),
                string: ({field}) => (<input{...field} />)
            }}
        >
            <div
                style={{
                    display: 'grid',
                    gridTemplateColumns: 'auto auto auto auto',
                    gridGap: '8px 20px',
                }}
            >
                <FormField id="name" type="string" />
                <FormField id="surname" type="string"/>
            </div>
        </Form>
    )
}

Manage the internal state

If you need to use the internal form state or useful functionalities, as looks the value of one field or reset the form state, you can use the useForm hook.

The methods object is based on react-hook-form library, to understand all functionalities look the React Hook Form Documentation

import { Form, FormField } from '@arkejs/form'

function Application() {
    const { formProps, methods } = useForm();
    const { watch, reset } = methods;
    const nameValue = watch('name');
    return (
        <Form
            {...formProps}
            onSubmit={(values) => setData(values)}
        >
            <div
                style={{
                    display: 'grid',
                    gridTemplateColumns: 'auto auto auto auto',
                    gridGap: '8px 20px',
                }}
            >
                <FormField id="name" type="string" />
                {nameValue.length > 0 &&<FormField id="surname" type="string"/>}
            </div>
            <button type="button" onClick={() => reset()}>Reset fields</button>
        </Form>
    )
}

Define the DefaultValues

If you need to update the default values after first render you can pass fields directly on useForm:

import { Form, FormField } from '@arkejs/form'

async function Application() {
    const responseFields = await axios.get('/fields')
    const { formProps } = useForm({
        fields: responseFields.data,
    });
    return(
        <Form
            {...formProps}
            onSubmit={(values) => setData(values)}
        >
            ...
        </Form>
    )
}

form's People

Contributors

github-actions[bot] avatar ilyichv avatar manolo-battista avatar semantic-release-bot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

form's Issues

[bug] - nested fields are not working properly

We need to adjust following lines of code in order to make defaultValues work properly on nested fields.

 const computedDefaultValues = useMemo(() => {
    return fields?.reduce((acc: Record<string, any>, field) => {
      acc[field.id] = getFieldDefaultValue
        ? getFieldDefaultValue(field)
        : field.value;
      return acc;
    }, {});
  }, [fields, getFieldDefaultValue]);

Ideally splitting field.id by . and creating nested objects would be enough since Field is handling the id registration properly.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.