Как использовать Drilldown в пользовательском виджете

Настройка данных для DrillDown.

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

  1. В рабочей области дашборда выбрать виджет.

  2. Открыть вкладку “Настройки” для виджета.

  3. Раскрыть вкладку "Панель фильтров и Drill down" и включить параметр "Использовать Drill down".

  4. В привязке данных выбирать источник данных “ViQube“.

  5. Создать запрос к данным.

Для корректной работы DrillDown в строках должно быть выбрано больше одного измерения.

/**
 * 1) Делаем drilldown с помощью visApi().drillDown.
 * 2) В подписке visApi().onDrillDownListener получаем данные следующего уровня после drilldown.
 * 3) Строим новый уровень виджета с помощью полученных новых данных.
 * 4) Делаем drilldup с помощью visApi().drillup или через навигационную панель, которую можно вызвать с помощью visApi().showControlPanel.
 * 5) В подписке visApi().onDrillUpListener получаем данные текущего уровня после drillup (visApi().getWidgetByGuid(widgetGuid).widgetDataContainer.dataFrame).
 * 6) Строим предыдущий уровень виджет, если виджет не поддерживает этого автоматически.
 */

var widgetGuid = w.general.renderTo;
var chart = Highcharts.chart({
    chart: {
        type: 'column',
        renderTo: widgetGuid,
        events: {
            drillup: function() { // Вызывается, когда нажали нативную кнопку "Назад" от Highcharts 
                visApi().drillUp(widgetGuid); // Обязательно нужно вызывать эту функцию, когда делается drillUp не через навигационную панель. 
            }
        }
    },
    xAxis: {
        type: "category"
    },
    plotOptions: {
        series: {
            point: {
                events: {
                    click: function () {
                        visApi().drillDown(widgetGuid, [this.name]);
                    }
                }
            }
        }
    },
    series: buildSeries(w.data)
});

//visApi().showControlPanel(widgetGuid); // отображаем на виджете панель кнопок для DrillDown/DrillUp

/**
 * Собирает серии для гистограммы
 */
function buildSeries(data) {
    return data.cols.map(function (col, colIndex) {
        var points = data.rows.map(function (row, rowIndex) {
            return {
                y: data.values[colIndex][rowIndex],
                name: row[0]
            }; 
        });
        return {
            name: col.join(' - '),
            data: points
        }
    });
}

/**
 * Получает точку на гистограмме по названию
 */
function getPointByName(pointName) {
    var selectedPoint = null;
    chart.series.forEach(function (serie) {
        selectedPoint = serie.data.find(function (point) {
            return point.name == point.name
        })
    });
    return selectedPoint;
}

/**
 * Подписывается на DrillDown, чтобы отловить новые данные после drilldown и отрисовать их
 */
visApi().onDrillDownListener({widgetGuid: widgetGuid, guid: "1111"}, function(event) {
    var selectedPointName = event.selectedValues[0];
    drillDownOnChart(selectedPointName, event.widgetDataContainer.dataFrame);
});

/**
 * Делает drilldown на гистограмме
 */
function drillDownOnChart(pointName, dataFrame) {
    var point = getPointByName(pointName);
    var newSeries = buildSeries(dataFrame);
    newSeries.forEach(function(serie) {
        chart.addSingleSeriesAsDrilldown(point, serie);
    });

    point.doDrilldown(); // https://github.com/highcharts/highcharts/issues/8324#issuecomment-388766611
    chart.applyDrilldown();
    
    //chart.drillUpButton.element.style.display = "block"; // можно отобразить кнопку нативную кнопку "Назад" вместо visApi().showControlPanel(widgetGuid);
}

/**
 * Подписывается на DrillUp, чтобы отловить получить данные текущего уровня после drillup и отрисовать их
 */
visApi().onDrillUpListener({widgetGuid: widgetGuid, guid: "2222"}, function (event) {
    //var currentDataFrame = visApi().getWidgetByGuid(widgetGuid).widgetDataContainer.dataFrame; // данные текущего уровня, чтобы отрисовать виджет после drillup
    var level = event.hierarchyPath.length; // уровень до которого нужно провалиться.
    drillUpOnChart(level);
});

/**
 * Делает drillUp на гистограмме
 */
function drillUpOnChart(toLevel) {
    while (chart.drilldownLevels.some(level => level.levelNumber === toLevel)) {
        chart.drillUp();
    }
}

На этой странице: