Add File
This commit is contained in:
108
frontend/src/views/chat/component/ChartComponent.vue
Normal file
108
frontend/src/views/chat/component/ChartComponent.vue
Normal file
@@ -0,0 +1,108 @@
|
||||
<script setup lang="ts">
|
||||
import { computed, nextTick, onMounted, onUnmounted } from 'vue'
|
||||
import { getChartInstance } from '@/views/chat/component/index.ts'
|
||||
import type { BaseChart, ChartAxis, ChartData } from '@/views/chat/component/BaseChart.ts'
|
||||
import { useEmitt } from '@/utils/useEmitt.ts'
|
||||
|
||||
const params = withDefaults(
|
||||
defineProps<{
|
||||
id: string | number
|
||||
type: string
|
||||
data?: Array<ChartData>
|
||||
columns?: Array<ChartAxis>
|
||||
x?: Array<ChartAxis>
|
||||
y?: Array<ChartAxis>
|
||||
series?: Array<ChartAxis>
|
||||
}>(),
|
||||
{
|
||||
data: () => [],
|
||||
columns: () => [],
|
||||
x: () => [],
|
||||
y: () => [],
|
||||
series: () => [],
|
||||
}
|
||||
)
|
||||
|
||||
const chartId = computed(() => {
|
||||
return 'chart-component-' + params.id
|
||||
})
|
||||
|
||||
const axis = computed(() => {
|
||||
const _list: Array<ChartAxis> = []
|
||||
params.columns.forEach((column) => {
|
||||
_list.push({ name: column.name, value: column.value })
|
||||
})
|
||||
params.x.forEach((column) => {
|
||||
_list.push({ name: column.name, value: column.value, type: 'x' })
|
||||
})
|
||||
params.y.forEach((column) => {
|
||||
_list.push({ name: column.name, value: column.value, type: 'y' })
|
||||
})
|
||||
params.series.forEach((column) => {
|
||||
_list.push({ name: column.name, value: column.value, type: 'series' })
|
||||
})
|
||||
return _list
|
||||
})
|
||||
|
||||
let chartInstance: BaseChart | undefined
|
||||
|
||||
function renderChart() {
|
||||
chartInstance = getChartInstance(params.type, chartId.value)
|
||||
if (chartInstance) {
|
||||
chartInstance.init(axis.value, params.data)
|
||||
chartInstance.render()
|
||||
}
|
||||
console.debug(chartInstance)
|
||||
}
|
||||
|
||||
function destroyChart() {
|
||||
if (chartInstance) {
|
||||
chartInstance.destroy()
|
||||
chartInstance = undefined
|
||||
}
|
||||
}
|
||||
|
||||
function getExcelData() {
|
||||
return {
|
||||
axis: axis.value,
|
||||
data: params.data,
|
||||
}
|
||||
}
|
||||
|
||||
useEmitt({
|
||||
name: 'view-render-all',
|
||||
callback: renderChart,
|
||||
})
|
||||
|
||||
useEmitt({
|
||||
name: `view-render-${params.id}`,
|
||||
callback: renderChart,
|
||||
})
|
||||
|
||||
defineExpose({
|
||||
renderChart,
|
||||
destroyChart,
|
||||
getExcelData,
|
||||
})
|
||||
|
||||
onMounted(() => {
|
||||
nextTick(() => {
|
||||
renderChart()
|
||||
})
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
destroyChart()
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div :id="chartId" class="chart-container"></div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.chart-container {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user