99 <div class =" task-center" >
1010 <div class =" task-toolbar" >
1111 <div class =" task-filter-group" >
12- <a-button-group >
13- <a-button
14- :type =" isActiveFilter('all') ? 'primary' : 'default'"
15- @click =" setFilter('all')"
16- >
17- 全部
18- <span class =" filter-count" >{{ totalCount }}</span >
19- </a-button >
20- <a-button
21- :type =" isActiveFilter('active') ? 'primary' : 'default'"
22- @click =" setFilter('active')"
23- >
24- 进行中
25- <span class =" filter-count" >{{ inProgressCount }}</span >
26- </a-button >
27- <a-button
28- :type =" isActiveFilter('success') ? 'primary' : 'default'"
29- @click =" setFilter('success')"
30- >
31- 已完成
32- <span class =" filter-count" >{{ completedCount }}</span >
33- </a-button >
34- <a-button
35- :type =" isActiveFilter('failed') ? 'primary' : 'default'"
36- @click =" setFilter('failed')"
37- >
38- 失败
39- <span class =" filter-count" >{{ failedCount }}</span >
40- </a-button >
41- </a-button-group >
12+ <a-segmented
13+ v-model:value =" statusFilter"
14+ :options =" taskFilterOptions"
15+ />
4216 </div >
4317 <div class =" task-toolbar-actions" >
4418 <a-button
@@ -135,7 +109,6 @@ import { computed, h, onBeforeUnmount, watch, ref } from 'vue'
135109import { Modal } from ' ant-design-vue'
136110import { useTaskerStore } from ' @/stores/tasker'
137111import { storeToRefs } from ' pinia'
138- import { ReloadOutlined } from ' @ant-design/icons-vue'
139112import { formatFullDateTime , formatRelative , parseToShanghai } from ' @/utils/time'
140113
141114const taskerStore = useTaskerStore ()
@@ -146,6 +119,48 @@ const tasks = computed(() => sortedTasks.value)
146119const loadingState = computed (() => Boolean (loading .value ))
147120const lastErrorState = computed (() => lastError .value )
148121const statusFilter = ref (' all' )
122+ const inProgressCount = computed (
123+ () => tasks .value .filter ((task ) => ACTIVE_CLASS_STATUSES .has (task .status )).length
124+ )
125+ const completedCount = computed (() => tasks .value .filter ((task ) => task .status === ' success' ).length )
126+ const failedCount = computed (
127+ () => tasks .value .filter ((task ) => FAILED_STATUSES .has (task .status )).length
128+ )
129+ const totalCount = computed (() => tasks .value .length )
130+ const taskFilterOptions = computed (() => [
131+ {
132+ label : () =>
133+ h (' span' , { class: ' task-filter-option' }, [
134+ ' 全部' ,
135+ h (' span' , { class: ' filter-count' }, totalCount .value )
136+ ]),
137+ value: ' all'
138+ },
139+ {
140+ label : () =>
141+ h (' span' , { class: ' task-filter-option' }, [
142+ ' 进行中' ,
143+ h (' span' , { class: ' filter-count' }, inProgressCount .value )
144+ ]),
145+ value: ' active'
146+ },
147+ {
148+ label : () =>
149+ h (' span' , { class: ' task-filter-option' }, [
150+ ' 已完成' ,
151+ h (' span' , { class: ' filter-count' }, completedCount .value )
152+ ]),
153+ value: ' success'
154+ },
155+ {
156+ label : () =>
157+ h (' span' , { class: ' task-filter-option' }, [
158+ ' 失败' ,
159+ h (' span' , { class: ' filter-count' }, failedCount .value )
160+ ]),
161+ value: ' failed'
162+ }
163+ ])
149164
150165const filteredTasks = computed (() => {
151166 const list = tasks .value
@@ -321,22 +336,6 @@ function canCancel(task) {
321336 return [' pending' , ' running' , ' queued' ].includes (task .status ) && ! task .cancel_requested
322337}
323338
324- const inProgressCount = computed (
325- () => tasks .value .filter ((task ) => ACTIVE_CLASS_STATUSES .has (task .status )).length
326- )
327- const completedCount = computed (() => tasks .value .filter ((task ) => task .status === ' success' ).length )
328- const failedCount = computed (
329- () => tasks .value .filter ((task ) => FAILED_STATUSES .has (task .status )).length
330- )
331- const totalCount = computed (() => tasks .value .length )
332-
333- function setFilter (value ) {
334- statusFilter .value = value
335- }
336-
337- function isActiveFilter (value ) {
338- return statusFilter .value === value
339- }
340339 </script >
341340<style scoped lang="less">
342341.task-center {
@@ -365,13 +364,7 @@ function isActiveFilter(value) {
365364 gap : 4px ;
366365}
367366
368- .task-filter-group :deep(.ant-btn ) {
369- display : inline-flex ;
370- align-items : center ;
371- gap : 4px ;
372- }
373-
374- .filter-count {
367+ :deep(.filter-count ) {
375368 margin-left : 2px ;
376369 font-size : 12px ;
377370 color : #94a3b8 ;
0 commit comments