Files
backend/public/plugins/chartjs-plugin-datalabels/chartjs-plugin-datalabels.min.js

647 lines
24 KiB
JavaScript

/*!
* chartjs-plugin-datalabels v2.0.0
* https://chartjs-plugin-datalabels.netlify.app
* (c) 2017-2021 chartjs-plugin-datalabels contributors
* Released under the MIT license
*/
! function (t, e) {
"object" == typeof exports && "undefined" != typeof module ? module.exports = e(require("chart.js/helpers"), require("chart.js")) : "function" == typeof define && define.amd ? define(["chart.js/helpers", "chart.js"], e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).ChartDataLabels = e(t.Chart.helpers, t.Chart)
}(this, (function (t, e) {
"use strict";
var r = function () {
if ("undefined" != typeof window) {
if (window.devicePixelRatio) return window.devicePixelRatio;
var t = window.screen;
if (t) return (t.deviceXDPI || 1) / (t.logicalXDPI || 1)
}
return 1
}(),
a = function (e) {
var r, a = [];
for (e = [].concat(e); e.length;) "string" == typeof (r = e.pop()) ? a.unshift.apply(a, r.split("\n")) : Array.isArray(r) ? e.push.apply(e, r) : t.isNullOrUndef(e) || a.unshift("" + r);
return a
},
o = function (t, e, r) {
var a, o = [].concat(e),
n = o.length,
i = t.font,
l = 0;
for (t.font = r.string, a = 0; a < n; ++a) l = Math.max(t.measureText(o[a]).width, l);
return t.font = i, {
height: n * r.lineHeight,
width: l
}
},
n = function (t, e, r) {
return Math.max(t, Math.min(e, r))
},
i = function (t, e) {
var r, a, o, n, i = t.slice(),
l = [];
for (r = 0, o = e.length; r < o; ++r) n = e[r], -1 === (a = i.indexOf(n)) ? l.push([n, 1]) : i.splice(a, 1);
for (r = 0, o = i.length; r < o; ++r) l.push([i[r], -1]);
return l
};
function l(t, e) {
var r = e.x,
a = e.y;
if (null === r) return {
x: 0,
y: -1
};
if (null === a) return {
x: 1,
y: 0
};
var o = t.x - r,
n = t.y - a,
i = Math.sqrt(o * o + n * n);
return {
x: i ? o / i : 0,
y: i ? n / i : -1
}
}
function s(t, e, r) {
var a = 0;
return t < r.left ? a |= 1 : t > r.right && (a |= 2), e < r.top ? a |= 8 : e > r.bottom && (a |= 4), a
}
function u(t, e) {
var r, a, o = e.anchor,
n = t;
return e.clamp && (n = function (t, e) {
for (var r, a, o, n = t.x0, i = t.y0, l = t.x1, u = t.y1, d = s(n, i, e), c = s(l, u, e); d | c && !(d & c);) 8 & (r = d || c) ? (a = n + (l - n) * (e.top - i) / (u - i), o = e.top) : 4 & r ? (a = n + (l - n) * (e.bottom - i) / (u - i), o = e.bottom) : 2 & r ? (o = i + (u - i) * (e.right - n) / (l - n), a = e.right) : 1 & r && (o = i + (u - i) * (e.left - n) / (l - n), a = e.left), r === d ? d = s(n = a, i = o, e) : c = s(l = a, u = o, e);
return {
x0: n,
x1: l,
y0: i,
y1: u
}
}(n, e.area)), "start" === o ? (r = n.x0, a = n.y0) : "end" === o ? (r = n.x1, a = n.y1) : (r = (n.x0 + n.x1) / 2, a = (n.y0 + n.y1) / 2),
function (t, e, r, a, o) {
switch (o) {
case "center":
r = a = 0;
break;
case "bottom":
r = 0, a = 1;
break;
case "right":
r = 1, a = 0;
break;
case "left":
r = -1, a = 0;
break;
case "top":
r = 0, a = -1;
break;
case "start":
r = -r, a = -a;
break;
case "end":
break;
default:
o *= Math.PI / 180, r = Math.cos(o), a = Math.sin(o)
}
return {
x: t,
y: e,
vx: r,
vy: a
}
}(r, a, t.vx, t.vy, e.align)
}
var d = function (t, e) {
var r = (t.startAngle + t.endAngle) / 2,
a = Math.cos(r),
o = Math.sin(r),
n = t.innerRadius,
i = t.outerRadius;
return u({
x0: t.x + a * n,
y0: t.y + o * n,
x1: t.x + a * i,
y1: t.y + o * i,
vx: a,
vy: o
}, e)
},
c = function (t, e) {
var r = l(t, e.origin),
a = r.x * t.options.radius,
o = r.y * t.options.radius;
return u({
x0: t.x - a,
y0: t.y - o,
x1: t.x + a,
y1: t.y + o,
vx: r.x,
vy: r.y
}, e)
},
h = function (t, e) {
var r = l(t, e.origin),
a = t.x,
o = t.y,
n = 0,
i = 0;
return t.horizontal ? (a = Math.min(t.x, t.base), n = Math.abs(t.base - t.x)) : (o = Math.min(t.y, t.base), i = Math.abs(t.base - t.y)), u({
x0: a,
y0: o + i,
x1: a + n,
y1: o,
vx: r.x,
vy: r.y
}, e)
},
f = function (t, e) {
var r = l(t, e.origin);
return u({
x0: t.x,
y0: t.y,
x1: t.x,
y1: t.y,
vx: r.x,
vy: r.y
}, e)
},
x = function (t) {
return Math.round(t * r) / r
};
function y(t, e) {
var r = e.chart.getDatasetMeta(e.datasetIndex).vScale;
if (!r) return null;
if (void 0 !== r.xCenter && void 0 !== r.yCenter) return {
x: r.xCenter,
y: r.yCenter
};
var a = r.getBasePixel();
return t.horizontal ? {
x: a,
y: null
} : {
x: null,
y: a
}
}
function v(t, e, r) {
var a = r.backgroundColor,
o = r.borderColor,
n = r.borderWidth;
(a || o && n) && (t.beginPath(), function (t, e, r, a, o, n) {
var i = Math.PI / 2;
if (n) {
var l = Math.min(n, o / 2, a / 2),
s = e + l,
u = r + l,
d = e + a - l,
c = r + o - l;
t.moveTo(e, u), s < d && u < c ? (t.arc(s, u, l, -Math.PI, -i), t.arc(d, u, l, -i, 0), t.arc(d, c, l, 0, i), t.arc(s, c, l, i, Math.PI)) : s < d ? (t.moveTo(s, r), t.arc(d, u, l, -i, i), t.arc(s, u, l, i, Math.PI + i)) : u < c ? (t.arc(s, u, l, -Math.PI, 0), t.arc(s, c, l, 0, Math.PI)) : t.arc(s, u, l, -Math.PI, Math.PI), t.closePath(), t.moveTo(e, r)
} else t.rect(e, r, a, o)
}(t, x(e.x) + n / 2, x(e.y) + n / 2, x(e.w) - n, x(e.h) - n, r.borderRadius), t.closePath(), a && (t.fillStyle = a, t.fill()), o && n && (t.strokeStyle = o, t.lineWidth = n, t.lineJoin = "miter", t.stroke()))
}
function b(t, e, r) {
var a = t.shadowBlur,
o = r.stroked,
n = x(r.x),
i = x(r.y),
l = x(r.w);
o && t.strokeText(e, n, i, l), r.filled && (a && o && (t.shadowBlur = 0), t.fillText(e, n, i, l), a && o && (t.shadowBlur = a))
}
var _ = function (t, e, r, a) {
var o = this;
o._config = t, o._index = a, o._model = null, o._rects = null, o._ctx = e, o._el = r
};
t.merge(_.prototype, {
_modelize: function (r, a, n, i) {
var l, s = this,
u = s._index,
x = t.toFont(t.resolve([n.font, {}], i, u)),
v = t.resolve([n.color, e.defaults.color], i, u);
return {
align: t.resolve([n.align, "center"], i, u),
anchor: t.resolve([n.anchor, "center"], i, u),
area: i.chart.chartArea,
backgroundColor: t.resolve([n.backgroundColor, null], i, u),
borderColor: t.resolve([n.borderColor, null], i, u),
borderRadius: t.resolve([n.borderRadius, 0], i, u),
borderWidth: t.resolve([n.borderWidth, 0], i, u),
clamp: t.resolve([n.clamp, !1], i, u),
clip: t.resolve([n.clip, !1], i, u),
color: v,
display: r,
font: x,
lines: a,
offset: t.resolve([n.offset, 0], i, u),
opacity: t.resolve([n.opacity, 1], i, u),
origin: y(s._el, i),
padding: t.toPadding(t.resolve([n.padding, 0], i, u)),
positioner: (l = s._el, l instanceof e.ArcElement ? d : l instanceof e.PointElement ? c : l instanceof e.BarElement ? h : f),
rotation: t.resolve([n.rotation, 0], i, u) * (Math.PI / 180),
size: o(s._ctx, a, x),
textAlign: t.resolve([n.textAlign, "start"], i, u),
textShadowBlur: t.resolve([n.textShadowBlur, 0], i, u),
textShadowColor: t.resolve([n.textShadowColor, v], i, u),
textStrokeColor: t.resolve([n.textStrokeColor, v], i, u),
textStrokeWidth: t.resolve([n.textStrokeWidth, 0], i, u)
}
},
update: function (e) {
var r, o, n, i = this,
l = null,
s = null,
u = i._index,
d = i._config,
c = t.resolve([d.display, !0], e, u);
c && (r = e.dataset.data[u], o = t.valueOrDefault(t.callback(d.formatter, [r, e]), r), (n = t.isNullOrUndef(o) ? [] : a(o)).length && (s = function (t) {
var e = t.borderWidth || 0,
r = t.padding,
a = t.size.height,
o = t.size.width,
n = -o / 2,
i = -a / 2;
return {
frame: {
x: n - r.left - e,
y: i - r.top - e,
w: o + r.width + 2 * e,
h: a + r.height + 2 * e
},
text: {
x: n,
y: i,
w: o,
h: a
}
}
}(l = i._modelize(c, n, d, e)))), i._model = l, i._rects = s
},
geometry: function () {
return this._rects ? this._rects.frame : {}
},
rotation: function () {
return this._model ? this._model.rotation : 0
},
visible: function () {
return this._model && this._model.opacity
},
model: function () {
return this._model
},
draw: function (t, e) {
var r, a = t.ctx,
o = this._model,
i = this._rects;
this.visible() && (a.save(), o.clip && (r = o.area, a.beginPath(), a.rect(r.left, r.top, r.right - r.left, r.bottom - r.top), a.clip()), a.globalAlpha = n(0, o.opacity, 1), a.translate(x(e.x), x(e.y)), a.rotate(o.rotation), v(a, i.frame, o), function (t, e, r, a) {
var o, n = a.textAlign,
i = a.color,
l = !!i,
s = a.font,
u = e.length,
d = a.textStrokeColor,
c = a.textStrokeWidth,
h = d && c;
if (u && (l || h))
for (r = function (t, e, r) {
var a = r.lineHeight,
o = t.w,
n = t.x;
return "center" === e ? n += o / 2 : "end" !== e && "right" !== e || (n += o), {
h: a,
w: o,
x: n,
y: t.y + a / 2
}
}(r, n, s), t.font = s.string, t.textAlign = n, t.textBaseline = "middle", t.shadowBlur = a.textShadowBlur, t.shadowColor = a.textShadowColor, l && (t.fillStyle = i), h && (t.lineJoin = "round", t.lineWidth = c, t.strokeStyle = d), o = 0, u = e.length; o < u; ++o) b(t, e[o], {
stroked: h,
filled: l,
w: r.w,
x: r.x,
y: r.y + r.h * o
})
}(a, o.lines, i.text, o), a.restore())
}
});
var p = Number.MIN_SAFE_INTEGER || -9007199254740991,
g = Number.MAX_SAFE_INTEGER || 9007199254740991;
function m(t, e, r) {
var a = Math.cos(r),
o = Math.sin(r),
n = e.x,
i = e.y;
return {
x: n + a * (t.x - n) - o * (t.y - i),
y: i + o * (t.x - n) + a * (t.y - i)
}
}
function w(t, e) {
var r, a, o, n, i, l = g,
s = p,
u = e.origin;
for (r = 0; r < t.length; ++r) o = (a = t[r]).x - u.x, n = a.y - u.y, i = e.vx * o + e.vy * n, l = Math.min(l, i), s = Math.max(s, i);
return {
min: l,
max: s
}
}
function M(t, e) {
var r = e.x - t.x,
a = e.y - t.y,
o = Math.sqrt(r * r + a * a);
return {
vx: (e.x - t.x) / o,
vy: (e.y - t.y) / o,
origin: t,
ln: o
}
}
var k = function () {
this._rotation = 0, this._rect = {
x: 0,
y: 0,
w: 0,
h: 0
}
};
function $(t, e, r) {
var a = e.positioner(t, e),
o = a.vx,
n = a.vy;
if (!o && !n) return {
x: a.x,
y: a.y
};
var i = r.w,
l = r.h,
s = e.rotation,
u = Math.abs(i / 2 * Math.cos(s)) + Math.abs(l / 2 * Math.sin(s)),
d = Math.abs(i / 2 * Math.sin(s)) + Math.abs(l / 2 * Math.cos(s)),
c = 1 / Math.max(Math.abs(o), Math.abs(n));
return u *= o * c, d *= n * c, u += e.offset * o, d += e.offset * n, {
x: a.x + u,
y: a.y + d
}
}
t.merge(k.prototype, {
center: function () {
var t = this._rect;
return {
x: t.x + t.w / 2,
y: t.y + t.h / 2
}
},
update: function (t, e, r) {
this._rotation = r, this._rect = {
x: e.x + t.x,
y: e.y + t.y,
w: e.w,
h: e.h
}
},
contains: function (t) {
var e = this,
r = e._rect;
return !((t = m(t, e.center(), -e._rotation)).x < r.x - 1 || t.y < r.y - 1 || t.x > r.x + r.w + 2 || t.y > r.y + r.h + 2)
},
intersects: function (t) {
var e, r, a, o = this._points(),
n = t._points(),
i = [M(o[0], o[1]), M(o[0], o[3])];
for (this._rotation !== t._rotation && i.push(M(n[0], n[1]), M(n[0], n[3])), e = 0; e < i.length; ++e)
if (r = w(o, i[e]), a = w(n, i[e]), r.max < a.min || a.max < r.min) return !1;
return !0
},
_points: function () {
var t = this,
e = t._rect,
r = t._rotation,
a = t.center();
return [m({
x: e.x,
y: e.y
}, a, r), m({
x: e.x + e.w,
y: e.y
}, a, r), m({
x: e.x + e.w,
y: e.y + e.h
}, a, r), m({
x: e.x,
y: e.y + e.h
}, a, r)]
}
});
var C = {
prepare: function (t) {
var e, r, a, o, n, i = [];
for (e = 0, a = t.length; e < a; ++e)
for (r = 0, o = t[e].length; r < o; ++r) n = t[e][r], i.push(n), n.$layout = {
_box: new k,
_hidable: !1,
_visible: !0,
_set: e,
_idx: r
};
return i.sort((function (t, e) {
var r = t.$layout,
a = e.$layout;
return r._idx === a._idx ? a._set - r._set : a._idx - r._idx
})), this.update(i), i
},
update: function (t) {
var e, r, a, o, n, i = !1;
for (e = 0, r = t.length; e < r; ++e) o = (a = t[e]).model(), (n = a.$layout)._hidable = o && "auto" === o.display, n._visible = a.visible(), i |= n._hidable;
i && function (t) {
var e, r, a, o, n, i, l;
for (e = 0, r = t.length; e < r; ++e)(o = (a = t[e]).$layout)._visible && (l = new Proxy(a._el, {
get: (t, e) => t.getProps([e], !0)[e]
}), n = a.geometry(), i = $(l, a.model(), n), o._box.update(i, n, a.rotation()));
(function (t, e) {
var r, a, o, n;
for (r = t.length - 1; r >= 0; --r)
for (o = t[r].$layout, a = r - 1; a >= 0 && o._visible; --a)(n = t[a].$layout)._visible && o._box.intersects(n._box) && e(o, n)
})(t, (function (t, e) {
var r = t._hidable,
a = e._hidable;
r && a || a ? e._visible = !1 : r && (t._visible = !1)
}))
}(t)
},
lookup: function (t, e) {
var r, a;
for (r = t.length - 1; r >= 0; --r)
if ((a = t[r].$layout) && a._visible && a._box.contains(e)) return t[r];
return null
},
draw: function (t, e) {
var r, a, o, n, i, l;
for (r = 0, a = e.length; r < a; ++r)(n = (o = e[r]).$layout)._visible && (i = o.geometry(), l = $(o._el, o.model(), i), n._box.update(l, i, o.rotation()), o.draw(t, l))
}
},
P = "$default";
function S(e, r, a) {
if (r) {
var o, n = a.$context,
i = a.$groups;
r[i._set] && (o = r[i._set][i._key]) && !0 === t.callback(o, [n]) && (e.$datalabels._dirty = !0, a.update(n))
}
}
function I(t, e) {
var r, a, o = t.$datalabels,
n = o._listeners;
if (n.enter || n.leave) {
if ("mousemove" === e.type) a = C.lookup(o._labels, e);
else if ("mouseout" !== e.type) return;
r = o._hovered, o._hovered = a,
function (t, e, r, a) {
var o, n;
(r || a) && (r ? a ? r !== a && (n = o = !0) : n = !0 : o = !0, n && S(t, e.leave, r), o && S(t, e.enter, a))
}(t, n, r, a)
}
}
return {
id: "datalabels",
defaults: {
align: "center",
anchor: "center",
backgroundColor: null,
borderColor: null,
borderRadius: 0,
borderWidth: 0,
clamp: !1,
clip: !1,
color: void 0,
display: !0,
font: {
family: void 0,
lineHeight: 1.2,
size: void 0,
style: void 0,
weight: null
},
formatter: function (e) {
if (t.isNullOrUndef(e)) return null;
var r, a, o, n = e;
if (t.isObject(e))
if (t.isNullOrUndef(e.label))
if (t.isNullOrUndef(e.r))
for (n = "", o = 0, a = (r = Object.keys(e)).length; o < a; ++o) n += (0 !== o ? ", " : "") + r[o] + ": " + e[r[o]];
else n = e.r;
else n = e.label;
return "" + n
},
labels: void 0,
listeners: {},
offset: 4,
opacity: 1,
padding: {
top: 4,
right: 4,
bottom: 4,
left: 4
},
rotation: 0,
textAlign: "start",
textStrokeColor: void 0,
textStrokeWidth: 0,
textShadowBlur: 0,
textShadowColor: void 0
},
beforeInit: function (t) {
t.$datalabels = {
_actives: []
}
},
beforeUpdate: function (t) {
var e = t.$datalabels;
e._listened = !1, e._listeners = {}, e._datasets = [], e._labels = []
},
afterDatasetUpdate: function (e, r, a) {
var o, n, i, l, s, u, d, c, h = r.index,
f = e.$datalabels,
x = f._datasets[h] = [],
y = e.isDatasetVisible(h),
v = e.data.datasets[h],
b = function (e, r) {
var a, o, n, i = e.datalabels,
l = [];
return !1 === i ? null : (!0 === i && (i = {}), r = t.merge({}, [r, i]), o = r.labels || {}, n = Object.keys(o), delete r.labels, n.length ? n.forEach((function (e) {
o[e] && l.push(t.merge({}, [r, o[e], {
_key: e
}]))
})) : l.push(r), a = l.reduce((function (e, r) {
return t.each(r.listeners || {}, (function (t, a) {
e[a] = e[a] || {}, e[a][r._key || P] = t
})), delete r.listeners, e
}), {}), {
labels: l,
listeners: a
})
}(v, a),
p = r.meta.data || [],
g = e.ctx;
for (g.save(), o = 0, i = p.length; o < i; ++o)
if ((d = p[o]).$datalabels = [], y && d && e.getDataVisibility(o) && !d.skip)
for (n = 0, l = b.labels.length; n < l; ++n) u = (s = b.labels[n])._key, (c = new _(s, g, d, o)).$groups = {
_set: h,
_key: u || P
}, c.$context = {
active: !1,
chart: e,
dataIndex: o,
dataset: v,
datasetIndex: h
}, c.update(c.$context), d.$datalabels.push(c), x.push(c);
g.restore(), t.merge(f._listeners, b.listeners, {
merger: function (t, e, a) {
e[t] = e[t] || {}, e[t][r.index] = a[t], f._listened = !0
}
})
},
afterUpdate: function (t, e) {
t.$datalabels._labels = C.prepare(t.$datalabels._datasets, e)
},
afterDatasetsDraw: function (t) {
C.draw(t, t.$datalabels._labels)
},
beforeEvent: function (t, e) {
if (t.$datalabels._listened) {
var r = e.event;
switch (r.type) {
case "mousemove":
case "mouseout":
I(t, r);
break;
case "click":
! function (t, e) {
var r = t.$datalabels,
a = r._listeners.click,
o = a && C.lookup(r._labels, e);
o && S(t, a, o)
}(t, r)
}
}
},
afterEvent: function (t) {
var e, r, a, o, n, l, s, u = t.$datalabels,
d = u._actives,
c = u._actives = t.getActiveElements(),
h = i(d, c);
for (e = 0, r = h.length; e < r; ++e)
if ((n = h[e])[1])
for (a = 0, o = (s = n[0].element.$datalabels || []).length; a < o; ++a)(l = s[a]).$context.active = 1 === n[1], l.update(l.$context);
(u._dirty || h.length) && (C.update(u._labels), t.render()), delete u._dirty
}
}
}));