UNPKG

react-formian

Version:

A React framework for easily creating and handling controlled forms

163 lines (115 loc) 10 kB
An insect-based module for creating controlled web forms for React. * Easy to write; easy to read * Pre-packed with front-end formatters and validators * Auto-injects styles (override without using `!important`) * Easy to customize * Mirrors HTML syntax **currently in alphause with caution** **This package requires that your project uses React** # Controlled form elements as React components [See Live Demo](https://bcnichols3.github.io/react-formian/example/public/index.html) ## Installation React Formian is distributed via [npm](https://www.npmjs.com/package/react-formian), with styles distributed on [UNPKG](https://unpkg.com) ```bash npm install react react-formian ``` ## Usage ```javascript import React from 'react'; import ReactDOM from 'react-dom'; import Formian from 'react-formian'; const submitHandler = function(formData) { console.log('hello world', formData) } ReactDOM.renderComponent( <Formian.Form onSubmit={submitHandler}> <h1>My Form Title</h1> <Formian.Name /> <Formian.Email /> <Formian.Checkbox name="agree" labelText="Aren't ants amazing?" required={false} /> <Formian.Submit /> <p>My legal text</p> </Formian.Form>, document.getElementById('main') ) ``` ## Styles Styles for Formian elements are dynamically injected. Prevent their injection and write your own, simply by adding `customStyles={true}` to your Formian.Form element. You can also pre-require Formain's styles by adding a stylesheet link to your HTML document and pointing the href to `https://unpkg.com/react-formian@[your version]/build/style.css`, and then setting `customStyles` to `true`, as above. Each container is wrapped in an identical manner, with a `div` that has a class of `input-container` as well as the input type and subtype. ## Props **Props in brackets (`[ ]`) are optional** ### `Formian.Form` Component API **All form input elements are children of `Formian.Form`. You can also put anything else you might need in as a child, as `Formian.Form` only manipulates form inputs.** |Prop |Type |Default |Description | |-----------|:------:|:---------:|-------------------------------------------- | |onSubmit |`function`|`undefined`|Required: function that will utilize one argument: `formData` | |[className]|`string`|`""`|Set a CSS class for custom styles | |[submitOnChange]|`boolean`|`false`|Runs the onSubmit function after every change, with a two second timeout. Use for auto-saving the form. | |[customStyles]|`boolean`|`false`|Used to prevent Formain's native styles from being injected on the page | ### Common Child Component API Formian elements are intended to mirror native HTML elements as closely as possible, just with a lot of useful built-in structure and accessibility properties (e.g. `tabindex` for mouse-less navigation). The hope is you will be able to trust that Formian has fully extended and utilized HTML's [native functionality](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input) so these docs may feel (mostly) redundant. |Prop |Type |Default |Description | |-----------|:------:|:---------:|-------------------------------------------- | |name |`string`|`undefined`|Required: Key name for the formData object (some child types have a default for ease of use but it’s recommended to declare names manually) | |[className]|`string`|`""`|Set a CSS class for custom styles | |[labelText]|`string`|`name`|Label or Legend text | |[required]|`boolean`|`true`|Submit button is disabled until all required fields have a valid input | |[formatter]|`function`|`undefined`|Custom formatter function; manipulates the field value during every onChange event | ### `Formian.Text` Component API **Shared by `Formian.Email`, `Formian.Number`, `Formian.Password`, `Formian.Tel` and `Formian.TextArea`** |Prop |Type |Default |Description | |-----------|:------:|:---------:|-------------------------------------------- | |[defaultValue]|`string`|`""`|Value that the form element should initially render with | |[placeholder]|`string`|`""`|Placeholder text | |[errorText]|`string` or `false`|`"Please enter a valid input"`|Invalid input error message text (does not render if false) | |[validator]|`function`|`undefined`|Custom validator function; returns a boolean that asserts an acceptable input. If `required` is set to `false`, the validator will not run | Common fields like Email, Text, Tel, etc ... are designed to be as easy to use as possible and (assuming no customization needs) require nothing besides being called as a child of `Formian.Form`. However, for the sake of readability, it's advised you always declare a name manually in your JSX, so coders can easily associate an input with its corresponding key in the `formData` object. ### `Formian.Checkbox` Component API **Shared by `Formian.OnOff`, a stylized Checkbox** |Prop |Type |Default |Description | |-----------|:------:|:---------:|-------------------------------------------- | |[defaultValue]|`boolean`|`false`|Value that the form element should initially render with | |[children]|`react components`|`undefined`|Component to be placed inline with the checkbox; supersedes `labelText` | |[errorText]|`string` or `false`|`"Please check to agree"`|Invalid input error message text (if `false`, does not render) | |[icon]|`URL string` or `React Component`|`'\u2714'`|Custom checkmark icon | |[tinyInt]|`boolean`|`false`|Field returns `1` or `0` instead of `true` or `false` | ### `Formian.Radio` Component API While you are likely used to declaring Radio buttons one-by-one (like a series of Checkboxes), Formian.Radio creates all radio elements together, wrapped in a `Fieldset`. This means they're declared in your JSX very similarly to a Select, and should tip you off to always ask the question: should this input be a `Radio`, or a `Select`? For lengthier text, options for bigger buttons or a vertical layout is in the works. |Prop |Type |Default |Description | |-----------|:------:|:---------:|-------------------------------------------- | |options|`array of strings`|`undefined`|Required: Array of values for this key | |[defaultValue]|`integer`|`0`|Value as an index of the options array with which the form element should initially render | ### `Formian.Select` Component API |Prop |Type |Default |Description | |-----------|:------:|:---------:|-------------------------------------------- | |options|`array of strings`|`undefined`|Required: Array of values for this key | |[defaultValue]|`integer`|`0`|Value as an index of the options array with which the form element should initially render | |[placeholder]|`string`|`""`|Placeholder text | |[errorText]|`string`|`Please select an option`|Invalid input error message text | ### `Formian.Range` Component API |Prop |Type |Default |Description | |-----------|:------:|:---------:|-------------------------------------------- | |[defaultValue]|`integer`|`0`|Value the slider will initially render on | |[min]|`integer`|`0`|Minimum value for this Range | |[max]|`integer`|`100`|Maximum value for this Range | |[step]|`integer`|`1`|Step at which the Range increments or decrements | ### `Formian.Submit` Component API Triggers your `onSubmit` function. This button is grayed out until all required fields have a valid value, and `onSubmit` is not called. If Submit is clicked when this is not true, all erroneous form inputs will be highlighted, and display their error text, until they're focused. |Prop |Type |Default |Description | |-----------|:------:|:---------:|-------------------------------------------- | |[labelText]|`string`|`""`|Text displayed on the button; supersedes `value` | |[value]|`string`|`Submit`|Text displayed on the button | ### `Formian.Reset` Component API Resets all your fields to their default state. This button is grayed out and unclickable until the form is not in a default state. This button is a great addition to all kinds of user settings interfaces. |Prop |Type |Default |Description | |-----------|:------:|:---------:|-------------------------------------------- | |[labelText]|`string`|`""`|Text displayed on the button; supersedes `value` | |[value]|`string`|`Restore Defaults`|Text displayed on the button | ## Coming soon **`Formian.Dataset`, `Formian.Date`, rerender optimizations, easily customized colors, animated placeholders, and so much more are on the horizon**