supersetDashboard

Для работы компонента требуется дополнение Superset.

supersetDashboard встраивает в экраны приложения дэшборды, настроенные в Apache Superset.

XML-элемент

dashboard

Java-класс

SupersetDashboard

Основы

Объявите пространство имен superset в XML-дескрипторе экрана:

<view xmlns="http://jmix.io/schema/flowui/view"
      xmlns:superset="http://jmix.io/schema/superset/ui"
      title="msg://dashboardView.title">

Studio автоматически добавляет пространство имен, когда вы добавляете компонент с помощью действия Add Component на верхней панели действий. См. Палитра компонентов.

Добавьте supersetDashboard в экран и укажите его id, размеры и полученный из Apache Superset идентификатор embeddedId:

<superset:dashboard id="dashboard" width="100%" height="100%"
                    embeddedId="b6f53731-1da2-4768-b545-fff4fd2659c6"/>

Компонент также можно инжектировать в контроллер и использовать программно:

@ViewComponent
private SupersetDashboard dashboard;

@Subscribe
public void onInit(final InitEvent event) {
    dashboard.setEmbeddedId("1aec5c74-f143-4051-818b-fcf9d77c8501");
}

Ограничения наборов данных

Дэшборд в Superset может содержать несколько диаграмм, отображающих данные из различных наборов данных. Компонент SupersetDashboard обеспечивает возможность задавать ограничения для этих наборов данных. Ограничения могут быть определены статически в элементе XML компонента или вычислены динамически при работе приложения.

Для предоставления ограничения вам нужно указать ID набора данных и написать условие на native SQL, которое будет добавлено в выражение WHERE запроса набора данных.

В интерфейсе Superset не очевидно, где найти ID набора данных. Вы можете получить его из параметра datasource_id в URL, отображаемом в адресной строке при открытии набора данных из списка наборов данных.

Статичные ограничения

Рассмотрим использование статичных ограничений набора данных в дэшборде Employees' salaries, созданном в разделе Начало работы. Он использует набор данных, загружающий сотрудников, отделы и зарплаты. Предположим, что нужно ограничить нижнюю границу зарплаты, например, до 80 000.

Ограничения определяются в элементах datasetConstraint вложенных в элемент dashboard компонента. Они могут быть добавлены с помощью действия Add в Студии или вручную в XML.

Требуемое определение ограничения будет выглядеть следующим образом:

<superset:dashboard id="dashboard"
                    width="100%"
                    height="100%"
                    embeddedId="940f36ff-6c97-4a35-a4ff-4e4aeee3a9c7">
    <superset:datasetConstraints>
        <superset:datasetConstraint datasetId="24">
            <![CDATA[salary >= 80000]]>
        </superset:datasetConstraint>
    </superset:datasetConstraints>
</superset:dashboard>

Здесь salary — столбец набора данных.

Провайдер ограничений

Ограничения набора данных могут быть рассчитаны динамически в работающем приложении и переданы в Superset при открытии дэшборда в приложении Jmix. Это позволяет фильтровать данные дэшборда в зависимости от прав доступа текущего пользователя или любых других критериев.

Ограничение набора данных определяется классом DatasetConstraint. Вы можете предоставить список ограничений компоненту SupersetDashboard следующими способами:

  • Создать обработчик datasetConstraintsProvider в экране и вернуть список ограничений из него.

  • Создать Spring-бин, реализующий интерфейс DatasetConstraintsProvider, и передать его компоненту с помощью метода setDatasetConstraintsProvider().

Рассмотрим следующее требование: менеджер отдела может видеть информацию о зарплатах только в своем отделе. Ограничение набора данных может учитывать роль уровня строк, назначенную текущему пользователю.

В примере ниже используется первый подход с обработчиком datasetConstraintsProvider в экране, но логика вынесена в обычный Spring-бин:

package com.company.supersetsample.app;

import com.company.supersetsample.entity.Department;
import com.company.supersetsample.entity.User;
import com.company.supersetsample.security.DepartmentConstraintRole;
import io.jmix.core.security.CurrentAuthentication;
import io.jmix.security.SecurityProperties;
import io.jmix.supersetflowui.component.dataconstraint.DatasetConstraint;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class DepartmentDatasetConstraintProvider {

    private final CurrentAuthentication currentAuthentication;
    private final SecurityProperties securityProperties;

    public DepartmentDatasetConstraintProvider(CurrentAuthentication currentAuthentication,
                                               SecurityProperties securityProperties) {
        this.currentAuthentication = currentAuthentication;
        this.securityProperties = securityProperties;
    }

    public List<DatasetConstraint> getConstraints() {
        Department department = getDepartment();
        if (hasDepartmentConstraintRole() && department != null) {
            return List.of(new DatasetConstraint(24, "department_name = '" + department.getName() + "'"));
        }
        return List.of();
    }

    private boolean hasDepartmentConstraintRole() {
        Authentication authentication = currentAuthentication.getAuthentication();
        return authentication.getAuthorities().stream()
                .anyMatch(grantedAuthority ->
                        grantedAuthority.getAuthority().equals(
                                securityProperties.getDefaultRowLevelRolePrefix() + DepartmentConstraintRole.CODE));
    }

    private Department getDepartment() {
        User user = (User) currentAuthentication.getUser();
        return user.getDepartment();
    }
}

Бин используется в обработчике datasetConstraintsProvider экрана, который может быть сгенерирован из панели инспектора Jmix:

@Autowired
private DepartmentDatasetConstraintProvider departmentDatasetConstraintProvider;

@Install(to = "dashboard", subject = "datasetConstraintsProvider")
private List<DatasetConstraint> dashboardDatasetConstraintsProvider() {
    return departmentDatasetConstraintProvider.getConstraints();
}

Атрибуты

Следующие атрибуты относятся к dashboard:

Название Описание Значение по умолчанию

chartControlsVisible

Определяет видимость элементов управления диаграммами.

chart controls example

false

embeddedId

Задает идентификатор встроенного дэшборда из Superset. См. Создание дэшборда.

Идентификатор необходим для получения гостевого токена и загрузки дэшборда. При изменении идентификатора компонент перезагружает дэшборд; если идентификатор не задан, компонент отображает изображение-заглушку.

Включите флаг EMBEDDED_SUPERSET, как описано в разделе Встраиваемые дэшборды.

filtersExpanded

Определяет, развернута ли панель фильтров.

false

titleVisible

Определяет видимость панели заголовка.

title visible example

false

Компонент поддерживает следующие общие атрибуты:

Обработчики

Следующий обработчик относится к dashboard:

Чтобы сгенерировать заглушку обработчика в Jmix Studio, используйте вкладку Handlers панели инспектора Jmix UI, или команду Generate Handler, доступную на верхней панели контроллера экрана и через меню CodeGenerate (Alt+Insert / Cmd+N).

Название Описание

datasetConstraintsProvider

Динамически предоставляет ограничения наборов данных, когда дэшборд запрашивает гостевой токен. См. Провайдер ограничений.

Компонент поддерживает следующие общие обработчики:

Элементы

dashboard может содержать элемент datasetConstraints с любым количеством элементов datasetConstraint. Для каждого datasetConstraint требуется атрибут datasetId, а его текстовое содержимое задает SQL-условие. См. Статичные ограничения.