Admin Renderer

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

Обзор

Импортируйте и создайте экземпляр Admin Renderer:

import { SeatmapAdminRenderer } from '@seatmap.pro/renderer';

const renderer = new SeatmapAdminRenderer(document.getElementById('renderer-container'), {
  publicKey: 'your-public-key',
});
renderer.loadEvent('your-event-id');

Активация режима selectSections

Admin Renderer поддерживает четыре режима взаимодействия: 'pan', 'select', 'selectRows' и 'selectSections'. Чтобы активировать режим выбора секций:

renderer.setMode('selectSections');

Остальные три режима ('pan', 'select', 'selectRows') этим изменением не затрагиваются и задаются тем же способом.

Взаимодействие в режиме selectSections

  • Клик — переключает состояние выбора секции, по которой кликнули (выбрана / снята).
  • Перетаскивание — рисует прямоугольник по холсту и выбирает все секции, которые он пересекает.

Admin renderer с несколькими выбранными секциями

Прямоугольник выделения, рисуемый поверх секций

Клавиши-модификаторы для выделения рамкой

При рисовании прямоугольника выделения следующие клавиши-модификаторы меняют способ применения выбора:

Modifier Поведение
None REPLACE — заменяет текущий выбор секциями внутри прямоугольника.
Shift или Cmd / Meta ADD — добавляет пересекаемые секции к текущему выбору.
Alt / Option SUBTRACT — удаляет пересекаемые секции из текущего выбора.

Колбэк onSectionsSelectionChange

Используйте колбэк onSectionsSelectionChange, чтобы получать итоговый выбор после каждого взаимодействия пользователя:

const renderer = new SeatmapAdminRenderer(document.getElementById('renderer-container'), {
  publicKey: 'your-public-key',
  onSectionsSelectionChange: (sections) => {
    sections.forEach((section) => {
      console.log(section.id, section.name, section.seatCount);
    });
  },
});
renderer.loadEvent('your-event-id');

Каждый элемент массива sections — это объект ISection. Основные поля для этого сценария:

  • id — уникальный идентификатор секции.
  • name — отображаемое имя секции.
  • seatCount — количество мест в секции.

ISection содержит дополнительные поля; трёх перечисленных выше достаточно для большинства админ-сценариев.

onSectionsSelectionChange срабатывает один раз после того, как весь выбор финализирован — по одному разу на клик и по одному разу на завершённое перетаскивание. В отличие от него, onSectionClick срабатывает по одному разу для каждой затронутой секции: один раз при переключении одиночным кликом и по разу на каждую пересекаемую секцию при перетаскивании. Тем, кто полагается на onSectionClick в режиме selectSections, следует учитывать, что он срабатывает несколько раз за одно перетаскивание.

seatCount в ISection

seatCount доступно в ISection как в колбэке onSectionsSelectionChange, так и в onSectionClick.

Плоский вид секции

Плоский вид разворачивает одну секцию на её сетку мест — так же, как её показывает редактор схем. Остальная часть площадки затемняется подложкой, а подписи рядов и мест рисуются поверх развёрнутой сетки.

const flattened = await renderer.setFlatSectionView(sectionId);

await renderer.setFlatSectionView(null);

setFlatSectionView возвращает:

  • true, когда вид развёрнут для этой секции или когда для выхода передан null.
  • false, когда секцию развернуть нельзя — входная зона, столы, неизвестный id или секция без сетки.

Запрос уже развёрнутой секции возвращает true и ничего не делает, поэтому вызов никогда не выключает вид. Выход всегда возвращает true, независимо от того, было ли что-то развёрнуто.

Чтобы получать уведомления о каждом входе и выходе, включая те, которые рендерер инициирует сам при уничтожении или перезагрузке схемы, передайте onFlatSectionViewChange:

const renderer = new SeatmapAdminRenderer(document.getElementById('renderer-container'), {
  publicKey: 'your-public-key',
  onFlatSectionViewChange: (sectionId) => {
    console.log(sectionId === null ? 'вид площадки' : `развёрнута: ${sectionId}`);
  },
});

Колбэк нужно передать в момент создания рендерера. Присваивание после этого не действует, потому что рендерер хранит копию того объекта настроек, с которым был создан.

Выделение блока мест

selectSeatBlock выделяет прямоугольный блок мест между опорным и конечным местом по координатам сетки. Метод работает по собственной сетке рядов и мест секции, а не по экранной геометрии, поэтому блок следует за раскладкой мест даже в изогнутой или повёрнутой секции.

import { RendererSelectMode } from '@seatmap.pro/renderer';

await renderer.selectSeatBlock(anchorSeatId, focusSeatId);

await renderer.selectSeatBlock(anchorSeatId, focusSeatId, RendererSelectMode.ADD);

Третий аргумент — алгебра выделения, по умолчанию RendererSelectMode.REPLACE. ADD и SUBTRACT комбинируют блок с текущим выделением.

Промис возвращает false, если одно из мест неизвестно, места принадлежат разным секциям или для секции недоступны координаты сетки; в остальных случаях — true.

Горячие клавиши

Admin Renderer обрабатывает клавиатурный ввод, пока указатель находится над холстом. Нажатия в input, textarea, select и любом редактируемом элементе игнорируются.

Действие Комбинация по умолчанию Тип
pan Space удержание
clearSelection Escape нажатие
selectAll Mod+A нажатие
zoomIn Mod+= нажатие
zoomOut Mod+- нажатие
zoomToFit Mod+0 нажатие
flatSection F удержание

Mod — это Cmd в macOS и Ctrl в остальных системах. Комбинация с удержанием активна только пока клавиша зажата: Space временно включает панорамирование и возвращает предыдущий режим при отпускании, а F разворачивает секцию под указателем на время удержания.

Свои комбинации

Передайте карту hotkeys, чтобы переназначить или отключить отдельные действия. Ключи — идентификаторы действий из таблицы выше; значение заменяет комбинацию по умолчанию, а null отключает действие.

const renderer = new SeatmapAdminRenderer(document.getElementById('renderer-container'), {
  publicKey: 'your-public-key',
  hotkeys: {
    selectAll: 'Mod+E',
    flatSection: null,
  },
});

Значение hotkeys: false полностью отключает обработку клавиатуры — это удобно, когда клавиатурой управляет окружающий админ-интерфейс.

Комбинация записывается как необязательный префикс Mod+ и одна клавиша: буква, цифра, =, - или код клавиши вроде Space или Escape. Типы HotkeysSetting и AdminHotkeyAction экспортируются из пакета.