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