Компонент SupersetDashboard

Компонент SupersetDashboard предназначен для встраивания в экраны приложения дэшбордов, настроенных в Apache Superset.

Использование

Компонент SupersetDashboard доступен в палитре Add Component дизайнера экранов Studio сразу после установки дополнения в ваш проект.

Для компонента необходимо настроить атрибуты, такие как id, height, width, и указать полученный из 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");
}

Атрибуты

chartControlsVisible

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

chart controls example

embeddedId

ID встроенного дэшборда. Вы можете получить этот ID из настроек дэшборда в Superset. См. пример настройки встроенного дэшборда в разделе Создание дэшборда руководства Начало работы.

Для встраивания дэшбордов не забудьте включить флаг EMBEDDED_SUPERSET в настройках Superset. См. Встраиваемые дэшборды.

ID встроенного дэшборда необходим для получения гостевого токена (guest token) и загрузки дэшборда. После изменения ID встроенного дэшборда компонент перезагружает дэшборд. Без embeddedId компонент будет отображать изображение-заглушку.

filtersExpanded

Устанавливает раскрытие панели фильтров.

titleVisible

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

title visible example

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

Дэшборд в 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();
}