2023-03-28 00:48:55 +02:00
|
|
|
<line-graph>
|
|
|
|
|
2023-03-28 16:17:29 +02:00
|
|
|
<div style="height: inherit; width: inherit;">
|
2023-03-28 00:48:55 +02:00
|
|
|
<canvas style="height: 100%; width: 100%;">
|
|
|
|
</canvas>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
export default {
|
|
|
|
|
|
|
|
updateCanvas() {
|
|
|
|
let canvas = this.$("canvas")
|
2023-03-28 16:52:53 +02:00
|
|
|
canvas.width = canvas.clientWidth
|
|
|
|
canvas.height = canvas.clientHeight
|
|
|
|
|
2023-03-28 00:48:55 +02:00
|
|
|
let cx = canvas.getContext("2d")
|
|
|
|
cx.textBaseline = "middle"
|
|
|
|
cx.textAlign = "center"
|
|
|
|
|
|
|
|
let width = canvas.width
|
|
|
|
let height = canvas.height
|
2023-03-28 16:52:53 +02:00
|
|
|
let spacing = 1
|
2023-03-28 00:48:55 +02:00
|
|
|
|
|
|
|
let data = this.state.data
|
2023-03-28 16:52:53 +02:00
|
|
|
let colors = [
|
|
|
|
"#003F5C",
|
|
|
|
"#2F4B7C",
|
|
|
|
"#665191",
|
|
|
|
"#A05195",
|
|
|
|
"#D45087"
|
|
|
|
]
|
2023-03-28 00:48:55 +02:00
|
|
|
|
|
|
|
cx.clearRect(0, 0, width, height)
|
2023-03-28 16:52:53 +02:00
|
|
|
cx.resetTransform()
|
2023-03-28 00:48:55 +02:00
|
|
|
if (!data) return;
|
|
|
|
|
2023-03-28 16:17:29 +02:00
|
|
|
cx.fillStyle = "#707070"
|
|
|
|
cx.font = "15px Arial"
|
|
|
|
cx.fillText("This is an example title", width / 2, 10)
|
|
|
|
cx.font = "10px Arial"
|
|
|
|
cx.translate(0, 20)
|
|
|
|
|
2023-03-28 00:48:55 +02:00
|
|
|
let total = data.reduce((total, current) => total + current.value, 0)
|
|
|
|
|
|
|
|
let curr = 0
|
|
|
|
let counter = 0
|
2023-03-28 16:17:29 +02:00
|
|
|
let legendWidth = 0
|
2023-03-28 00:48:55 +02:00
|
|
|
for (let field of data) {
|
|
|
|
let start = curr + spacing
|
|
|
|
let barWidth = field.value / total * width - spacing * 2
|
|
|
|
let text = `${Math.round(field.value / total * 1000) / 10}% (${field.name})`
|
|
|
|
|
2023-03-28 16:52:53 +02:00
|
|
|
cx.fillStyle = colors[counter]
|
2023-03-28 00:48:55 +02:00
|
|
|
cx.fillRect(start, 0, barWidth, height / 3)
|
|
|
|
|
|
|
|
cx.fillStyle = "#FFFFFF"
|
|
|
|
if (cx.measureText(text).width < barWidth) {
|
|
|
|
cx.fillText(text, start + barWidth / 2, height / 6)
|
|
|
|
} else if (cx.measureText("...").width < barWidth) {
|
|
|
|
cx.fillText("...", start + barWidth / 2, height / 6)
|
|
|
|
}
|
|
|
|
|
|
|
|
curr += field.value / total * width
|
|
|
|
counter++
|
2023-03-28 16:17:29 +02:00
|
|
|
|
|
|
|
legendWidth += cx.measureText(field.name).width + 25 + 15 // += textWidth + squareWidth + margin
|
|
|
|
}
|
|
|
|
|
|
|
|
cx.textAlign = "left"
|
|
|
|
legendWidth -= 15 //On enlève la dernière marge
|
|
|
|
cx.translate(width / 2 - legendWidth / 2, height / 4 + 20)
|
|
|
|
|
|
|
|
counter = 0
|
|
|
|
for (let field of data) {
|
2023-03-28 16:52:53 +02:00
|
|
|
cx.fillStyle = colors[counter]
|
2023-03-28 16:17:29 +02:00
|
|
|
cx.fillRect(0, 0, 25, 25)
|
|
|
|
cx.fillStyle = "#707070"
|
|
|
|
cx.fillText(field.name, 30, 12.5)
|
|
|
|
cx.translate(cx.measureText(field.name).width + 25 + 15, 0)
|
|
|
|
counter++
|
2023-03-28 00:48:55 +02:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2023-03-28 16:52:53 +02:00
|
|
|
state: {
|
|
|
|
data: [],
|
|
|
|
title: "Example"
|
|
|
|
},
|
2023-03-28 00:48:55 +02:00
|
|
|
|
2023-03-28 16:52:53 +02:00
|
|
|
onMounted() {
|
2023-03-28 00:48:55 +02:00
|
|
|
let canvas = this.$("canvas")
|
|
|
|
this.updateCanvas()
|
2023-03-28 16:17:29 +02:00
|
|
|
new ResizeObserver(this.updateCanvas).observe(canvas)
|
|
|
|
},
|
|
|
|
|
|
|
|
onUpdated(props, state) {
|
|
|
|
this.updateCanvas()
|
2023-03-28 00:48:55 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
</line-graph>
|