You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
7.6 KiB
204 lines
7.6 KiB
/*
|
|
* Chart.js wrapper
|
|
* @version: 2.0.0 (Mon, 25 Nov 2019)
|
|
* @requires: jQuery v3.0 or later, Chart.js v2.8.0
|
|
* @author: HtmlStream
|
|
* @event-namespace: .HSCore.components.HSValidation
|
|
* @license: Htmlstream Libraries (https://htmlstream.com/licenses)
|
|
* Copyright 2020 Htmlstream
|
|
*/
|
|
;(function ($) {
|
|
'use strict';
|
|
|
|
$.HSCore.components.HSChartMatrixJS = {
|
|
defaults: {
|
|
type: 'matrix',
|
|
options: {
|
|
animation: {
|
|
duration: 0
|
|
},
|
|
responsive: true,
|
|
maintainAspectRatio: false,
|
|
legend: {
|
|
display: false
|
|
},
|
|
tooltips: {
|
|
enabled: false,
|
|
mode: 'nearest'
|
|
},
|
|
gradientPosition: {
|
|
x0: 0,
|
|
y0: 0,
|
|
x1: 0,
|
|
y1: 0,
|
|
}
|
|
}
|
|
},
|
|
|
|
init: function (el, options) {
|
|
if (!el.length) return;
|
|
|
|
var context = this,
|
|
defaults = Object.assign({}, context.defaults),
|
|
dataSettings = el.attr('data-hs-chartjs-options') ? JSON.parse(el.attr('data-hs-chartjs-options')) : {},
|
|
settings = {};
|
|
settings = $.extend(true, dataSettings.type, defaults);
|
|
settings = $.extend(true, settings, {
|
|
options: {
|
|
tooltips: {
|
|
custom: function (tooltipModel) {
|
|
// Tooltip Element
|
|
var tooltipEl = document.getElementById('chartjsTooltip');
|
|
|
|
// Create element on first render
|
|
if (!tooltipEl) {
|
|
tooltipEl = document.createElement('div');
|
|
tooltipEl.id = 'chartjsTooltip';
|
|
tooltipEl.style.opacity = 0;
|
|
tooltipEl.classList.add('hs-chartjs-tooltip-wrap');
|
|
tooltipEl.classList.add('hs-chartjs-tooltip-matrix');
|
|
tooltipEl.innerHTML = '<div class="hs-chartjs-tooltip"></div>';
|
|
document.body.appendChild(tooltipEl);
|
|
}
|
|
|
|
// Hide if no tooltip
|
|
if (settings.type !== 'matrix' && tooltipModel.opacity === 0) {
|
|
tooltipEl.style.opacity = 0;
|
|
|
|
tooltipEl.remove()
|
|
|
|
return;
|
|
}
|
|
|
|
// Set caret Position
|
|
tooltipEl.classList.remove('above', 'below', 'no-transform');
|
|
if (tooltipModel.yAlign) {
|
|
tooltipEl.classList.add(tooltipModel.yAlign);
|
|
} else {
|
|
tooltipEl.classList.add('no-transform');
|
|
}
|
|
|
|
function getBody(bodyItem) {
|
|
return bodyItem.lines;
|
|
}
|
|
|
|
// Set Text
|
|
if (tooltipModel.body) {
|
|
var titleLines = tooltipModel.title || [],
|
|
bodyLines = tooltipModel.body.map(getBody),
|
|
today = new Date();
|
|
|
|
var innerHtml = '<header class="hs-chartjs-tooltip-header">';
|
|
|
|
titleLines.forEach(function (title) {
|
|
innerHtml += title + ', ' + today.getFullYear();
|
|
});
|
|
|
|
innerHtml += '</header><div class="hs-chartjs-tooltip-body">';
|
|
|
|
bodyLines.forEach(function (body, i) {
|
|
innerHtml += '<div>'
|
|
|
|
var oldBody = body[0],
|
|
newBody = oldBody,
|
|
color = tooltipModel.labelColors[i].backgroundColor instanceof Object ? tooltipModel.labelColors[i].borderColor : tooltipModel.labelColors[i].backgroundColor;
|
|
|
|
innerHtml += (settings.options.tooltips.hasIndicator ? '<span class="d-inline-block rounded-circle mr-1" style="width: ' + settings.options.tooltips.indicatorWidth + '; height: ' + settings.options.tooltips.indicatorHeight + '; background-color: ' + color + '"></span>' : '') + (oldBody.length > 3 ? newBody : body);
|
|
|
|
innerHtml += '</div>'
|
|
});
|
|
|
|
innerHtml += '</div>';
|
|
|
|
var tooltipRoot = tooltipEl.querySelector('.hs-chartjs-tooltip');
|
|
tooltipRoot.innerHTML = innerHtml;
|
|
}
|
|
|
|
// `this` will be the overall tooltip
|
|
var position = this._chart.canvas.getBoundingClientRect();
|
|
|
|
// Display, position, and set styles for font
|
|
tooltipEl.style.opacity = 1;
|
|
tooltipEl.style.left = position.left + window.pageXOffset + tooltipModel.caretX - (tooltipEl.offsetWidth / 2) - 3 + 'px';
|
|
tooltipEl.style.top = position.top + window.pageYOffset + tooltipModel.caretY - tooltipEl.offsetHeight - 25 + 'px';
|
|
tooltipEl.style.pointerEvents = 'none';
|
|
tooltipEl.style.transition = settings.options.tooltips.transition;
|
|
}
|
|
}
|
|
}
|
|
}, dataSettings, settings, options);
|
|
|
|
if (settings.options.hasOwnProperty('matrixBackgroundColor')) {
|
|
settings.data.datasets.forEach(function(datasets) {
|
|
datasets.backgroundColor = function(ctx) {
|
|
var value = ctx.dataset.data[ctx.dataIndex].v;
|
|
var additionToValue = settings.options.matrixBackgroundColor.hasOwnProperty('additionToValue') ? settings.options.matrixBackgroundColor.additionToValue : 5;
|
|
var alpha = (additionToValue + value) / settings.options.matrixBackgroundColor.accent;
|
|
|
|
if (value.toFixed() == 0 && settings.options.matrixBackgroundColor.hasOwnProperty('nullColor')) {
|
|
return Color(settings.options.matrixBackgroundColor.nullColor).rgbString();
|
|
} else {
|
|
return Color(settings.options.matrixBackgroundColor.color).alpha(alpha).rgbString();
|
|
}
|
|
};
|
|
})
|
|
}
|
|
|
|
if (settings.options.hasOwnProperty('matrixLegend')) {
|
|
var min = settings.data.datasets[0].data[0].v;
|
|
var max = settings.data.datasets[0].data[0].v;
|
|
|
|
for (var i = 1; i < settings.data.datasets[0].data.length; i++) {
|
|
if (settings.data.datasets[0].data[i].v < min) min = settings.data.datasets[0].data[i].v;
|
|
if (settings.data.datasets[0].data[i].v > max) max = settings.data.datasets[0].data[i].v;
|
|
}
|
|
|
|
min = min.toFixed();
|
|
max = max.toFixed();
|
|
|
|
var html = [],
|
|
stepSize = settings.options.matrixLegend.hasOwnProperty('stepSize') ? settings.options.matrixLegend.stepSize : (max / 10),
|
|
additionToValue = settings.options.matrixBackgroundColor.hasOwnProperty('additionToValue') ? settings.options.matrixBackgroundColor.additionToValue : 5;
|
|
|
|
$(settings.options.matrixLegend.container).addClass('hs-chartjs-matrix-legend')
|
|
|
|
$(settings.options.matrixLegend.container).append('<li class="hs-chartjs-matrix-legend-min">' + min + '</li>')
|
|
|
|
for (var i = 0; i < max;) {
|
|
var value = i;
|
|
var alpha = (additionToValue + value) / settings.options.matrixBackgroundColor.accent;
|
|
html.push('<li class="hs-chartjs-matrix-legend-item" style="background-color: ' + Color(settings.options.matrixBackgroundColor.color).alpha(alpha).rgbString() + '"></li>');
|
|
|
|
i = i + stepSize;
|
|
}
|
|
|
|
$(settings.options.matrixLegend.container).append(html)
|
|
|
|
if (settings.options.matrixLegend.metric && max > 100) {
|
|
if (max < 1000000) {
|
|
max = max / 1000 + 'k';
|
|
} else {
|
|
max = max / 1000000 + 'kk';
|
|
}
|
|
}
|
|
|
|
$(settings.options.matrixLegend.container).append('<li class="hs-chartjs-matrix-legend-max">' + max + '</li>')
|
|
}
|
|
|
|
window.addEventListener('mousemove', function (e) {
|
|
if (!$(e.target).hasClass('chartjs-render-monitor')) {
|
|
$('.hs-chartjs-tooltip-matrix').remove()
|
|
}
|
|
});
|
|
|
|
/* Start : Init */
|
|
|
|
var newChartJS = new Chart(el, settings);
|
|
|
|
/* End : Init */
|
|
|
|
return newChartJS;
|
|
}
|
|
};
|
|
|
|
})(jQuery);
|
|
|