Appearance
Рендереры ячеек
Вид ячейки задаётся рендерером. В preset и snapshot хранится только rendererId — короткая строка из фиксированного набора. Сам компонент, метка и порядок живут в определении рендерера внутри LibUI. Это позволяет рендерить произвольное содержимое для ячеек на портале. Общий вид таблицы одинаков для билдера и портала, а содержимое ячеек и логику отображения задаёт рендерер.
Виды рендереров
Набор rendererId зафиксирован в LibUI. Каждый описан на отдельной подстранице:
Виджет
Полная карточка объекта: иконка + название + значение. Единственный рендерер с расширенным контрактом context.services — через него виджет подключается к WebSocket, кэшу состояний и commandService. На этой же странице описан оркестратор: как поднять живые данные для ячеек.
Иконка
Только иконка объекта. Источник: display.icon, fallback — иконка по типу объекта.
Уставка
Компактный бейдж «Уставка». Маркер ячейки, не показывает данные объекта.
Значение
Компактный бейдж «Значение». Маркер ячейки, как setpoint, но для другого назначения.
Реестр рендереров
Фабрика реестра рендереров ячеек. Принимает определения рендереров и возвращает объект с методами поиска, создания и нормализации видов ячеек.
Набор rendererId зафиксирован в LibUI и одинаков для builder и портала. Host-приложение переопределяет реализацию и подпись известных вариантов через override, id при этом не меняются. Поэтому сохранённое представление открывается одинаково в обоих приложениях. При создании реестр проверяет полный набор: каждый известный id должен быть определён, дубли запрещены.
Контракт рендерера
ts
export interface TableViewCellView {
/** Идентификатор рендерера, который рисует содержимое ячейки. */
rendererId: TableViewCellRendererId;
}
export interface TableViewCellRendererProps<
TContext = unknown,
TObject extends TableViewSourceObject = TableViewSourceObject,
> {
/** Объект портала, попавший в ячейку по пересечению осей, или `null` для пустой ячейки. */
object: TObject | null;
/** Элемент оси строк, на пересечении которого находится ячейка. */
row: TableViewAxisItem;
/** Элемент оси столбцов, на пересечении которого находится ячейка. */
column: TableViewAxisItem;
/** Зафиксированная ячейка snapshot или `null` в режиме live preset, когда ячейка ещё не сгенерирована. */
cell: TableViewCell | null;
/** Настройки вида ячейки — какой рендерер использовать для отрисовки. */
view: TableViewCellView;
/**
* Опциональный внешний контекст приложения, прокидываемый в компонент рендерера.
* libui не диктует форму контекста — host-приложение решает, что туда положить.
* Один и тот же объект шарится между всеми ячейками таблицы.
*
* Пример паттерна для живых виджетов (состояния/тревоги/команды через
* оркестратор): см. {@link_doc menu-folder-table-views-renderers-widget|Виджет}.
*/
context?: TContext;
/** Режим только для чтения: рендерер скрывает элементы управления и блокирует правки. */
readonly: boolean;
/** Текст-заглушка, который рендерер показывает, когда `object` равен `null`. */
emptyLabel: string;
}
export interface TableViewCellRendererDefinition<
TId extends TableViewCellRendererId = TableViewCellRendererId,
> {
/** Уникальный идентификатор рендерера из набора `TABLE_VIEW_CELL_RENDERER_IDS`. */
id: TId;
/** Человекочитаемое название рендерера для UI выбора вида ячейки. */
label: string;
/** Вес сортировки рендерера в списке выбора (меньше — выше). */
order: number;
/** Vue-компонент, реализующий отрисовку содержимого ячейки. */
component: Component;
/** Функция, возвращающая краткое текстовое описание рендерера для документации. */
getSummary: () => string;
}
/**
* Частичное переопределение встроенного рендерера: позволяет заменить компонент
* и/или подпись, не трогая остальные поля определения.
*/
export type TableViewCellRendererOverride = Partial<
Pick<TableViewCellRendererDefinition, "component" | "label">
>;
export interface TableViewCellRendererRegistry {
/** Возвращает все зарегистрированные определения рендереров. */
list: () => TableViewCellRendererDefinition[];
/** Возвращает рендерер по id или `undefined`, если id неизвестен. */
get: (id: TableViewCellRendererId) => TableViewCellRendererDefinition | undefined;
/** Возвращает рендерер по id или бросает ошибку, если id неизвестен. */
require: (id: TableViewCellRendererId) => TableViewCellRendererDefinition;
/** Создаёт объект `TableViewCellView` для заданного рендерера. */
createView: (id: TableViewCellRendererId) => TableViewCellView;
/** Приводит сохранённый вид (в т.ч. из недоверенного persist) к актуальному рендереру. */
normalizeView: (view: unknown) => TableViewCellView;
/** Возвращает новый реестр с подменёнными компонентами и/или подписями указанных рендереров. */
override: (
overrides: Partial<Record<TableViewCellRendererId, TableViewCellRendererOverride>>,
) => TableViewCellRendererRegistry;
}