TaskListPanel.vue 1.97 KB
<template>
	<div class="left-div">
		<div class="task-tabs-wrap">
			<el-tabs v-model="activeName" type="card" @tab-click="handleTaskFilterClick">
				<el-tab-pane label="全部" name="1">全部</el-tab-pane>
				<el-tab-pane label="正常" name="2">正常</el-tab-pane>
				<el-tab-pane label="超时" name="3">超时</el-tab-pane>
				<el-tab-pane label="异常" name="4">异常</el-tab-pane>
			</el-tabs>
		</div>
		<div class="device-card" v-for="(item, index) in taskList" :key="item.taskId || index" :class="{ active: activeDevice === index }" @click="$emit('select', index, item)">
			<div class="device-title">
				<span :class="getState(item.taskStatusColor)"></span>
				<span class="container-code-text">{{ item.containerCode }}</span>
				<div :class="['status-tag', getStateClass(item.taskStatusColor)]">{{ item.taskStatusDescription }}</div>
			</div>
			<div class="device-info">
				任务ID: {{ item.taskId }}<br />
				任务类型: {{ item.taskTypeDescription }}<br />
				任务持续时间: {{ item.taskDurationSecondsFormat }}
			</div>
		</div>
	</div>
</template>

<script>
export default {
	name: 'TaskListPanel',
	props: {
		// 当前任务列表数据,由父组件负责请求和刷新。
		taskList: {
			type: Array,
			default: () => [],
		},
		// 当前选中任务下标,用于高亮左侧任务卡片。
		activeDevice: {
			type: Number,
			default: null,
		},
	},
	data() {
		return {
			activeName: '1',
		}
	},
	methods: {
		// 切换任务筛选条件时通知父组件刷新左侧任务列表。
		handleTaskFilterClick(tab) {
			this.$emit('filter-change', tab.name)
		},
		getState(state) {
			const classMap = {
				green: 'device-status-running',
				orange: 'device-status-idle',
				red: 'device-status-error',
			}
			return classMap[state] || 'status-offline'
		},
		getStateClass(state) {
			const classMap = {
				green: 'status-running',
				orange: 'status-idle',
				red: 'status-error',
			}
			return classMap[state] || 'status-offline'
		},
	},
}
</script>