All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ui.static.sql-js.chart.js Maven / Gradle / Ivy

The newest version!
let chart = null;

function setupChart() {
    const ctx = document.getElementById('chart').getContext('2d');
    if (chart != null) {
        chart.destroy();
    }
    let rawData = getDataset();
    console.log(JSON.stringify(rawData, null, 4));
    let adaptedData = adaptDataset(rawData);
    console.log(JSON.stringify(adaptedData, null, 4));

    let charContainer = $("#chart-container");
    let chartComponentsToggleButton = $("button[data-target='#chart-components']");
    if (adaptedData.error) {
        if (!chartComponentsToggleButton.hasClass("collapsed")) {
            chartComponentsToggleButton.trigger('click');
        }
        charContainer.hide();
        setTimeout(function (){
            showOpErrorOnId("chart", "Can't display chart", adaptedData.error);
        }, 200);
        return;
    }

    hideServerOpOnId("chart");
    charContainer.show();
    if (chartComponentsToggleButton.hasClass("collapsed")) {
        chartComponentsToggleButton.trigger('click');
    }

    chart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: adaptedData.labels,
            datasets: adaptedData.datasets,
        },
        options: {
            responsive: false,
            scales: {
                xAxes: [
                    {
                        display: true,
                        type: 'category',
                        ticks: {
                            max: 3,
                            callback: function (value) {
                                let maxLength = 60;
                                if (value.length > maxLength) {
                                    return value.slice(0, maxLength) + "...";
                                }
                                return value;
                            }
                        },
                        scaleLabel: {
                            display: adaptedData.xAxisLabel !== undefined,
                            labelString: adaptedData.xAxisLabel
                        }
                    },
                ],
                yAxes: [
                    {
                        id: 'y1',
                        ticks: {
                            beginAtZero: true,
                            callback: function (value) {
                                return formatLabelValue(value, adaptedData.yAxisLabel);
                            }
                        },
                        scaleLabel: {
                            display: adaptedData.yAxisLabel !== undefined,
                            labelString: adaptedData.yAxisLabel
                        }
                    },
                    {
                        id: 'y2',
                        display: adaptedData.yAxis2Label !== undefined,
                        gridLines: {
                            display: false
                        },
                        ticks: {
                            beginAtZero: true,
                            callback: function (value) {
                                return formatLabelValue(value, adaptedData.yAxis2Label);
                            }
                        },
                        scaleLabel: {
                            display: adaptedData.yAxis2Label !== undefined,
                            labelString: adaptedData.yAxis2Label
                        },
                        position: 'right'
                    },
                    {
                        id: 'y3',
                        display: adaptedData.yAxis3Label !== undefined,
                        gridLines: {
                            display: false
                        },
                        ticks: {
                            beginAtZero: true,
                            callback: function (value) {
                                return formatLabelValue(value, adaptedData.yAxis3Label);
                            }
                        },
                        scaleLabel: {
                            display: adaptedData.yAxis3Label !== undefined,
                            labelString: adaptedData.yAxis3Label
                        },
                        position: 'right'
                    }
                ]
            },
            tooltips: {
                callbacks: {
                    beforeTitle: function () {
                        if (adaptedData.xAxisLabel) {
                            return adaptedData.xAxisLabel + ": ";
                        }
                        return "";
                    },
                    beforeLabel: function () {
                        if (adaptedData.xAxis2Label) {
                            return adaptedData.xAxis2Label + ": ";
                        }
                        return "";
                    },
                    label: function (tooltipItem, data) {
                        let label = data.datasets[tooltipItem.datasetIndex].label || '';
                        if (label) {
                            label += ': ';
                        }
                        let sourceDataset = adaptedData.datasets[tooltipItem.datasetIndex];
                        let yAxisLabel;
                        switch (sourceDataset.yAxisID) {
                            case undefined:
                            case "y1":
                                yAxisLabel = adaptedData.yAxisLabel;
                                break;
                            case "y2":
                                yAxisLabel = adaptedData.yAxis2Label;
                                break;
                            case "y3":
                                yAxisLabel = adaptedData.yAxis3Label;
                                break;
                        }
                        label += formatLabelValue(tooltipItem.yLabel, yAxisLabel, sourceDataset.label);
                        return label;
                    }
                }
            },
            animation: {
                duration: 0 // general animation time
            },
            hover: {
                animationDuration: 0 // duration of animations when hovering an item
            },
            responsiveAnimationDuration: 0 // animation duration after a resize
        }
    });
}

function formatLabelValue(value, yAxisLabel, datasetLabel) {
    if (yAxisLabel !== undefined && yAxisLabel !== "*") {
        let result = tryFormatValue(value, yAxisLabel);
        if (result) return result;
    }
    if (datasetLabel !== undefined) {
        let result = tryFormatValue(value, datasetLabel);
        if (result) return result;
    }
    return prettyNumber(value);
}

function tryFormatValue(value, label) {
    if (label.indexOf("BytesPerSec") >= 0) {
        return prettyBytesValue(value) + "/sec";
    }
    if (label.indexOf("Bytes") >= 0) {
        return prettyBytesValue(value);
    }
    if (label.length >= 2 && label.indexOf("Ms") === label.length - 2) {
        return prettyMillisValue(value);
    }
    if (label.indexOf("Rate") >= 0) {
        return prettyNumber(value) + "/sec";
    }
    if (label[label.length - 1] === '%') {
        return prettyNumber(value) + "%";
    }
    return undefined;
}

function getDataset() {
    let columns = [];
    $(".column-meta").each(function () {
        let column = $(this);
        columns.push({
            name: column.attr("data-label"),
            type: column.attr("data-type")
        });
    });

    let dataset = [];
    $(".data-row").each(function () {
        let row = [];
        $(this).find(".data-value").each(function () {
            let dataEntry = $(this);
            let rawValue = dataEntry.attr("data-value");
            let numericValue = Number(rawValue);
            let value;
            if (rawValue === "null") {
                value = null;
            } else if (isNaN(numericValue)) {
                value = rawValue;
            } else {
                value = numericValue;
            }
            row.push(value);
        });
        dataset.push(row);
    });
    return {
        columns: columns,
        rows: dataset
    };
}

function adaptDataset(dataset) {
    //column type cases
    // 0)  [] -> no data, no chart
    // 1)  [, ...] -> only labels, no chart
    // 2)  [] -> 1 dataset (use index as label)
    // 3)  [




© 2015 - 2025 Weber Informatics LLC | Privacy Policy