37 lines
1.8 KiB
Vue
37 lines
1.8 KiB
Vue
<script setup lang="ts">
|
||
import { computed } from 'vue'
|
||
import { Clock3 } from '@lucide/vue'
|
||
import { formatDate, nodeLabel } from '../../lib/format'
|
||
import { workflowCheckpoints } from './selectors'
|
||
import type { Checkpoint } from './types'
|
||
|
||
/** 时间线只说明 checkpoint 已保存,不把每条记录误标为工作流成功。 */
|
||
const props = defineProps<{ checkpoints: Checkpoint[]; workflow: string }>()
|
||
const history = computed(() => workflowCheckpoints(props.checkpoints, props.workflow).slice(-18).toReversed())
|
||
</script>
|
||
|
||
<template>
|
||
<aside class="history-panel">
|
||
<h3 class="mb-1 flex items-center gap-2 text-sm font-semibold"><Clock3 :size="15" />执行记录</h3>
|
||
<p class="mb-6 text-xs leading-5 text-muted">最近 18 个 checkpoint · 自动刷新</p>
|
||
<p v-if="!history.length" class="text-xs leading-6 text-muted">工作流尚未保存执行记录。</p>
|
||
<ol v-else class="timeline">
|
||
<li v-for="(item, index) in history" :key="item.checkpointId" :class="{ 'timeline-latest': index === 0 }">
|
||
<p class="text-xs font-medium">{{ nodeLabel(item.metadata?.nodeName) }}</p>
|
||
<p class="mt-1 text-[11px] text-muted">
|
||
{{ formatDate(item.createdAt)
|
||
}}<span v-if="item.metadata?.nodeDurationMs">
|
||
· {{ (item.metadata.nodeDurationMs / 1000).toFixed(1) }}s</span
|
||
>
|
||
</p>
|
||
<span v-if="item.state.workflowExecution?.status === 'failed'" class="mt-1 block text-xs text-danger"
|
||
>运行失败</span
|
||
>
|
||
</li>
|
||
</ol>
|
||
<p class="mt-5 border-t border-line pt-4 text-[11px] leading-5 text-muted">
|
||
记录在节点或批次结束后更新,长时间无新记录不一定意味着任务失败。
|
||
</p>
|
||
</aside>
|
||
</template>
|