From 1854519b76d27917931b62d49274160acb3f5860 Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:36:30 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/ui/chart/Chart-matrix.js | 150 ++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 js/ui/chart/Chart-matrix.js diff --git a/js/ui/chart/Chart-matrix.js b/js/ui/chart/Chart-matrix.js new file mode 100644 index 0000000..12e58db --- /dev/null +++ b/js/ui/chart/Chart-matrix.js @@ -0,0 +1,150 @@ +/*! + * chartjs-chart-matrix v0.1.3 + * https://github.com/kurkle/chartjs-chart-matrix#readme + * (c) 2019 Jukka Kurkela + * Released under the MIT license + */ +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('chart.js')) : +typeof define === 'function' && define.amd ? define(['chart.js'], factory) : +(global = global || self, factory(global.Chart)); +}(this, function (Chart) { 'use strict'; + +Chart = Chart && Chart.hasOwnProperty('default') ? Chart['default'] : Chart; + +var resolve = Chart.helpers.options.resolve; + +var Controller = Chart.DatasetController.extend({ + + dataElementType: Chart.elements.Rectangle, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var data = meta.data || []; + var i, ilen; + + me._xScale = me.getScaleForId(meta.xAxisID); + me._yScale = me.getScaleForId(meta.yAxisID); + + for (i = 0, ilen = data.length; i < ilen; ++i) { + me.updateElement(data[i], i, reset); + } + }, + + updateElement: function(item, index, reset) { + var me = this; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var xScale = me._xScale; + var yScale = me._yScale; + var options = me._resolveElementOptions(item, index); + var x = reset ? xScale.getBasePixel() : xScale.getPixelForValue(value, index, datasetIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(value, index, datasetIndex); + var h = options.height; + var w = options.width; + var halfH = h / 2; + var halfW = w / 2; + + item._xScale = xScale; + item._yScale = yScale; + item._options = options; + item._datasetIndex = datasetIndex; + item._index = index; + + item._model = { + x: x+halfW, + base: y - h, + y: y, + width: w, + height: h, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderSkipped: options.borderSkipped, + borderWidth: options.borderWidth + }; + + item.pivot(); + }, + + draw: function() { + var me = this; + var data = me.getMeta().data || []; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + data[i].draw(); + } + }, + + /** + * @private + */ + _resolveElementOptions: function(rectangle, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var options = chart.options.elements.rectangle; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderSkipped', + 'borderWidth', + 'width', + 'height' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve([ + dataset[key], + options[key] + ], context, index); + } + + return values; + } + +}); + +Chart.controllers.matrix = Controller; +Chart.defaults.matrix = { + hover: { + mode: 'nearest', + intersect: true + }, + tooltips: { + mode: 'nearest', + intersect: true + }, + scales: { + xAxes: [{ + type: 'linear' + }], + yAxes: [{ + type: 'linear' + }] + }, + elements: { + rectangle: { + borderSkipped: false, + width: 20, + height: 20 + } + } +}; + +}));