Компонент 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();
}