Liuunicorn 286bcc5576
修复点击无数据源组件后,再切换成有数据源的组件时,无法操作数据内容问题
Signed-off-by: Liuunicorn <8532757+Liuunicorn@user.noreply.gitee.com>
2024-09-19 07:16:11 +00:00

211 lines
6.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<n-timeline class="go-chart-configurations-timeline">
<n-timeline-item v-show="isCharts && dimensionsAndSource" type="info" :title="TimelineTitleEnum.MAPPING">
<n-table striped>
<thead>
<tr>
<th v-for="item in tableTitle" :key="item">{{ item }}</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in dimensionsAndSource" :key="index">
<td>{{ item.field }}</td>
<td>{{ item.mapping }}</td>
<td>
<n-space v-if="item.result === 0">
<n-badge dot type="success"></n-badge>
<n-text>无</n-text>
</n-space>
<n-space v-else>
<n-badge dot :type="item.result === 1 ? 'success' : 'error'"></n-badge>
<n-text>匹配{{ item.result === 1 ? '成功' : '失败' }}</n-text>
</n-space>
</td>
</tr>
</tbody>
</n-table>
</n-timeline-item>
<n-timeline-item v-show="filterShow" color="#97846c" :title="TimelineTitleEnum.FILTER">
<n-space :size="18" vertical>
<n-text depth="3">过滤器默认处理接口返回值的「data」字段</n-text>
<chart-data-monaco-editor></chart-data-monaco-editor>
</n-space>
</n-timeline-item>
<n-timeline-item type="success" :title="TimelineTitleEnum.CONTENT">
<n-space vertical>
<n-space class="source-btn-box">
<n-upload
v-model:file-list="uploadFileListRef"
:show-file-list="false"
:customRequest="customRequest"
@before-upload="beforeUpload"
>
<n-space>
<n-button v-if="!ajax" class="sourceBtn-item" :disabled="noData">
<template #icon>
<n-icon>
<document-add-icon />
</n-icon>
</template>
导入json / txt
</n-button>
</n-space>
</n-upload>
<div>
<n-button class="sourceBtn-item" :disabled="noData" @click="download">
<template #icon>
<n-icon>
<document-download-icon />
</n-icon>
</template>
下载
</n-button>
<n-tooltip trigger="hover">
<template #trigger>
<n-icon class="go-ml-1" size="21" :depth="3">
<help-outline-icon></help-outline-icon>
</n-icon>
</template>
<n-text depth="3">点击下载查看完整数据</n-text>
</n-tooltip>
</div>
</n-space>
<n-card size="small">
<n-code :code="toString(source)" language="json"></n-code>
</n-card>
</n-space>
</n-timeline-item>
</n-timeline>
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue'
import { ChartFrameEnum } from '@/packages/index.d'
import { RequestDataTypeEnum } from '@/enums/httpEnum'
import { icon } from '@/plugins'
import { DataResultEnum, TimelineTitleEnum } from '../../index.d'
import { ChartDataMonacoEditor } from '../ChartDataMonacoEditor'
import { useFile } from '../../hooks/useFile.hooks'
import { useTargetData } from '../../../hooks/useTargetData.hook'
import isObject from 'lodash/isObject'
import { toString, isArray } from '@/utils'
const { targetData } = useTargetData()
const props = defineProps({
show: {
type: Boolean,
required: false
},
ajax: {
type: Boolean,
required: true
}
})
// 表格标题
const tableTitle = ['字段', '映射', '状态']
const { HelpOutlineIcon } = icon.ionicons5
const { DocumentAddIcon, DocumentDownloadIcon } = icon.carbon
const source = ref()
const dimensions = ref()
const dimensionsAndSource = ref()
const noData = ref(false)
const { uploadFileListRef, customRequest, beforeUpload, download } = useFile(targetData)
// 是否展示过滤器
const filterShow = computed(() => {
return targetData.value.request.requestDataType !== RequestDataTypeEnum.STATIC
})
// 是支持 dataset 的图表类型
const isCharts = computed(() => {
return targetData.value.chartConfig.chartFrame === ChartFrameEnum.ECHARTS
})
// 处理映射列表状态结果
const matchingHandle = (mapping: string) => {
let res = DataResultEnum.SUCCESS
for (let i = 0; i < source.value.length; i++) {
if (source.value[i][mapping] === undefined) {
res = DataResultEnum.FAILURE
return res
}
}
return DataResultEnum.SUCCESS
}
// 处理映射列表
const dimensionsAndSourceHandle = () => {
try {
// 去除首项数据轴标识
return dimensions.value.map((dimensionsItem: string, index: number) => {
return index === 0
? {
// 字段
field: '通用标识',
// 映射
mapping: dimensionsItem,
// 结果
result: DataResultEnum.NULL
}
: {
field: `数据项-${index}`,
mapping: dimensionsItem,
result: matchingHandle(dimensionsItem)
}
})
} catch (error) {
return []
}
}
watch(
() => targetData.value?.option?.dataset,
(
newData?: {
source: any
dimensions: any
} | null
) => {
noData.value = false
if (newData && targetData?.value?.chartConfig?.chartFrame === ChartFrameEnum.ECHARTS) {
// 只有 DataSet 数据才有对应的格式
source.value = newData
if (isCharts.value) {
dimensions.value = newData.dimensions
dimensionsAndSource.value = dimensionsAndSourceHandle()
}
} else if (newData !== undefined && newData !== null) {
dimensionsAndSource.value = null
source.value = newData
} else {
noData.value = true
source.value = '此组件无数据源'
}
if (isArray(newData)) {
dimensionsAndSource.value = null
}
},
{
immediate: true
}
)
</script>
<style lang="scss" scoped>
@include go('chart-configurations-timeline') {
@include deep() {
pre {
white-space: pre-wrap;
word-wrap: break-word;
}
}
.source-btn-box {
margin-top: 10px !important;
}
}
</style>