npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

mobx-form-control-kit

v0.10.0

Published

mobx typescript form control validation

Downloads

30

Readme

mobx-form-control-kit

Описание

Данный пакет содержит набор объектов для реализации форм с асинхронной валидацией основанный на Mobx 6 версии. Совместим с React и Vue.

Базовый пример

Создается одно поле формы. Указывается, что значение обязательно для заполнения.

Данный пример хоть и является базовым, не рекомендуется как основной сценарий работы, хоть и является допустимым.

const App = observer(() => {
  const [firstName] = React.useState(
    () =>
      new FormControl<string>("VA", {
        validators: [requiredValidator()],
      })
  );

  return (
    <div>
      <p>{firstName.value}</p>
      <input
        value={firstName.value}
        onChange={(event) => (firstName.value = event.target.value)}
        onFocus={() => (firstName.focused = true)}
        onBlur={() => (firstName.focused = false)}
      />
      {firstName.touched &&
        firstName.errors.map((err) => (
          <p key={err.key} style={{ color: "red" }}>
            {err.message}
          </p>
        ))}
      <button
        onClick={async () => {
          await firstName.wait();
          if (firstName.invalid) {
            firstName.touched = true;
            return;
          }
          // Отправка данных
        }}
      >
        Отправить
      </button>
    </div>
  );
});

Типы контролов

Контролы разделены на два вида:

  • FormControl - используется для хранения одного значения. Рекомендуется использовать примитивные типы, такие как: string, number, date, boolean и т.д. И избегать объектов. Хранение объектов допустимо, но нарушает концепцию формы.
  • FormGroup - используется для объединения FormControl и FormGroup в группы.

Оба типа являются наследниками абстрактного класса AbstractControl. AbstractControl реализует интерфейс IAbstractControl, что позволяет гибко настроить структуру данных и передачу объектов данных типов.

Чтобы узнать к какому типу принадлежит объект IAbstractControl, можно воспользоваться полем type содержащие значение из enum.

enum ControlTypes {
  Control,
  Group,
}

Рекомендуемая организация кода выглядит следующим образом:

interface IFormPerson extends ControlsCollection {
  firstName: FormControl<string>;
  lastName: FormControl<string>;
  middleName: FormControl<string>;
  age: FormControl<number | undefined>;
}

interface IFormPassport extends ControlsCollection {
  number: FormControl<number | undefined>;
  serias: FormControl<number | undefined>;
  issuedИy: FormControl<string>;
}

interface IFormDriverLicense extends ControlsCollection {
  number: FormControl<number | undefined>;
  serias: FormControl<number | undefined>;
  toDate: FormControl<Date | undefined>;
}

enum DocumentType {
  Passport,
  DriverLicense,
}

interface IFormDocument extends ControlsCollection {
  type: FormControl<DocumentType | undefined>;
  passport: FormGroup<IFormPassport>;
  driverLicense: FormGroup<IFormDriverLicense>;
}

interface IFormChild extends ControlsCollection {
  name: FormControl<string>;
  age: FormControl<number | undefined>;
}

interface IForm extends ControlsCollection {
  person: FormGroup<IFormPerson>;
  document: FormGroup<IFormDocument>;
  children: FormGroup<IFormChild>[];
}

class Questionnaire {
  public form: FormGroup<IForm>;

  constructor() {
    this.form = new FormGroup<IForm>({
      person: new FormGroup<IFormPerson>({
        firstName: new FormControl<string>(""),
        lastName: new FormControl<string>(""),
        middleName: new FormControl<string>(""),
        age: new FormControl<number | undefined>(undefined),
      }),
      document: new FormGroup<IFormDocument>({
        type: new FormControl<DocumentType | undefined>(undefined),
        passport: new FormGroup<IFormPassport>({
          number: new FormControl<number | undefined>(undefined),
          serias: new FormControl<number | undefined>(undefined),
          issuedИy: new FormControl<string>(""),
        }),
        driverLicense: new FormGroup<IFormDriverLicense>({
          number: new FormControl<number | undefined>(undefined),
          serias: new FormControl<number | undefined>(undefined),
          toDate: new FormControl<Date | undefined>(undefined),
        }),
      }),
      children: [],
    });
  }
}

В вышеописанном примере создается форма для заполнения карточки человека с указанием его ФИО, возраста, типа документа. А также можно указать детей. В данном форме отсутствуют валидации, но она уже готова для заполнения и использования в коде.

Валидации

--- В процессе описания ---

Поля и методы

Общие поля и методы для групп и отдельного поля.

| Поля / Методы | Описани | Description | |---------------|---------|-------------| | valid | Форма (поле) валидное | Form (field) is valid | | invalid | Форма (поле) невалидное | Form (field) is invalid | | dirty | Значение изменялось | Value changed | | pristine | Значение не изменялось (обратное значение dirty) | Value has not changed (reverse dirty) | | focused | Форма (поле) сейчас в фокусе | Form (field) is now in focus | | element | Ссылка на визуальный элемент | Ref html element | | touched | Форма (поле) было в фокусе | Form (field) was in focus | | untouched | Форма (поле) не было в фокусе (обратное значение touched) | Form (field) was out of focus (reverse touched) | | validators | Методы валидации | Validator-functions | | events | Все события валидации (результат выполениения методов валидации) | All valudation events (result of validator-functions) | | event(key: string) | Получить ошибку по ключу | Get error by key | | tempErrors | Дополнительтные (серверные) ошибки | Additional (server) errors | | hasErrors | Группа (поле) содержит ошибки | Form (field) contains errors | | errors | Список ошибок | Errors list | | hasWarnings | Присутствуют сообщения с типом "Внимание" | The field contains warnings messages | | warnings | Список сообщений с типом "Внимание" | Warnings messages list | | hasInformations | Присутствуют сообщения с типом "Информационные сообщения" | The field contains informations messages | | informations | Сообщения с типом "Информационные сообщения" | Informations messages list | | hasSuccesses | Присутствуют сообщения с типом "успешная валидация" | The field contains successes | | successes | Сообщения с типом "успешная валидация" | Successes messages list | | maxEventLevel | Максимальный уровень сообщения | Max message level | | processing | Форма в процессе валидации | Form in validation progressing | | getActivate | Функция включение валидаций по условию (по умолчанию включено всегда) | Function enable validation by condition (always enabled by default) | | active | Проверка ошибок включена (результат работы метода getActivate) | Error checking enabled (result of getActivate) | | disabled | Проверка ошибок отключена (обратное значение active) | Error checking is disabled (reverse active) | | additionalData | Поле для передачи дополнительной информации (в логике не участвует) | Field for transferring additional information | | type | Тип контрола (группа/поле) | Control type (group/control) | | dispose() | Вызвать при удалении контрола | Dispose (call in unmount control) | | wait() | Ожидание окончания проверки | Waiting for end of validation |