25
25
<span>{{ t('by') }}</span>
26
26
<UiUserLink :username="user" />
27
27
</div>
28
- <span v-tooltip class="text-ellipsis">{{ taskElapsedMessage }}</span>
29
- <span v-if="task.progress && !taskIsComplete" v-tooltip class="text-ellipsis"
30
- >{{ t('task.estimated-end-in', { time: remainingTime }) }}
31
- </span>
28
+ <span>{{ taskElapsedMessage }}</span>
32
29
</div>
33
30
<div class="progress-circle-bar">
34
31
<UiCircleProgressBar
@@ -54,7 +51,8 @@ import UiUserLink from '@core/components/ui/user-link/UiUserLink.vue'
54
51
import { vTooltip } from '@core/directives/tooltip.directive'
55
52
import type { Message, Task } from '@core/types/task.type.ts'
56
53
import { faCircleNotch } from '@fortawesome/free-solid-svg-icons'
57
- import { computed, ref } from 'vue'
54
+ import { useTimeAgo } from '@vueuse/core'
55
+ import { computed } from 'vue'
58
56
import { useI18n } from 'vue-i18n'
59
57
60
58
const { task, user } = defineProps<{
@@ -63,7 +61,45 @@ const { task, user } = defineProps<{
63
61
}>()
64
62
65
63
const { t } = useI18n()
66
- const now = ref(new Date())
64
+
65
+ const taskTimeStatus = computed(() => task.end ?? task.start ?? new Date())
66
+
67
+ const timeAgo = useTimeAgo(taskTimeStatus, {
68
+ fullDateFormatter: (date: Date) => date.toLocaleDateString(),
69
+ messages: {
70
+ justNow: t('just-now'),
71
+ past: n => (n.match(/\d/) ? t('ago', [n]) : n),
72
+ future: n => (n.match(/\d/) ? t('in', [n]) : n),
73
+ month: (n, past) =>
74
+ n === 1 ? (past ? t('last-month') : t('next-month')) : `${n} ${t(`month${n > 1 ? 's' : ''}`)}`,
75
+ year: (n, past) => (n === 1 ? (past ? t('last-year') : t('next-year')) : `${n} ${t(`year${n > 1 ? 's' : ''}`)}`),
76
+ day: (n, past) => (n === 1 ? (past ? t('yesterday') : t('tomorrow')) : `${n} ${t(`day${n > 1 ? 's' : ''}`)}`),
77
+ week: (n, past) => (n === 1 ? (past ? t('last-week') : t('next-week')) : `${n} ${t(`week${n > 1 ? 's' : ''}`)}`),
78
+ hour: n => `${n} ${t(`hour${n > 1 ? 's' : ''}`)}`,
79
+ minute: n => `${n} ${t(`minute${n > 1 ? 's' : ''}`)}`,
80
+ second: n => `${n} ${t(`second${n > 1 ? 's' : ''}`)}`,
81
+ },
82
+ })
83
+
84
+ const taskIsComplete = computed(() => {
85
+ if (!task.end || !task.start) {
86
+ return
87
+ }
88
+
89
+ return task.end >= task.start || task.progress === 100
90
+ })
91
+
92
+ const taskElapsedMessage = computed(() => {
93
+ if (!task.start && !task.end) {
94
+ return ''
95
+ }
96
+
97
+ if (taskIsComplete.value) {
98
+ return `${t('task.finished')} ${timeAgo.value}`
99
+ } else {
100
+ return `${t('task.started')} ${timeAgo.value}`
101
+ }
102
+ })
67
103
68
104
const countSubtasks = (task: Task): number => {
69
105
if (!task.subtasks || task.subtasks.length === 0) {
@@ -83,14 +119,6 @@ const circleProgress = computed(() => {
83
119
}
84
120
})
85
121
86
- const taskIsComplete = computed(() => {
87
- if (!task.end || !task.start) {
88
- return
89
- }
90
-
91
- return task.end >= task.start || task.progress === 100
92
- })
93
-
94
122
const getEffectiveStatus = computed<CircleProgressBarAccent>(() => {
95
123
const evaluate = (task: Task) => {
96
124
const subtasks = task.subtasks || []
@@ -168,52 +196,6 @@ const generateMessages = (task: Task) => {
168
196
]
169
197
}
170
198
const messageTypes = computed(() => generateMessages(task))
171
-
172
- const formatElapsed = (timestamp: number) => {
173
- const diff = now.value.getTime() - timestamp
174
- if (diff < 0) {
175
- return '0m'
176
- }
177
-
178
- const minutes = Math.floor(diff / 60000) % 60
179
- const hours = Math.floor(diff / 3600000)
180
-
181
- return hours > 0 ? `${hours}h${minutes}m` : `${minutes}m`
182
- }
183
-
184
- const startElapsedTime = computed(() => (task.start ? formatElapsed(task.start) : undefined))
185
-
186
- const endElapsedTime = computed(() => (task.end ? formatElapsed(task.end) : undefined))
187
-
188
- const taskElapsedMessage = computed(() => {
189
- if (!task.start && !task.end) {
190
- return ''
191
- }
192
-
193
- if (taskIsComplete.value) {
194
- return t('task.finished-ago', { time: endElapsedTime.value })
195
- } else {
196
- return t('task.started-ago', { time: startElapsedTime.value })
197
- }
198
- })
199
-
200
- const remainingTime = computed(() => {
201
- if (!task.start || !task.progress) {
202
- return
203
- }
204
-
205
- const now = Date.now()
206
- const elapsed = now - task.start
207
-
208
- const total = elapsed / (task.progress / 100)
209
- const remaining = total - elapsed
210
-
211
- const minutes = Math.floor(remaining / 60000)
212
- const hours = Math.floor(minutes / 60)
213
- const mins = minutes % 60
214
-
215
- return hours > 0 ? `${hours}h ${mins}m` : `${mins}m`
216
- })
217
199
</script>
218
200
219
201
<style scoped lang="postcss">
0 commit comments