11import { toString as CronToString } from 'cronstrue'
2- import { List } from 'lucide-react'
2+ import { CircleCheck , CircleX , List , Loader } from 'lucide-react'
33import Link from 'next/link'
44import { UIEvent , useCallback , useEffect , useMemo } from 'react'
55import DataGrid , { Column , Row } from 'react-data-grid'
@@ -12,7 +12,6 @@ import {
1212 useCronJobRunsInfiniteQuery ,
1313} from 'data/database-cron-jobs/database-cron-jobs-runs-infinite-query'
1414import {
15- Badge ,
1615 Button ,
1716 cn ,
1817 LoadingLine ,
@@ -66,9 +65,7 @@ const cronJobColumns = [
6665 id : 'status' ,
6766 name : 'Status' ,
6867 minWidth : 75 ,
69- value : ( row : CronJobRun ) => (
70- < Badge variant = { row . status === 'succeeded' ? 'success' : 'warning' } > { row . status } </ Badge >
71- ) ,
68+ value : ( row : CronJobRun ) => < StatusBadge status = { row . status } /> ,
7269 } ,
7370 {
7471 id : 'start_time' ,
@@ -80,15 +77,19 @@ const cronJobColumns = [
8077 id : 'end_time' ,
8178 name : 'End Time' ,
8279 minWidth : 120 ,
83- value : ( row : CronJobRun ) => < div className = "text-xs" > { formatDate ( row . end_time ) } </ div > ,
80+ value : ( row : CronJobRun ) => (
81+ < div className = "text-xs" > { row . status === 'succeeded' ? formatDate ( row . end_time ) : '-' } </ div >
82+ ) ,
8483 } ,
8584
8685 {
8786 id : 'duration' ,
8887 name : 'Duration' ,
8988 minWidth : 100 ,
9089 value : ( row : CronJobRun ) => (
91- < div className = "text-xs" > { calculateDuration ( row . start_time , row . end_time ) } </ div >
90+ < span className = "text-xs" >
91+ { row . status === 'succeeded' ? calculateDuration ( row . start_time , row . end_time ) : '' }
92+ </ span >
9293 ) ,
9394 } ,
9495]
@@ -291,3 +292,35 @@ export const PreviousRunsTab = () => {
291292 </ div >
292293 )
293294}
295+
296+ interface StatusBadgeProps {
297+ status : string
298+ }
299+
300+ function StatusBadge ( { status } : StatusBadgeProps ) {
301+ if ( status === 'succeeded' ) {
302+ return (
303+ < span className = "text-brand-600 flex items-center gap-1" >
304+ < CircleCheck size = { 14 } /> Succeeded
305+ </ span >
306+ )
307+ }
308+
309+ if ( status === 'failed' ) {
310+ return (
311+ < span className = "text-destructive flex items-center gap-1" >
312+ < CircleX size = { 14 } /> Failed
313+ </ span >
314+ )
315+ }
316+
317+ if ( [ 'running' , 'starting' , 'sending' , 'connecting' ] . includes ( status ) ) {
318+ return (
319+ < span className = "text-_secondary flex items-center gap-1" >
320+ < Loader size = { 14 } className = "animate-spin" /> Running
321+ </ span >
322+ )
323+ }
324+
325+ return null
326+ }
0 commit comments