From 18eb4308e941a265daba8eda2f2ee91115963a3c Mon Sep 17 00:00:00 2001
From: haoxuan <haoxuan>
Date: 星期四, 18 四月 2024 17:06:04 +0800
Subject: [PATCH] 1
---
src/views/dashboard/components/TaskStep.vue | 60 +++++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 47 insertions(+), 13 deletions(-)
diff --git a/src/views/dashboard/components/TaskStep.vue b/src/views/dashboard/components/TaskStep.vue
index b9f02b6..ffaecc8 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" 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" color="#c25915">
+ <Clock />
+ </el-icon>
+ <el-icon v-if="index > active" class="icon" 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;
@@ -48,6 +80,7 @@
}
.icon {
margin-right: 6px;
+ font-size: 22px;
}
.green {
color: #01f304;
@@ -61,6 +94,7 @@
}
.text {
flex-shrink: 0;
+ font-size: 14px;
}
.line {
display: inline-block;
--
Gitblit v1.8.0