Виджеты, сетка и фильтры
Сама страница /dashboards — самодостаточная HTML+JS-страница в стиле остальных страниц админ-панели (embeddings/import): без внешнего JS-фреймворка и без библиотеки графиков, в рамках нулевой-зависимости движка.
Типы виджетов
Пять типов: line, bar, pie, table, kpi. Позиция и размер виджета в сетке (X/Y/W/H) заданы в ячейках, а не в пикселях — размер самой ячейки определяет фронтенд. Config виджета описывает, как результат запроса отображается: label_field/value_field/series_field.
У каждого виджета ровно один источник запроса — чарт (см. «Датасеты и чарты»), No-Code спецификация, либо сырой SQL-текст.
Глобальные фильтры
Дашборд может определить набор глобальных фильтров-селекторов, показанных сверху: тип date_range, select или text, привязанный к колонке таблица.колонка. Проверка колонки происходит для каждого виджета отдельно во время рендера, а не при создании фильтра — у разных виджетов одного дашборда могут быть разные таблицы, и фильтр просто не сработает там, где подходящей колонки нет (не тихий баг, а ожидаемое поведение для мультивиджетного дашборда). Как отмечено на странице «No-Code конструктор запросов», фильтры домонтируются только к виджетам на структурированном источнике (чарт или No-Code спецификация) — к виджетам на сыром SQL они не применяются.
Хранение
Дашборды и виджеты хранятся в data/dashboards.json — один JSON-файл, atomic rename-through-tmp запись, in-memory карты под RWMutex — тот же паттерн, что у публичных ссылок и RBAC-пользователей. Удаление дашборда каскадно удаляет его виджеты.