mirror of
https://github.com/home-assistant/frontend.git
synced 2025-12-24 12:49:19 +00:00
* chartjs test * [WIP] Modified for Chart.js * Tweaking styles ( tooltips and lines ) * Almost done TODO: Change tooltips to HTML tag Improve color function * More work on Tooltips * Improve update logic Fix linting * resolve conflict * [WIP] Create new tooltip mode hack. Add axis padding to top and botton to prevent axis cutoff * TODO: cleanup * FIXME: tooltip in history graph not working correctly reorganize some code * fix build problem * Fix color and tooltip issue Fix label max width for timeline chart * update dep * Fix strange color after build due to `uglify` bug with reference the minified version. Make line chart behavior more similar to Google Charts. Make the chart honor to `unknown` and other state by manually calculate point value. * fix bugs * Remove label for only one data in timeline chart. Fix bug for infinite loop in some cases * Add HTML legend to chart. * Fix isSingleDevice bug due to calculation. Add isSingleDevice property support. * fix for lint * Replace innerHTML code with polymer node. * Replace tooltip with HTML code * fix tooltip style * move default tooltip mode to plugin * LINTING * fix Move localize history data to Timeline Chart. Fix timeline static color. Rework on chart resize. * Bug fix: Chart may disappear on some case. Timeline chart calculation issue. Change timeline chart hidden logic. * fix tooltip rework for resize event * lint * element * Replace `var` to `let`. Move import and ChartJs injection code to `ha-chart-scripts.html`. * lint: convert more let to const * fix font fix undef * update bower.json * move * Load chart code on demand
74 lines
2.4 KiB
HTML
74 lines
2.4 KiB
HTML
<script src="../../bower_components/moment/moment.js"></script>
|
|
<script src="../../bower_components/chart.js/dist/Chart.min.js"></script>
|
|
<script src="../../bower_components/chartjs-chart-timeline/timeline.js"></script>
|
|
<script>
|
|
// Use minified(Chart.min.js) version to fix strange color after uglify
|
|
// eslint-disable-next-line no-unused-vars
|
|
/* global Chart moment */
|
|
{
|
|
// This function add a new interaction mode to Chart.js that
|
|
// returns one point for every dataset.
|
|
Chart.Interaction.modes.neareach = function (chart, e, options) {
|
|
const getRange = {
|
|
x: (a, b) => Math.abs(a.x - b.x),
|
|
y: (a, b) => Math.abs(a.y - b.y),
|
|
// eslint-disable-next-line no-restricted-properties
|
|
xy: (a, b) => Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2),
|
|
};
|
|
const getRangeMax = {
|
|
x: r => r,
|
|
y: r => r,
|
|
xy: r => r * r,
|
|
};
|
|
let position;
|
|
if (e.native) {
|
|
position = {
|
|
x: e.x,
|
|
y: e.y
|
|
};
|
|
} else {
|
|
position = Chart.helpers.getRelativePosition(e, chart);
|
|
}
|
|
const elements = [];
|
|
const elementsRange = [];
|
|
const datasets = chart.data.datasets;
|
|
let meta;
|
|
options.axis = options.axis || 'xy';
|
|
const rangeFunc = getRange[options.axis];
|
|
const rangeMaxFunc = getRangeMax[options.axis];
|
|
|
|
for (let i = 0, ilen = datasets.length; i < ilen; ++i) {
|
|
if (!chart.isDatasetVisible(i)) {
|
|
continue;
|
|
}
|
|
|
|
meta = chart.getDatasetMeta(i);
|
|
for (let j = 0, jlen = meta.data.length; j < jlen; ++j) {
|
|
const element = meta.data[j];
|
|
if (!element._view.skip) {
|
|
const vm = element._view;
|
|
const range = rangeFunc(vm, position);
|
|
const oldRange = elementsRange[i];
|
|
if (range < rangeMaxFunc(vm.radius + vm.hitRadius)) {
|
|
if (oldRange === undefined || oldRange > range) {
|
|
elementsRange[i] = range;
|
|
elements[i] = element;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const ret = elements.filter(n => n !== undefined);
|
|
return ret;
|
|
};
|
|
|
|
// Fix infinite loop bug in Chart.js 2.7.1
|
|
const x = Chart.scaleService.constructors.time.prototype;
|
|
x._getLabelCapacity = x.getLabelCapacity;
|
|
x.getLabelCapacity = function () {
|
|
// eslint-disable-next-line prefer-rest-params
|
|
const ret = this._getLabelCapacity.apply(this, arguments);
|
|
return ret > 0 ? ret : 1;
|
|
};
|
|
}
|
|
</script> |