<script lang="ts"> | |
import type { Chart, LegendItem } from "chart.js"; | |
export let chart: Chart; | |
export let items: LegendItem[]; | |
const handlerFactory = (item: LegendItem) => { | |
return (_: Event) => { | |
if (item.datasetIndex !== undefined) { | |
// https://www.chartjs.org/docs/latest/samples/legend/html.html | |
chart.setDatasetVisibility( | |
item.datasetIndex, | |
!chart.isDatasetVisible(item.datasetIndex) | |
); | |
chart.update(); | |
} | |
}; | |
}; | |
</script> | |
<div class="legend"> | |
<h6>Legend</h6> | |
{#each items as item (item)} | |
<div | |
class="item" | |
on:dblclick={handlerFactory(item)} | |
aria-label="legend" | |
role="listitem" | |
> | |
<span | |
class="box" | |
style="background: {item.fillStyle}; border-color: {item.strokeStyle}; border-width: {item.lineWidth}px;" | |
></span> | |
<span | |
class="label" | |
style="text-decoration: {item.hidden ? 'line-through' : ''};" | |
> | |
{item.text} | |
</span> | |
</div> | |
{/each} | |
</div> | |
<style> | |
.legend { | |
padding: 4px; | |
display: flex; | |
flex-direction: column; | |
row-gap: 3px; | |
} | |
.item { | |
display: flex; | |
flex-direction: row; | |
column-gap: 10px; | |
align-items: center; | |
} | |
.item .box { | |
display: inline-block; | |
width: 20px; | |
height: 20px; | |
} | |
</style> |