mirror of
https://gh-proxy.org/https://github.com/klinsmaya/SQLBot.git
synced 2026-11-09 01:36:57 +08:00
106 lines
2.3 KiB
Vue
106 lines
2.3 KiB
Vue
<script setup lang="ts">
|
|
import ChartComponent from '@/views/chat/component/ChartComponent.vue'
|
|
import type { ChatMessage } from '@/api/chat.ts'
|
|
import { computed, nextTick, ref } from 'vue'
|
|
import type { ChartTypes } from '@/views/chat/component/BaseChart.ts'
|
|
|
|
const props = defineProps<{
|
|
id?: number | string
|
|
chartType: ChartTypes
|
|
message: ChatMessage
|
|
data: Array<{ [key: string]: any }>
|
|
}>()
|
|
|
|
const chartObject = computed<{
|
|
type: ChartTypes
|
|
title: string
|
|
axis: {
|
|
x: { name: string; value: string }
|
|
y: { name: string; value: string }
|
|
series: { name: string; value: string }
|
|
}
|
|
columns: Array<{ name: string; value: string }>
|
|
}>(() => {
|
|
if (props.message?.record?.chart) {
|
|
return JSON.parse(props.message.record.chart)
|
|
}
|
|
return {}
|
|
})
|
|
|
|
const xAxis = computed(() => {
|
|
if (chartObject.value?.axis?.x) {
|
|
return [chartObject.value.axis.x]
|
|
}
|
|
return []
|
|
})
|
|
const yAxis = computed(() => {
|
|
if (chartObject.value?.axis?.y) {
|
|
return [chartObject.value.axis.y]
|
|
}
|
|
return []
|
|
})
|
|
const series = computed(() => {
|
|
if (chartObject.value?.axis?.series) {
|
|
return [chartObject.value.axis.series]
|
|
}
|
|
return []
|
|
})
|
|
|
|
const chartRef = ref()
|
|
|
|
function onTypeChange() {
|
|
nextTick(() => {
|
|
chartRef.value?.destroyChart()
|
|
chartRef.value?.renderChart()
|
|
})
|
|
}
|
|
function getViewInfo() {
|
|
return {
|
|
chart: {
|
|
columns: chartObject.value?.columns,
|
|
type: props.chartType,
|
|
xAxis: xAxis.value,
|
|
yAxis: yAxis.value,
|
|
series: series.value,
|
|
title: chartObject.value.title,
|
|
},
|
|
data: { data: props.data },
|
|
}
|
|
}
|
|
function getExcelData() {
|
|
return chartRef.value?.getExcelData()
|
|
}
|
|
|
|
defineExpose({
|
|
onTypeChange,
|
|
getViewInfo,
|
|
getExcelData,
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div v-if="message.record?.chart" class="chart-base-container">
|
|
<ChartComponent
|
|
v-if="message.record.id && data?.length > 0"
|
|
:id="id ?? 'default_chat_id'"
|
|
ref="chartRef"
|
|
:type="chartType"
|
|
:columns="chartObject?.columns"
|
|
:x="xAxis"
|
|
:y="yAxis"
|
|
:series="series"
|
|
:data="data"
|
|
/>
|
|
<el-empty v-else description="No Data" />
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped lang="less">
|
|
.chart-base-container {
|
|
height: 100%;
|
|
width: 100%;
|
|
border-radius: 12px;
|
|
background: rgba(224, 224, 226, 0.29);
|
|
}
|
|
</style>
|