Загрузка страницы с дэшбордом

Не смог найти, есть ли у страницы дэшборда какое-либо событие, которое будет происходить до начала загрузки данных (события типа stream) в дэшборд. При загрузке дэшборда, изначально из источника извлекаются все данные без ограничений. После загрузки дэшборда внутри текущего контекста можно изменить объем даных при помощи управляющего дэша или событием setKoobFilters. Хочется разобраться, есть ли возможность заранее установить контекст фильтрации для конкретного дэшборда или куба.
.
Вопросы:

  1. Можно ли сделать так, чтобы заранее прописанное событие setKoobFilters возникало до загрузки данных в дэшборд и автоматически бы ограничивало объем первоначально згружаемых данных, но при этом оставалась бы возможность сбросить фильтры и отобразить весь объем данных?
    .
  2. Можно ли после полной загрузки дэшборда как-то автоматически эмулировать событие setKoobFilters, как будто его произвёл пользователь?

Добрый день!

  1. Да, это можно сделать непосредственно в кубе, или для конкретных виджетов на дэшборде. В первом случае, необходимо зайти в Источник данныхКубы и нажать на кнопку редактирования столбцов куба

Затем нужно нажать на карандаш около названия той размерности, по которой вы хотите отфильтровать. В JSON конфигурации этой размерности пропишите "defaultValue": <значение>

Во втором случае, вам нужно зайти в настройки виджета, в пункт “Данные”, и затем в пункт фильтр добавить размерность

Для того чтобы добавить условие по-умолчанию нажмите на зеленый прямоугольник

2 Событие setKoobFilters посл загрузки вызывается либо кликом по точке графика либо выбором фильтров в управляющем дэше. Варианты, как добиться того же эффекта без каких-либо действий от пользователя, представлены выше

Спасибо за предложенные варианты.
.

  1. Я уже пробовал вариант с default_value. В этом случае значение по умолчанию подставляется в изначальный запрос к БД. По сути, как RLS. Для меня этот вариант не подходит, т.к. необходимо иметь возможность загрузить дэшборд с каким-либо фильром, но при работе с дэшбордом иметь возможность получить полный, не ограниченный чем-либо набор данных. С default_value так не выйдет.
    Зелёный прямоугольник создаст статическое условие фильтрации. Т.е. да, данные будут отфильтрованы, но при этом дэш потеряет возможность реагировать на происходящие вокруг кросс-фильтрации и события от управляющего дэша. Отменить фильтрацию без редактирования дэшборда нельзя.
    .
  2. У setKoobFilters есть важное отличие от приведённых выше способов - его условия можно отменить при работе с дэшбордом, а у default_value и статического фильтра - нет, только перенастроить конфигурацию дэша или куба. Соответственно, два указанных способа не эквивалентны setKoobFilters.
    .
    Итого: оба описанных способа фильтруют данные на источнике, до загрузки данных в дэшборд. Мне интересен такой способ. который будет фильтровать данные в пользовательском контексте, т.е. имитировать setKoobFilters но без участия пользователя. Есть ли такой механизм в luxms?

Здравствуйте. Давайте по пунктам:

  1. Специального события, на которое можно подписаться, к сожалению нет.
  2. Вы можете в урл явно указать те фильтры, которые вы хотите сделать по-молчанию, с возможностью их потом изменить в упр.деше.

В урле они останутся как есть, а вот деши подхватят те изменения, которые вы внесли в упр.деше. Потому после перезагрузки дефолтное значение сохранится.

Пример урла с выставленными фильтрами на дименшн sex и age, name:
http://site.ru/#/ds/ds_54/dashboards?&f.age>=50&f.sex=Мужской&f.name=Болик,Лёлик,Анаболик

К сожалению, вы не сможете их выставить автоматически после перехода на дешборд из коробки.
Однако, вы сможете принудительно выставлять дефолтные фильтры при помощи проекта luxmsbi-web-resources или bi-magic-resources, если еще не знакомы.
Тред, в котором описывается подход к кастомной разработке тут
https://help.luxmsbi.com/-1197#post-10

Вы создадите в проекте файл (реакт-компонент), например DefaultFilterSetter.tsx
В нем пропишете логику, которая сводится к следующему:
Если фильтры в модели сервиса фильтры есть пустой объект (если человек не выставлял фильтры руками , то считается, что общей фильтрации не было, только локальная для каждого дешлета, при условии, что в блоке filters у вас прописаны фильтры на дименшн явно)

  • Вы можете создать дешлет, который имеет view_class: “internal” и указать в качестве файла DefaultFilterSetter.js
  • указать в JSON editor режиме для данного дешлета параметры x и у в блоке frame равными нулю, так чтобы размеры дешлета не учитывались при расчете отступов и размеров соседей и ваша сетка дешлетов не изменилась.
    Возможно, что опция “Скрытый” в блоке Опции дешлета может вам помочь.

Код DefaultFilterSetter.tsx может быть примерно таким

import React, {useEffect} from “react”;

import {KoobFiltersService, useServiceItself} from “bi-internal/services”;

const DefaultFilterSetter = (props) => {
const {cfg} = props;
const koobFiltersService = useServiceItself(KoobFiltersService);
const koobFiltersServiceModel = koobFiltersService.getModel();
useEffect(() => {
if (!koobFiltersServiceModel.loading && !Object.keys(koobFiltersServiceModel.filters).length) {
// Если фильтров нет, то есть если koobFiltersServiceModel.filters = {}
// то ставим дефолтный набор фильтров. Можно читать их из конфига
// например вы в конфиге сделали ключ myFilters и туда поместили фильтры аналогично тем,
// что приведены в объекте, отдаваемом setFilters тут? в блоке дефолта

      if (cfg.getRaw().hasOwnProperty('myFilters')) {
        koobFiltersService.setFilters(cfg.getRaw().myFilters);
      } else {
        // Блок дефолта (задаете хардкодом)
        koobFiltersService.setFilters({
          name: ["=", "Болик", "Лёлик", "Анаболик"],
          sex: ["!=", "Мужской"],
          age: [">=", 50]
        }); 
      }
    }
  }, []);
  return (
    <></>
  )
}
export default DefaultFilterSetter;

Вот. Можете сбилдить tsx файл проектом и перенести js файл руками в разделе resources вашего датасета, или запустить команду для автоматической сборки и отправки ваших компонентов.
npm run push например

На всякий случай поясню, что если для вас сработает вариант с указанием нулевых размеров, то потом вам будет проблематично править получившийся файл, потому его конфиг, если он будет нужен вы сможете получить в разделе edt-entities в табе dashlets и указанием нужного дешлета.
http://site.ru/#/ds/ds_54/edt-entities

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