# atomic-form

> A React form with data collection and validation.

Latest version **0.1.5** (published 2016-01-28) · MIT license · 0 weekly downloads

## Install

```sh
npm install atomic-form
pnpm add atomic-form
yarn add atomic-form
bun add atomic-form
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.5 |
| Published | 2016-01-28 |
| First published | 2015-08-07 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 2 |
| Known vulnerabilities | 0 (+9 in 2 direct dependencies) |
| Install scripts | no |
| GitHub stars | 7 |
| Maintainers | atomicjolt |
| Keywords | react, react-component, forms, form, validation, data-binding, data-collection |

## Links

- npm: https://www.npmjs.com/package/atomic-form
- Repository: https://github.com/atomicjolt/atomic-form
- Homepage: https://atomicjolt.github.io/atomic-form/
- Issues: https://github.com/atomicjolt/atomic-form/issues
- npm.io page: https://npm.io/package/atomic-form

## Dependencies (2)

- [lodash](https://npm.io/package/lodash.md) ~3.10.0
- [validator](https://npm.io/package/validator.md) ^3.40.0

## Alternatives

- [mobx-react](https://npm.io/package/mobx-react.md) — 2.8M weekly downloads
- [rc-tree](https://npm.io/package/rc-tree.md) — 2.6M weekly downloads
- [@react-oauth/google](https://npm.io/package/@react-oauth/google.md) — 1.3M weekly downloads
- [@wagmi/connectors](https://npm.io/package/@wagmi/connectors.md) — 877.0K weekly downloads
- [vee-validate](https://npm.io/package/vee-validate.md) — 836.4K weekly downloads

## Recent versions

- 0.1.5 (latest) — 2016-01-28
- 0.1.4 — 2015-09-03
- 0.1.3 — 2015-08-27
- 0.1.2 — 2015-08-27
- 0.1.1 — 2015-08-21
- 0.1.0 — 2015-08-20
- 0.0.4 — 2015-08-15
- 0.0.3 — 2015-08-10
- 0.0.2 — 2015-08-07
- 0.0.1 — 2015-08-07

## README

<img src="https://raw.githubusercontent.com/atomicjolt/atomic-form/master/AtomicForm.png" width="500"/>

A complete component for building React Forms.

## Features
- Atomic Forms integrates with [Validator](https://www.npmjs.com/package/validator) for quick validations.
- Custom functions for validation, including validating against other form fields.
- Validate/Gather form data as users inputs data.
- Populate forms with initial data.
- Use multiple validations on a single input.
- Recieve and display multiple validation message errors.

## Video
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/r_tljStPKmk/0.jpg)](http://www.youtube.com/watch?v=r_tljStPKmk)

## Installation

```sh
npm install atomic-form
```

Then with a module bundler or webpack, use as you would anything else:

```js
// using an ES6 transpiler
import AtomicForm from 'atomic-form';
// not using an ES6 transpiler
var AtomicForm = require('atomic-form');
```

## AtomicForm Props
- **doSubmit**: A callback that will be used when all validations are successful. The callback will be invoked with a single parameter containing formData.
- **afterValidation**: A callback that will be used when any validations fail. The callback will have a single parameter containing form validation errors/messages.
- initialData: (Optional) An object that will be used to populate the form with initial data.
- getState: (Optional) Allows for complete override of the getState method.
- updateFormData: (Optional) Allows for complete override of the updateFormData method.
- collectFormData: (Optional) Allows for complete override of the formData method.

## What's it look like?

```js
import AtomicForm from 'atomic-form';
import UserAction from './actions/user';

export default class RegisterForm extends React.createClass({

  constructor(props, context){
    super(props, context);
    this.state = this.getState();
  }

  getState() {
    //Optional - Set form initial data.
    return {
      initialData: {
        email: "test@example.com",
        password: "example",
        confirmPassword: "example"
      }
    }
  }

  afterValidation(formValidations) {
    //Callback after validation fails.
    this.setState({validations: formValidations});
  }

  doSubmit(formData) {
    //Callback after a user hits submit and the formdata is all valid.
    UserAction.register({
      User: {
        email: formData.email,
        password: formData.password
      }
    });
  }

  componentWillUnmount() {
    //Optional - We can get the formData from our form anytime.
    var formData = this.refs.MainForm.formData();
  }

  onInputChange() {
    //Optional - If we want to validate the form from an onChange callback.
    var formData = this.refs.MainForm.formData();
    var formValidations = this.refs.MainForm.validateForm(formData);
    this.setState(validations: formValidations);
  }

  validationMessage(field) {
    if (this.state.validations && this.state.validations[field]) {
      if (!this.state.validations[field].isValid) {
        return _.map(this.state.validations[field].message, (message) => {
          return <span>{message}</span>;
        });
      }
    }
    return <div/>;
  }

  render() {
    return <div>
      <AtomicForm ref="MainForm" initialData={this.state.initialData} doSubmit={this.doSubmit} afterValidation={this.afterValidation}>
        <div className="row">
          <input type="text" ref="email" validate={[
            {
              message: "Must be a valid Email.",
              validate: "isEmail",
            }
          ]} onChange={(e) => {this.onInputChange}}/>
          {this.validationMessage("email")}
          <input type="text" ref="password" validate={[
            {
              message: "Password must be at least 5 characters long.",
              validate: "isLength",
              args: [5]
            }
          ]}/>
          {this.validationMessage("password")}
          <input type="text" ref="confirmPassword" validate={[
            {
              message: "Passwords must match",
              validate: (val, formData) => {val == formData.password},
            }
          ]}/>
          {this.validationMessage("confirmPassword")}
          <input type="submit" value="Submit"/>
        </div>
      </AtomicForm>
    </div>
  }
});
```
## Dependencies
- [Lodash](https://lodash.com/) - npm install should take care of this.

## Contact Us
[Atomic Jolt Website](http://www.atomicjolt.com/)

---
_Source: https://npm.io/package/atomic-form · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
