3👍
✅
You can add an extra check if it is an array, in which case you first only calculate the padding for the longest element so you dont have a big white space, after that you can calculate the Y starting position and increase it for each element in the array so you can have as many lines as you want
const customTitle = {
id: 'customTitle',
beforeLayout: (chart, args, opts) => {
const {
display,
font
} = opts;
if (!display) {
return;
}
const {
ctx
} = chart;
ctx.font = font || '12px "Helvetica Neue", Helvetica, Arial, sans-serif'
let width = 0;
if (Array.isArray(opts.text)) {
opts.text.forEach(e => {
const tmpWidth = ctx.measureText(e).width;
if (tmpWidth > width) {
width = tmpWidth;
}
});
} else {
width = ctx.measureText(opts.text).width;
}
chart.options.layout.padding.left = width * 1.1;
},
afterDraw: (chart, args, opts) => {
const {
font,
text,
color
} = opts;
const {
ctx,
chartArea: {
top,
bottom,
left,
right
}
} = chart;
if (opts.display) {
ctx.fillStyle = color || Chart.defaults.color
ctx.font = font || '12px "Helvetica Neue", Helvetica, Arial, sans-serif'
if (Array.isArray(text)) {
const height = ctx.measureText("M").width;
let y = ((top + bottom) / 2) - Math.ceil(text.length / 2) * height;
text.forEach(e => {
ctx.fillText(e, 3, y);
y += height + (opts.lineSpacing || 0);
});
} else {
ctx.fillText(text, 3, (top + bottom) / 2)
}
}
}
}
const labels = ['2021-06-07 00:00:00', '2021-06-08 00:00:00', '2021-06-09 00:00:00'];
const data = {
labels: labels,
datasets: [{
label: 'Fixed defects',
backgroundColor: 'rgb(0, 255, 0)',
borderColor: 'rgb(0, 255, 0)',
data: ['4', '10', '23'],
barThickness: 5
}, {
label: 'Open defects',
backgroundColor: 'rgb(255, 0, 0)',
borderColor: 'rgb(255, 0, 0)',
data: ['43', '7', '1'],
barThickness: 5
}]
};
const config = {
type: 'bar',
data: data,
options: {
scales: {
x: {
min: '2021-06-07 00:00:00',
max: '2021-09-10 00:00:00',
type: 'time',
time: {
unit: 'week'
},
stacked: true,
},
y: {
stacked: true,
}
},
plugins: {
customTitle: {
display: true,
text: ['Project1', 'Number of defects', 'Project2'],
lineSpacing: 8
}
}
},
plugins: [customTitle]
};
const myChart = new Chart(
document.getElementById('myChart'),
config
);
<!DOCTYPE html>
<meta charset="utf-8">
<script src="https://cdn.jsdelivr.net/npm/chart.js@^3"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@^2"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment@^1"></script>
<body>
<div>
<canvas height="100px" id="myChart"></canvas>
</div>
</body>
Source:stackexchange.com