Компонент 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");
}Атрибуты
id - alignSelf - chartControlsVisible - classNames - colspan - css - embeddedId - filtersExpanded - height - maxHeight - maxWidth - minHeight - minWidth - titleVisible - visible - width
embeddedId
ID встроенного дэшборда. Вы можете получить этот ID из настроек дэшборда в Superset. См. пример настройки встроенного дэшборда в разделе Создание дэшборда руководства Начало работы.
| Для встраивания дэшбордов не забудьте включить флаг EMBEDDED_SUPERSETв настройках Superset. См. Встраиваемые дэшборды. | 
ID встроенного дэшборда необходим для получения гостевого токена (guest token) и загрузки дэшборда. После изменения ID встроенного дэшборда компонент перезагружает дэшборд. Без embeddedId компонент будет отображать изображение-заглушку.
Ограничения наборов данных
Дэшборд в 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();
} 
