Skip to content

Yoskutik/mobx-form-schema

Repository files navigation

version ES6 Weight license Jest coverage Build


MobX Form Schema is a small library that can simplify web forms development process by providing a Form Schema concept. A form schema allows you to describe all the form logic besides user event handling. You can easily validate your form, observe its changes and simplify your communication with the backend!

You can find the MobX Form Schema documentation on the website.

Example

Just look at the short example of schema description

import { FormSchema, watch, validate } from '@yoskutik/mobx-form-schema';
import { required, minLength } from 'path/to/validators';

class FeedbackSchema extends FormSchema {
  @watch name = '';

  @validate(required(), email())
  @watch email = '';

  @validate(required(), minLength(20))
  @watch body = '';
}

This schema tells, that FeedbackSchema instance will contain 3 fields: name, email and body. The email field have 2 simple rules - it is required, and must contain only email format string. The body is required as well and must be at least 20 symbols.

Schema allow you to store and handle your data. If store your data inside the schema, you can check whether the form is valid or is changed.

import { runInAction } from 'mobx';
const schema1 = FeedbackSchema.create();

runInAction(() => schema.email = 'incorrect.email');
console.log(schema.isValid, schema.errors);
// false, {
//   email: 'Invalid email format',
//   body: 'The value is required',
// }

console.log(schema.isChanged);
// true

And this is only the beginning!


Simple validation!

You can apply several validation functions for each property in a schema. And each function can generate its own error message.

Inside a validation function you can use not only current value of the field, but also entire schema as well. It can be useful, if the validation of a property depends on another property's value. For example, "confirm password" value must be the same as "password", and "from" date must happen before the "to" date.

The validation can be applied conditionally. The fields can be optional, can be hidden for some reason, or there can be cases, when the validation of one field must be skipped, because of the value of another field. And you can easily achieve such validation conditions.

The really nice part is that, by default, all the validation is applied automatically using autorun function from MobX. If a property is changed, it will be recalculated. If another property from schema, that is used in validation is changed, it will be recalculated as well. And it works with conditions too.

Simple data changes observation!

With Form Schema you can understand whether the content of your form is changed. It can be useful, when you want to provide to user an ability to understand, is the form changed, like with disabling submit button unless the form is not changed.

It also works with predefined values. And that's extremely helpful, if there's an option to edit forms with predefined values in your project. And you can also reset your forms into the initial state!

You can get the initial value of a field at any time. And you get which of the properties are changed at the moment.

You can observe not only primitive values, but also sets, arrays, nested form schemas and arrays of nested form schemas. The real cool part is that the properties aren't considered changed if you pass a set, array or schema with the exact same content. And of course resetting works with these structures as well.

And if those out-of-box structures is not enough for you, you can also you can create your own rules to observe other structures.

Simple backend communication!

With MobX Form Schema you simplify data transformations. If your schema need a bit of different data from the one in server's response, or if there's

Data preprocessing

You can use a single schema to create in instance of form with predefined values from the backend. And also you can also add a transformation function for each property to transform predefined values. For example, a server cannot send you an instance of Set or Date, and if you need it, you can easily transform the data from response.

Data postprocessing

Such data handling works in both directions. If your schema has data, which must be processed before sending to a server, you can do it as well. Your schema has some utility properties or user only fields like "Confirm password" - you can cut them off. If you use Date, but the server receives string of yyyy/MM/dd format - apply the transformation.


Will it work with or without React?

MobX Form Schema does not depend on React in any way. The only one thing you need in order to use it is the MobX package.

Although, MobX Form Schema can be easily integrated into any React application. You can see examples of using this package in React application: