Private
Public Access
1
0
Files
u-desk/web/src/views/db-cli/composables/useResultState.ts

113 lines
2.5 KiB
TypeScript

import { ref } from 'vue'
interface ResultStats {
rowsAffected: number
executionTime: number
}
interface Column {
title: string
dataIndex: string
width: number
tooltip?: boolean
}
/**
* 结果状态管理 Composable
*/
export function useResultState() {
const resultLoading = ref(false)
const resultError = ref('')
const resultData = ref<unknown>(null)
const resultMode = ref<'table' | 'json'>('table')
const resultStats = ref<ResultStats | null>(null)
const resultColumns = ref<Column[]>([])
const buildColumn = (key: string): Column => ({
title: key,
dataIndex: key,
width: 120,
tooltip: true
})
const clearResults = () => {
resultData.value = null
resultError.value = ''
resultStats.value = null
resultColumns.value = []
}
const setQueryResult = (data: unknown[], stats: ResultStats, columns?: string[]) => {
const dataArray = data ?? []
resultData.value = dataArray
resultMode.value = 'table'
resultStats.value = stats
if (columns?.length) {
resultColumns.value = columns.map(buildColumn)
} else if (dataArray.length) {
resultColumns.value = Object.keys(dataArray[0] as Record<string, any>).map(buildColumn)
} else {
resultColumns.value = []
}
}
const setUpdateResult = (stats: ResultStats) => {
resultData.value = null
resultMode.value = 'table'
resultStats.value = stats
resultColumns.value = []
}
const setCommandResult = (data: unknown, stats: ResultStats) => {
resultData.value = data
resultMode.value = 'json'
resultStats.value = stats
resultColumns.value = []
}
const setError = (error: string) => {
resultError.value = error
resultData.value = null
resultStats.value = null
resultColumns.value = []
}
// 开始加载(清空数据,用于新查询)
const startLoading = () => {
resultLoading.value = true
resultError.value = ''
resultData.value = null
resultStats.value = null
resultColumns.value = []
}
// 开始加载但保留数据(用于翻页,避免闪烁)
const startLoadingKeepData = () => {
resultLoading.value = true
resultError.value = ''
}
const stopLoading = () => {
resultLoading.value = false
}
return {
resultLoading,
resultError,
resultData,
resultMode,
resultStats,
resultColumns,
clearResults,
setQueryResult,
setUpdateResult,
setCommandResult,
setError,
startLoading,
startLoadingKeepData,
stopLoading
}
}