Files
SPDM/src/views/task/projectList/components/projectCard.vue

85 lines
2.5 KiB
Vue
Raw Normal View History

2026-02-02 14:34:58 +08:00
<template>
<div class="project-card" @click="cardClickFun">
<el-dropdown class="options-dropdown" :teleported="false">
<div class="options-btn" @click.stop>
<el-icon :size="18"><MoreFilled /></el-icon>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-for="(action, aIndex) in actionList" :key="aIndex">
<el-link :type="action.type" @click.stop="actionClickFun(action)">
{{ action.title }}
</el-link>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<img class="gl-pointer-class cover-img" :src="coverImgMap[project.detailImgUrl ? 'custom' : (index % 2 !== 0 ? 'blue' : 'green')]" alt="" />
<div class="bottom-box">
<span class="gl-text-ellipsis gl-pointer-class" :title="project.nodeName">
{{ project.nodeName }}
</span>
<span :class="statusClassMap[project.exeStatus] || 'status car-info-status'">
{{ PROJECT_EXE_STATUS.O[project.exeStatus] || '未开始' }}
</span>
</div>
</div>
</template>
<script setup lang="ts">
import { computed } from 'vue';
import { MoreFilled } from '@element-plus/icons-vue';
import { useDict } from '@/utils/useDict';
import { PROJECT_EXE_STATUS_CODE } from '@/utils/enum/project';
2026-02-03 15:59:40 +08:00
import { FileUtil } from '@/utils/file';
2026-02-02 14:34:58 +08:00
import projectBlue from '@/assets/imgs/projectList/project-blue.png';
import projectGreen from '@/assets/imgs/projectList/project-green.png';
interface Props {
project: any;
index: number;
actionList: any[];
}
const props = withDefaults(defineProps<Props>(), {
project: () => ({}),
index: 0,
actionList: () => [],
});
const emit = defineEmits(['cardClick', 'actionClick']);
const { PROJECT_EXE_STATUS } = useDict('PROJECT_EXE_STATUS');
const coverImgMap = computed(() => ({
2026-02-03 15:59:40 +08:00
custom: FileUtil.getFilePreviewImgPathUrl(props.project.detailImgUrl),
2026-02-02 14:34:58 +08:00
blue: projectBlue,
green: projectGreen,
}));
const statusClassMap: Record<string, string> = {
[PROJECT_EXE_STATUS_CODE.COMPLETED]: 'status car-completed',
[PROJECT_EXE_STATUS_CODE.IN_PROGRESS]: 'status car-ing',
[PROJECT_EXE_STATUS_CODE.PAUSED]: 'status car-paused',
[PROJECT_EXE_STATUS_CODE.POSTPONED]: 'status car-postponed',
};
const cardClickFun = () => {
emit('cardClick', props.project);
};
const actionClickFun = (action: any) => {
emit('actionClick', props.project, action);
};
</script>
<style lang="scss" scoped>
2026-02-04 14:59:22 +08:00
@use './projectCard.scss';
2026-02-02 14:34:58 +08:00
.project-card {
@extend .project-card-base;
}
</style>