1.0.0 • Published 5 months ago

formiga v1.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
5 months ago

formiga

NPM Version NPM Downloads

Formiga logo


formiga. substantivo femenino:

Pequeno insecto da orde dos himenópteros, polo xeral de cor negra, que vive en colonias moi numerosas organizadas en clases, e do que existen varias especies.

As formigas escavan complexas galerías subterráneas.


Intro

formiga is the simplest -yet effective- form validator for React.

Stick to -and empower- web standards (HTML5 Constraint Validation API) instead of ignore them.

Table of Contents

  1. Intro
  2. Premature Validation
  3. UI integrations
  4. Demo
  5. Install
  6. Getting started

Intro

formiga aims to provide full <form> state and validation functionalities with:

  • no dependencies
  • no boilerplate:
    • no wrapping components, just use standard <form>, <input>, <textarea> and <select> HTML elements
    • no API to learn: just a couple of hooks useForm and useInput
  • HTML validation at our service

Premature Validation

HTML5 Constraint Validation API checks for validity changes when the input changes. Depending on the browser, it may mean: when the input's value changes or just when the input loses the focus.

Formiga is here to make your Forms much nicer: with prematureValidation, the ValidityState is updated always while typing!

UI integrations

formiga cares just about state and validation of your forms. UI and styling is out of scope. That's why you will probably not use formiga directly, but some of the integrations with some UI library. List is tiny yet:

· formiga-reactstrap

Given formiga works with native HTML elements (<form>, <input>, <textarea>, <select>), you will find pretty easy to couple it with any UI library. Or even just with some custom CSS if you go minimalist, as in our Demo.

Demo

Check a live demo at afialapis.com/os/formiga/.

Or run it locally with:

  npm run demo

Install

  npm i formiga

Getting started

Formiga provides just two hooks: useForm and useInput.

VForm will be the parent element. It just renders a form element, and provide a couple of render props (renderInputs and renderButtons) so you can render the rest.

Then, any input inside the Form that you want to be validated, must be wrapped within a VInput element.

Basic example

Let's check a basic example (try it at CodePen):

import React, {useState} from 'react'

const FormigaForm = () => {

  const form = useForm()
  const [name, setName]= useState('John Doe')
  const [age, _setAge]= useState('33') 

  const nameInput = useInput({
    type: 'text',
    disallowedValues: ["John Not Doe"],
    inputFilter: 'latin'
  })

  const ageInput = useInput({
    type: 'text',
    checkValue: (v) => !isNaN(v) && parseInt(v)>=18,
    inputFilter: 'int'
  })

  const handleSubmit = () => {
    let resume= ''
    form.elements
      .map((el) => {
        resume+= `Input ${el.name} ${el.valid ? 'is' : 'is not'} valid\n`
      })

    console.log(resume)
    // Input name is valid
    // Input age is valid
  }

  return (  
    <form ref = {form.ref}>
        
      {/* A controlled input */}
      <input ref       = {nameInput.ref}
             name      = {'name'}
             className = {nameInput.valid ? 'valid' : 'invalid'}
             required  = {true}
             value     = {name}
             onChange  = {(event) => setName(event.target.value)}/>

      {/* An uncontrolled input */}
      <input ref       = {ageInput.ref}
             name      = {'age'}
             className = {ageInput.valid ? 'valid' : 'invalid'}
             required  = {true}
             defaultValue = {age}/>
      <button
             onClick  ={(_ev) => handleSubmit()}
             disabled = {! form.valid}>
        Save
      </button>

    </form>
  )
}          

Changelog

See changelog here

1.0.0

5 months ago

1.0.0-beta.1

5 months ago

0.1.8

2 years ago

0.1.7

2 years ago

0.1.4

2 years ago

0.1.6

2 years ago

0.1.5

2 years ago

0.0.10

3 years ago

0.0.11

3 years ago

0.0.12

3 years ago

0.0.13

3 years ago

0.0.14

3 years ago

0.1.0

3 years ago

0.1.2

3 years ago

0.1.1

3 years ago

0.0.15

3 years ago

0.0.9

3 years ago

0.0.8

3 years ago

0.0.5

3 years ago

0.0.4

3 years ago

0.0.7

3 years ago

0.0.6

3 years ago

0.0.3

3 years ago

0.0.2

3 years ago

0.0.1

3 years ago