![JAR search and dependency download from the Maven repository](/logo.png)
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