misskey-awawa/packages/frontend/src/components/MkChartLegend.vue

88 lines
1.8 KiB
Vue
Raw Normal View History

<!--
SPDX-FileCopyrightText: syuilo and other misskey contributors
SPDX-License-Identifier: AGPL-3.0-only
-->
2023-01-03 05:08:52 +00:00
<template>
<div :class="$style.root">
<button v-for="item in items" class="_button item" :class="{ disabled: item.hidden }" @click="onClick(item)">
<span class="box" :style="{ background: chart.config.type === 'line' ? item.strokeStyle?.toString() : item.fillStyle?.toString() }"></span>
{{ item.text }}
</button>
</div>
</template>
<script lang="ts" setup>
import { shallowRef } from 'vue';
2023-01-03 05:08:52 +00:00
import { Chart, LegendItem } from 'chart.js';
const props = defineProps({
});
const chart = shallowRef<Chart>();
const items = shallowRef<LegendItem[]>([]);
2023-01-03 05:08:52 +00:00
function update(_chart: Chart, _items: LegendItem[]) {
chart.value = _chart,
items.value = _items;
2023-01-03 05:08:52 +00:00
}
function onClick(item: LegendItem) {
if (chart.value == null) return;
const { type } = chart.value.config;
2023-01-03 05:08:52 +00:00
if (type === 'pie' || type === 'doughnut') {
// Pie and doughnut charts only have a single dataset and visibility is per item
chart.value.toggleDataVisibility(item.index);
2023-01-03 05:08:52 +00:00
} else {
chart.value.setDatasetVisibility(item.datasetIndex, !chart.value.isDatasetVisible(item.datasetIndex));
2023-01-03 05:08:52 +00:00
}
chart.value.update();
2023-01-03 05:08:52 +00:00
}
defineExpose({
update,
});
</script>
<style lang="scss" module>
.root {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 8px;
&:global {
> .item {
font-size: 85%;
padding: 4px 12px 4px 8px;
border: solid 1px var(--divider);
border-radius: 999px;
&:hover {
border-color: var(--inputBorderHover);
}
&.disabled {
text-decoration: line-through;
opacity: 0.5;
2023-01-03 05:08:52 +00:00
}
> .box {
display: inline-block;
width: 12px;
height: 12px;
border-radius: 100%;
vertical-align: -10%;
}
}
}
}
2023-01-06 11:19:27 +00:00
@container (max-width: 500px) {
.root {
font-size: 90%;
gap: 6px;
}
}
2023-01-03 05:08:52 +00:00
</style>