VGAlert

Подтверждения и сообщения: modal, dropdown, overlay, Data API и AJAX.

Data API и AJAX

Декларативный запуск, безопасный GET и журнал событий.

Под каждым примером — его HTML, JavaScript и CSS. Подключите JS из vgapp и SCSS из vgapp/scss (или готовый CSS пакета). Кнопки и раскладка используют OKAUX 1.0.2; тема сайта управляется OKAUX.

Data API и DOM-события

boot подключает делегирование один раз. Динамически добавленные кнопки также работают. Результат приходит на исходный элемент и всплывает до document.

Ожидает события.

HTML
<button type="button" class="btn btn-primary btn-sm" id="alert-data-trigger"
  data-vg-toggle="alert" data-size="compact"
  data-message-title="Подтвердить выбор?"
  data-message-description="Data API читает параметры с этой кнопки."
  data-buttons-agree-class='["btn-primary", "btn-sm"]'
  data-buttons-cancel-class='["btn-surface", "btn-sm"]'>Запустить Data API</button>
<p id="alert-data-result" role="status" class="mt-3 mb-0">Ожидает события.</p>
JavaScript
/**
 * Описание: рабочий пример VGAlert для копирования и демо.
 * Возможности: запуск публичного API и отображение результата без изменения данных.
 */
import { VGAlert } from 'vgapp';

function initAlertDemo() {
  // Дополнительная инициализация не требуется: используется Data API.
  // VGAlert.boot() нужен один раз, если приложение не запускает модули автоматически.
  VGAlert.boot();
  const button = document.querySelector('#alert-data-trigger');
  if (!button) return;
  const result = document.querySelector('#alert-data-result');
  for (const name of ['accept', 'reject', 'finally']) {
    button.addEventListener('vg.alert.' + name, () => {
      result.textContent += ' → vg.alert.' + name;
    });
  }
  button.addEventListener('click', () => { result.textContent = 'Ожидает решения'; });
}

initAlertDemo();
CSS
/* Дополнительные стили не требуются. */

Запрос после подтверждения

VGAlert.confirm запускает безопасный GET /api/alert/demo?mode=success|empty|error. Отмена не отправляет запрос. Повторные вызовы разрешены; пустой ответ очищает target.

Здесь появится ответ сервера.
Запрос ещё не отправлялся.
HTML
<div id="alert-ajax-controls" class="d-flex flex-wrap gap-2">
  <button type="button" class="btn btn-primary btn-sm" data-alert-response="success">Успешный ответ</button>
  <button type="button" class="btn btn-surface btn-sm" data-alert-response="empty">Пустой ответ</button>
  <button type="button" class="btn btn-error btn-sm" data-alert-response="error">Ошибка 503</button>
</div>
<div id="alert-ajax-output" class="border rounded p-3 mt-3" aria-live="polite">Здесь появится ответ сервера.</div>
<pre id="alert-ajax-log" class="mt-3 mb-0" role="status">Запрос ещё не отправлялся.</pre>
JavaScript
/**
 * Описание: рабочий пример VGAlert для копирования и демо.
 * Возможности: запуск публичного API и отображение результата без изменения данных.
 */
import { VGAlert } from 'vgapp';

function initAlertDemo() {
  const controls = document.querySelector('#alert-ajax-controls');
  if (!controls) return;
  const log = document.querySelector('#alert-ajax-log');
  controls.querySelectorAll('button').forEach(button => {
    for (const name of ['loaded', 'accept', 'reject', 'finally']) {
      button.addEventListener('vg.alert.' + name, event => {
        const status = event.stats ?? event.vgalert?.status ?? '';
        log.textContent += '\nvg.alert.' + name + (status ? ': ' + status : '');
      });
    }
    button.addEventListener('click', () => {
      log.textContent = 'Ожидает подтверждения. GET отправится только после согласия.';
      VGAlert.confirm(button, {
        size: 'compact',
        message: { title: 'Выполнить тестовый GET?', description: 'Endpoint не изменяет данные.' },
        buttons: {"agree":{"text":"Продолжить","class":["btn-primary","btn-sm"]},"cancel":{"text":"Отмена","class":["btn-surface","btn-sm"]}},
        ajax: {
          route: '/api/alert/demo?mode=' + button.dataset.alertResponse,
          method: 'get', target: '#alert-ajax-output',
          loader: true, output: true, once: false,
        },
      });
    });
  });
}

initAlertDemo();
CSS
#alert-ajax-log { white-space: pre-wrap; overflow-wrap: anywhere; }

Текущий AJAX-контракт: HTTP-ошибка передаётся как status: error через vg.alert.loaded, затем vg.alert.accept. Поэтому проверяйте event.stats или event.vgalert.status, а не только имя accept. vg.alert.reject сообщает об отмене или отклонении цепочки. Пример выводит фактическую последовательность событий.