Журнал

LogMonitorWidget показывает журнал работы: слева дерево источников, справа таблица сообщений выбранного источника и всего его поддерева. Сообщение хранится один раз и несёт идентификатор написавшего его источника, а число хранимых строк ограничено.

Журнал с деревом источников, фильтром уровней и таблицей сообщений

Создание и обновление

import {
  LogLevels,
  LogMonitorWidget,
  type TradingHost,
} from '@stocksharp/trading-controls';

declare const host: TradingHost;

const log = LogMonitorWidget.create(
  document.querySelector<HTMLElement>('#log')!,
  {},
  {
    host,
    maxMessages: 20_000,
  },
);

log.setSources([
  { id: 'connector', name: 'Connector' },
  { id: 'strategy-1', name: 'SMA', parentId: 'connector' },
]);

log.append([{
  id: 1,
  time: Date.now(),
  level: LogLevels.Warning,
  sourceId: 'strategy-1',
  message: 'Order rejected: not enough funds',
}]);

log.select('connector');

Из зависимостей обязателен только host: журнал пишут, а не действуют по нему, поэтому обработчиков контрол не требует. Остальные необязательны:

Зависимость Умолчание Назначение
maxMessages 5000 Сколько сообщений хранить. Лишние отбрасываются с начала списка.
chrome true Рисовать ли собственный заголовок с кнопкой закрытия. Хост, который сам подписывает панель и закрывает её (например, вкладкой дока), передаёт false.
sources true Показывать ли дерево источников при создании. Это только начальное состояние: дерево возвращается из контекстного меню таблицы или вызовом showSources.

setSources передаёт список источников целиком: исчезнувший источник пропадает из дерева, а выделение при этом сбрасывается на «все источники». append добавляет только что записанное, clear забывает все сообщения, оставляя дерево источников на месте.

Статическое свойство LogMonitorWidget.TYPE содержит идентификатор контрола logMonitor.

Источники и фильтры

Источник объявляет своего родителя (parentId), а не потомков, и может появиться раньше родителя. Дерево собирается из того, что уже пришло: источник с неизвестным родителем становится корнем, цикл разрывается по первому узлу. Строки дерева плоские, вложенность показана отступом; верхняя строка выбирает все источники сразу.

Одновременно действуют три фильтра: набор включённых уровней, строка поиска по тексту сообщения (без учёта регистра) и выбранное поддерево источников. Уровни переключаются кнопками панели инструментов — error, warning, info, debug, verbose из объекта LogLevels; в узкой колонке уровень показан буквой E, W, I, D, V. Метод visible возвращает то, что осталось после всех фильтров.

Таблица состоит из колонок источника, времени, уровня и сообщения, отсортирована по времени по возрастанию и поддерживает множественное выделение, сортировку, скрытие колонок, фильтры и контекстное меню. В меню добавлен пункт показа дерева источников. Кнопка панели инструментов выгружает видимые строки в XLSX; в выгрузку попадают время, отформатированное host.presentation.timeText, и полное имя уровня, а не буква.

Что делает хост

Контрол берёт у хоста переводы (host.t), формат времени (host.presentation.timeText) и обработку закрытия панели (host.close), а также регистрируется через host.register и снимается с регистрации в dispose. Собственных настроек в host.preferences он не хранит и состояние экземпляра не сохраняет: второй аргумент create принимается ради единообразия, но не читается. Сбор сообщений, их доставку и восстановление положения панели обеспечивает хост.

Публичные методы

  • setSources(sources) — заменить список источников.
  • append(messages) — добавить сообщения с учётом ограничения maxMessages.
  • clear() — очистить сообщения.
  • select(sourceId) — показать поддерево источника; null показывает все.
  • visible() — сообщения, оставшиеся после всех фильтров.
  • sourcesShown() — показано ли дерево источников.
  • showSources(on) — показать или скрыть дерево; выбранный фильтр по источнику при этом сохраняется.
  • dispose() — освободить ресурсы.

Смотрите также