Кастомная валидация

SweetAlert — это популярная библиотека для создания красивых и информативных всплывающих окон в веб-приложениях. Одним из ключевых аспектов при работе с пользовательским интерфейсом является валидация данных. Для более гибкой и адаптируемой валидации в SweetAlert предусмотрены механизмы, позволяющие интегрировать кастомные проверки и сообщения об ошибках.

Обзор механизма кастомной валидации

SweetAlert предоставляет возможность встроенной валидации для простых форм. Однако, в некоторых случаях требуется более сложная валидация, специфичная для бизнеса или пользовательских требований. В таких ситуациях можно задействовать кастомные функции валидации, которые позволят подстроить проверки под любые нужды.

Для использования кастомной валидации в SweetAlert необходимо определить функцию, которая будет проверять данные, введенные пользователем. Если данные не соответствуют заданным условиям, функция возвращает ошибку, а SweetAlert отобразит сообщение с описанием проблемы. Важно, чтобы механизм валидации работал в реальном времени или по запросу, не блокируя основной поток выполнения.

Пример кастомной валидации

Для начала создадим простое всплывающее окно, которое будет содержать форму с текстовым полем. Мы применим кастомную валидацию для того, чтобы проверять, введено ли в поле значение, и соответствует ли оно определенным правилам.

Swal.fire({
  title: 'Введите ваш email',
  input: 'email',
  inputPlaceholder: 'Email',
  showCancelButton: true,
  confirmButtonText: 'Отправить',
  cancelButtonText: 'Отмена',
  inputValidator: (value) => {
    if (!value) {
      return 'Поле не может быть пустым!';
    }
    const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
    if (!emailRegex.test(value)) {
      return 'Пожалуйста, введите корректный email!';
    }
  }
});

В этом примере:

  • В окне появляется поле ввода для email.
  • Встроенная валидация проверяет, чтобы поле не было пустым и чтобы введенный текст соответствовал формату email.
  • Если введенное значение не соответствует правилам, появляется соответствующее сообщение об ошибке.

Ручной вызов валидации

Если необходимо выполнить валидацию данных в другом контексте (например, в процессе отправки формы или после выполнения каких-либо действий), можно вручную вызвать проверку данных и отобразить сообщение с ошибкой.

function validateForm() {
  const email = document.getElementById('emailInput').value;

  Swal.fire({
    title: 'Проверка данных',
    text: 'Пожалуйста, проверьте ваши данные перед отправкой',
    icon: 'warning',
    showCancelButton: true,
    confirmButtonText: 'Отправить',
    cancelButtonText: 'Отмена',
    preConfirm: () => {
      return new Promise((resolve, reject) => {
        if (!email || !email.includes('@')) {
          reject('Неверный email');
        }
        resolve();
      });
    },
  }).then((result) => {
    if (result.isConfirmed) {
      console.log('Форма отправлена');
    }
  }).catch((error) => {
    console.log(error); // Неверный email
  });
}

Здесь мы создаем функцию validateForm, которая проверяет введенный email на соответствие минимальным требованиям. В случае ошибки валидации пользователю будет выведено сообщение.

Асинхронная валидация

Кастомная валидация может включать асинхронные операции, такие как проверка данных на сервере. SweetAlert поддерживает асинхронные операции через промисы в методе inputValidator.

Пример асинхронной валидации email, проверяющей, зарегистрирован ли пользователь в системе:

Swal.fire({
  title: 'Проверка email',
  input: 'email',
  inputPlaceholder: 'Введите email',
  showCancelButton: true,
  confirmButtonText: 'Проверить',
  inputValidator: (value) => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        if (!value) {
          reject('Email не может быть пустым!');
        }
        fetch('/check-email', {
          method: 'POST',
          body: JSON.stringify({ email: value }),
          headers: { 'Content-Type': 'application/json' }
        })
          .then(response => response.json())
          .then(data => {
            if (!data.exists) {
              reject('Этот email не зарегистрирован!');
            } else {
              resolve();
            }
          })
          .catch(err => reject('Ошибка при проверке email'));
      }, 1000); // Имитируем задержку
    });
  }
});

В этом примере мы асинхронно отправляем запрос на сервер, чтобы проверить, зарегистрирован ли email пользователя. Если запрос успешен и email существует, валидация считается пройденной. В противном случае отображается ошибка.

Подключение кастомных сообщений и форматов

Чтобы улучшить восприятие ошибок и сделать валидацию более информативной, можно использовать более сложные сообщения, например, отображение текста с HTML-разметкой или использование пользовательских иконок.

Swal.fire({
  title: 'Ошибка!',
  html: '<strong>Неверный email</strong><br>Пожалуйста, укажите корректный формат email.',
  icon: 'error',
  confirmButtonText: 'Попробовать снова',
  timer: 3000 // Ошибка будет отображаться 3 секунды
});

Здесь используется HTML-разметка, что позволяет выделить ошибку жирным шрифтом и добавить дополнительную информацию.

Валидация с несколькими полями

Если необходимо проверять несколько полей формы, можно использовать подобный подход, добавляя валидацию для каждого поля. Важно помнить, что каждый элемент формы должен быть обработан в отдельности.

Swal.fire({
  title: 'Заполните все поля',
  html: `
    <input id="name" class="swal2-input" placeholder="Введите ваше имя">
    <input id="email" class="swal2-input" placeholder="Введите ваш email">
  `,
  showCancelButton: true,
  confirmButtonText: 'Отправить',
  cancelButtonText: 'Отмена',
  preConfirm: () => {
    const name = document.getElementById('name').value;
    const email = document.getElementById('email').value;
    
    if (!name) {
      return Promise.reject('Имя не может быть пустым!');
    }
    if (!email || !email.includes('@')) {
      return Promise.reject('Пожалуйста, введите корректный email!');
    }
    return Promise.resolve();
  }
}).then((result) => {
  if (result.isConfirmed) {
    console.log('Форма отправлена');
  }
}).catch((error) => {
  console.log(error); // Появится ошибка, если не все поля заполнены
});

В этом примере проверяются оба поля. Если одно из них не заполнено или не соответствует условиям, пользователь получит сообщение с ошибкой.

Заключение

SweetAlert предоставляет гибкие возможности для кастомной валидации данных. Использование промисов, асинхронных запросов и кастомных сообщений делает валидацию удобной и эффективной. Поддержка динамических окон и форм в сочетании с возможностью интеграции серверных проверок позволяет значительно повысить качество взаимодействия с пользователем, обеспечивая быструю обратную связь и улучшая пользовательский опыт.