From 1519870c0e18171ced014a840e86a459dc6b00f1 Mon Sep 17 00:00:00 2001 From: yangfeng <wanwan926_4@163.com> Date: 星期二, 12 十二月 2023 17:26:06 +0800 Subject: [PATCH] 报工记录列表增加人员姓名 --- src/views/dashboard/components/TaskStep.vue | 58 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/views/dashboard/components/TaskStep.vue b/src/views/dashboard/components/TaskStep.vue index b9f02b6..8db65b7 100644 --- a/src/views/dashboard/components/TaskStep.vue +++ b/src/views/dashboard/components/TaskStep.vue @@ -1,20 +1,31 @@ <template> - <div class="task-step"> - <div v-for="(item, index) in props.steps" :key="index" class="task-step-item" :style="{ 'flex-basis': flexBasis }"> - <el-icon v-if="index + 1 < active" class="icon" size="22" color="#01f304"><CircleCheck /></el-icon> + <el-scrollbar ref="scrollerRef" always> + <div class="task-step"> + <div + v-for="(item, index) in props.steps" + :key="index" + ref="activeItemRef" + class="task-step-item" + :style="{ 'flex-basis': flexBasis }" + > + <el-icon v-if="index < active" class="icon" size="22" color="#01f304"><CircleCheck /></el-icon> - <el-icon v-if="index + 1 === active" class="icon" size="22" color="#c25915"><Clock /></el-icon> - <el-icon v-if="index + 1 > active" class="icon" size="22" color="#7d7f83"><Clock /></el-icon> - <span class="text" :class="{ green: index + 1 < active, red: index + 1 === active, gray: index + 1 > active }"> - {{ item }} - </span> - <span class="line"></span> + <el-icon v-if="index === active" class="icon" size="22" color="#c25915"> + <Clock /> + </el-icon> + <el-icon v-if="index > active" class="icon" size="22" color="#7d7f83"><Clock /></el-icon> + <span class="text" :class="{ green: index < active, red: index === active, gray: index > active }"> + {{ item }} + </span> + <span class="line"></span> + </div> </div> - </div> + </el-scrollbar> </template> <script setup lang="ts"> import { CircleCheck, Clock } from '@element-plus/icons-vue' -import { computed } from 'vue' +import { computed, onMounted, ref, watch } from 'vue' +import { ElIcon, ElScrollbar } from 'element-plus' export interface TaskStepProps { active: number @@ -24,20 +35,41 @@ const flexBasis = computed(() => { if (props.steps.length) { - return `${Math.floor((1 / props.steps.length) * 100)}%` + const percentage = Math.floor((1 / props.steps.length) * 100) + + return `${percentage > 20 ? percentage : 20}%` } return '0' +}) + +const activeItemRef = ref<HTMLDivElement[]>() +const scrollerRef = ref<typeof ElScrollbar>() + +onMounted(() => { + watch( + () => [props.steps, activeItemRef.value, scrollerRef.value], + () => { + if (props.steps.length > 0 && activeItemRef.value?.length && scrollerRef?.value) { + const left = props.active >= 0 ? activeItemRef.value[props.active]?.offsetLeft ?? 20 : 20 + requestAnimationFrame(() => { + scrollerRef?.value?.setScrollLeft?.(left - 20) + }) + } + } + ) }) </script> <style scoped lang="scss"> .task-step { display: flex; align-items: center; + width: 100%; } .task-step-item { display: flex; align-items: center; - flex: 1; + flex-grow: 1; + flex-shrink: 0; &:last-child { flex-basis: auto !important; flex-shrink: 0; -- Gitblit v1.8.0