VGTable

Динамические таблицы

Выбор строк

Выбор строк кликом, пользовательскими checkbox и массовые действия.

Выбор строки

Клик по строке переключает её выделение. По умолчанию одновременно выбрана только одна строка.

Название Статус Обновлено
Публичный сайт Работает сегодня
Личный кабинет Проверка вчера
Служба поддержки Работает сегодня
Внутренний портал Обновление 2 дня назад
Архив документов Работает неделю назад

Множественный выбор строк

Каждый клик независимо переключает выбранное состояние строки. Параметр multiple разрешает сохранять несколько выбранных строк одновременно.

Название Статус Обновлено
Публичный сайт Работает сегодня
Личный кабинет Проверка вчера
Служба поддержки Работает сегодня
Внутренний портал Обновление 2 дня назад
Архив документов Работает неделю назад

Выбор пользовательскими checkbox

Checkbox остаются пользовательской разметкой, а проектный обработчик вызывает публичный метод VGTable и получает событие selectionchange.vg.table.

Выбор Название Статус Обновлено
Публичный сайт Работает сегодня
Личный кабинет Проверка вчера
Служба поддержки Работает сегодня
Внутренний портал Обновление 2 дня назад
Архив документов Работает неделю назад
HTML
<table
  class="vg-table vg-table-hovered"
  data-vg-table
  data-selection-enabled="true"
  data-selection-click="false"
  data-selection-multiple="true"
>
  <tbody>
    <tr data-row-key="project-1">
      <td><input type="checkbox" data-vg-table-row-checkbox></td>
      <td>Публичный сайт</td>
      <td>Работает</td>
    </tr>
  </tbody>
</table>
JavaScript
import {VGTable} from 'vgapp';

document.addEventListener('click', (event) => {
  const checkbox = event.target.closest('[data-vg-table-row-checkbox]');
  if (!checkbox) return;

  const table = checkbox.closest('[data-vg-table]');
  const row = checkbox.closest('tbody tr');
  const instance = VGTable.getInstance(table)
    || VGTable.getOrCreateInstance(table).init();

  instance.selectRow(row, checkbox.checked);
});

document.addEventListener('selectionchange.vg.table', (event) => {
  console.log(event.detail.rows, event.detail.keys);
});

Массовые действия в статичном VGToast

Выбор одной или всех строк открывает готовый toast из разметки страницы. Событие таблицы передаёт выбранные DOM-строки и их data-row-key как ID.

ID Название Статус Обновлено
101 Публичный сайт Работает сегодня
205 Личный кабинет Проверка вчера
318 Служба поддержки Работает сегодня
407 Внутренний портал Обновление 2 дня назад
512 Архив документов Работает неделю назад
HTML
<table
  class="vg-table vg-table-hovered"
  data-vg-table
  data-selection-enabled="true"
  data-selection-click="false"
  data-selection-multiple="true"
  data-selection-toast="#vg-table-selection-toast"
>
  <thead>
    <tr>
      <th><input type="checkbox" data-vg-table-select-all></th>
      <th>ID</th>
      <th>Название</th>
    </tr>
  </thead>
  <tbody>
    <tr data-row-key="101">
      <td><input type="checkbox" data-vg-table-row-checkbox></td>
      <td>101</td>
      <td>Публичный сайт</td>
    </tr>
  </tbody>
</table>

<div id="vg-table-selection-toast" class="vg-toast" role="status" aria-live="polite">
  <div class="vg-toast-wrapper">
    <div class="vg-toast-content">
      <div class="vg-toast-header">
        Выбрано строк: <span data-vg-table-selection-count>0</span>
      </div>
      <div class="vg-toast-body">
        Передано: <span data-vg-table-selection-id-count>0</span> ID ·
        <span data-vg-table-selection-row-count>0</span>
        <span data-vg-table-selection-row-label>строк</span>
      </div>
    </div>
    <button class="btn btn-error btn-sm" type="button">Удалить</button>
  </div>
</div>
JavaScript
import {VGTable, VGToast} from 'vgapp';

const getRowsLabel = (count) => {
  const mod100 = count % 100;
  const mod10 = count % 10;
  if (mod100 >= 11 && mod100 <= 14) return 'строк';
  if (mod10 === 1) return 'строка';
  if (mod10 >= 2 && mod10 <= 4) return 'строки';
  return 'строк';
};

document.addEventListener('selectionchange.vg.table', (event) => {
  const {rows, keys} = event.detail;
  const toastElement = document.querySelector('#vg-table-selection-toast');

  toastElement.querySelector('[data-vg-table-selection-count]').textContent = rows.length;
  toastElement.querySelector('[data-vg-table-selection-id-count]').textContent = keys.length;
  toastElement.querySelector('[data-vg-table-selection-row-count]').textContent = rows.length;
  toastElement.querySelector('[data-vg-table-selection-row-label]').textContent = getRowsLabel(rows.length);

  const toast = VGToast.getOrCreateInstance(toastElement, {
    static: true,
    autohide: false,
    enableClickToast: false,
  });

  if (!rows.length) toast.hide();
  if (rows.length && !toastElement.classList.contains('shown')) toast.show();
});

// Для «выбрать все» вызовите selectRow() для каждой строки таблицы.
const table = document.querySelector('[data-vg-table]');
const instance = VGTable.getInstance(table);
Выбрано строк: 0
Передано: 0 ID · 0 строк
IDs: