Add File
This commit is contained in:
108
frontend/src/views/chat/component/DisplayChartBlock.vue
Normal file
108
frontend/src/views/chat/component/DisplayChartBlock.vue
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
<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'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
id?: number | string
|
||||||
|
chartType: ChartTypes
|
||||||
|
message: ChatMessage
|
||||||
|
data: Array<{ [key: string]: any }>
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
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="t('chat.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>
|
||||||
Reference in New Issue
Block a user