Кастомное отображение дэшбордов в системе Luxms BI

В этой статье я хотел бы поделиться одной быстро сделанной разработкой, к сожалению, на реальном проекте эта функциональность не понадобилась, но допускаю что у нее может быть применение.

Контекст следующий, с некоторых пор, разработчик Luxms предоставляют возможность доделывать и менять некоторые модули их системы, делать кастомные отображения переопределением react компонентов. Создавать свои дэши, можно подключать внешние библиотеки и т.д.

На сегодняшнюю дату (лето 2024) их документация хоть и содержит необходимый минимум, тем не менее имеет много пробелов и приходится разбираться на ходу. Возможно существует более «правильный» способ реализации, тем не менее описанный ниже, тоже имеет право на жизнь.

Проект bi-magic-resources

Данный пример запущен при помощи bi-magic-resources(BMR). Если кратко, то данная технология позволяет подключаться к серверу разработки с локальными файлами react приложения. А после успешной разработки запушить изменения на сервер.

Этот блок хорошо задокументирован, рекомендую ознакомиться. Проблем с запуском возникнуть не должно.

Так же можно посетить статью об первой настройке BMR проекта.

Базовые понятия

Для демонстрации я буду запускать компонент на главной странице. Переопределяя компонент Root. Пару заметок об этом можно посмотреть в документации.

Перед началом обозначим понятия, которые используются в luxms.

  • Дэшлет — составная часть дэшборда, в одном дэшборде может быть много дэшлетов. Дэшлеты могут быть позиционированы в области дэшборда, как угодно. Задаются 4 координатами. x,y — точка начала координат (как на графике функций) h,w — высота и ширина соответственно. Дэшлет может иметь разные отображения, отображение задается параметром view class.
  • Дэшборд — пространство, содержащие в себе дэшлеты. Представляет собой сетку из квадратов, где каждый квадрат имеет свою координату x,y. Имеет динамические размеры.
  • Атлас — в ранних версиях атласов не было, но сейчас они представляют собой какой-то блок бизнес логики. Иначе говоря, атлас содержит в себе дэшборды.
  • Группа атласов — в контексте статьи эта сущность не понадобится, но группа атласов соответственно содержит в себе атласы. Группа атласов может и не существовать, в этом случаи атласы попадают в группу по умолчанию «без группы».

Разработка компонентов

Дэшлет

Начнем с компонента дэшлета.

В папке ds_res создадим свою папку …\bi-magic-resources\src\ds_res\dashboard-componets

В ней же создадим файл src\ds_res\dashboard-componets\DashletCustom.jsx

Для отображения дэшлета тут используется стандартный компонент VizelFromCfg (частично описан в документации). На вход подаются данные о схеме, классе отображения и настройках дэшлета. Все эти данные подгружаются из API (информация об этом будет в отдельном пункте)

Так же тут добавлена динамическая стилизация. Все дело в том, что позиционирование дэшлета в этом компоненте реализовано при помощи CSS селектора grid-template. Однако, есть различия. Если в luxms задаются точки начала, высота и ширина, то тут задаются точки начала и точки конца. Поэтому приходится по простым формулам преобразовывать одно в другое.

Дэшборд

Далее очередь дэшборда

Здесь список дэшлетов распаковывается в компонент DashletCustom. dashlets — это объект извлеченный из API. Единственное, стоит обратить внимание на имя класса wrapper блока div. Позже для этого класса будут описаны стили.

Компонент Root

Как было сказано ранее, переопределение этого компонента используется для демонстрации. В теории эти компоненты можно использовать для других дэшлетов. Что бы переопределить компонент главной страницы нужно создать следующий файл src\ds_res\Root.jsx

В данном примере имя схемы и заголовок захардкожены. Имя схемы можно посмотреть например в строке браузера или через API. На данной странице через хуки подгружаются данные из API и вызывается компонент DashboardCustom

Вызов API luxms

Есть как минимум 2 подхода вытащить данные из сервера Luxms.

  1. Воспользоваться сервисом, которые предоставляют разработчики(На данный момент не очень хорошо задокументирован)
  2. Сделать вызов API на прямую через Js библиотеку, например axios

В этом примере использовался второй подход.

В корневой папке ds_res создаем папку API, а в ней js файл src\ds_res\API\luxmsService.js

В данном классе описаны эндпоинты для доступа к данным дэшлетов, дашбордов, атласов и групп атласов.

В текущем примере в компоненте Root используется getDashlets

ответ от сервера при вызове этого метода выглядит примерно следующим образом (чисто для примера)

Добавление CSS стилей

Для того что бы кастомный дэшборд был похож на оригинальный, нужно задать ему стили. Для этой задачи, нам идеально подойдет grid-template. Ранее мы уже расставили координаты расположения дэшлетов в компоненте DashletCustom. Теперь нужно добавить оставшиеся стили.

Создаем папку со стилями src\ds_res\styles.

В ней создаем файл src\ds_res\styles\Root.css

Обратите внимание, что этот файл подключается в компоненте Root

Здесь нужно внимательно посмотреть на селекторы grid-template-columns и grid-template-rows. Именно они задают размер всего поля дэшлета и размер «одной точки» на поле. От этого размера будет зависеть масштаб отображения.

Итоговая структура проекта

В итоге структура проекта со всеми добавленными папками и компонентами должна выглядеть примерно следующим образом. (Пара не нужных файлов заблюрены)

Результаты

Для демонстрации добавлю пару скринов.

Оригинал, содержит один HTML дэшлет

Кастомное отображение

Далее попробуем сделать более сложное расположение блоков

Идем на нашу страницу, обновляем ее

В итоге получаем примерно такое же отображение как и в оригинале. Это работает так же с остальными классами отображения и с более сложными схемами. Например есть такое понятие как «управляющий дэшлет». Когда интерактивность в одном дэшлете влияет на отображение другого. Например в одном ставятся фильтры, в другом отображается таблица по этим фильтрам. Такая схема так же работает в кастомном отображении.

Что можно улучшить/доработать

Так как далее эта разработка не понадобилась, есть пару мыслей по улучшению. Можно подогнать размеры более точно. Добавить стилей для более органичного отображения. Можно было бы сделать динамическими размеры дэшборда, сейчас они фиксированные, по координатам есть возможность вычислить наибольшие отдаленные точки.

Так же есть возможность подгружать все дэшборды с проекта и открывать их по клику кнопки или иными способами, в прототипе использовались дополнительные компоненты для вкладок(tabs), но в статье они убраны что бы не загромождать демонстрацию. Подгружать данные об всех Атласах, Дэшбордах и т.д. можно методами класса luxmsService (был описан выше)

Область применения до конца не определенная, но например этим можно воспользоваться что бы отображать что-то в переопределённых компонентах пользовательского интерфейса сразу, без необходимости переходить во внутрь сущностей Атласа. В общем здесь имеется свобода в кастомизации, от чего Luxms выглядит привлекательно для разработки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *