1
1
import classNames from 'classnames' ;
2
- import moment from 'moment' ;
3
2
import React , { useEffect , useRef , useState } from 'react' ;
4
3
import { fromEvent , interval , Subscription } from 'rxjs' ;
5
4
@@ -19,9 +18,20 @@ interface WorkflowTimelineProps {
19
18
nodeClicked ?: ( node : models . NodeStatus ) => any ;
20
19
}
21
20
21
+ function dateDiff ( dateLikeA : string | number , dateLikeB : string | number ) : number {
22
+ return new Date ( dateLikeA ) . valueOf ( ) - new Date ( dateLikeB ) . valueOf ( ) ;
23
+ }
24
+
25
+ function hhMMFormat ( dateLike : string | number ) : string {
26
+ const date = new Date ( dateLike ) ;
27
+ // timeString format is '00:59:00 GMT-0500 (Eastern Standard Time)', hh:MM is '00:59'
28
+ const parts = date . toTimeString ( ) . split ( ':' ) ;
29
+ return parts [ 0 ] + ':' + parts [ 1 ] ;
30
+ }
31
+
22
32
export function WorkflowTimeline ( props : WorkflowTimelineProps ) {
23
33
const [ parentWidth , setParentWidth ] = useState ( 0 ) ;
24
- const [ now , setNow ] = useState ( moment ( ) ) ;
34
+ const [ now , setNow ] = useState ( new Date ( ) ) ;
25
35
26
36
const containerRef = useRef < HTMLDivElement > ( null ) ;
27
37
const resizeSubscription = useRef < Subscription > ( null ) ;
@@ -41,7 +51,7 @@ export function WorkflowTimeline(props: WorkflowTimelineProps) {
41
51
const isCompleted = props . workflow ?. status && COMPLETED_PHASES . includes ( props . workflow . status . phase ) ;
42
52
if ( ! refreshSubscription . current && ! isCompleted ) {
43
53
refreshSubscription . current = interval ( 1000 ) . subscribe ( ( ) => {
44
- setNow ( moment ( ) ) ;
54
+ setNow ( new Date ( ) ) ;
45
55
} ) ;
46
56
} else if ( refreshSubscription . current && isCompleted ) {
47
57
refreshSubscription . current . unsubscribe ( ) ;
@@ -62,15 +72,15 @@ export function WorkflowTimeline(props: WorkflowTimelineProps) {
62
72
const nodes = Object . keys ( props . workflow . status . nodes )
63
73
. map ( id => {
64
74
const node = props . workflow . status . nodes [ id ] ;
65
- node . finishedAt = node . finishedAt || now . format ( ) ;
66
- node . startedAt = node . startedAt || now . format ( ) ;
75
+ node . finishedAt = node . finishedAt || now . toISOString ( ) ;
76
+ node . startedAt = node . startedAt || now . toISOString ( ) ;
67
77
return node ;
68
78
} )
69
79
. filter ( node => node . startedAt && node . type === 'Pod' )
70
80
. sort ( ( first , second ) => {
71
- const diff = moment ( first . startedAt ) . diff ( second . startedAt ) ;
81
+ const diff = dateDiff ( first . startedAt , second . startedAt ) ;
72
82
if ( diff <= 2 ) {
73
- return moment ( first . finishedAt ) . diff ( second . finishedAt ) ;
83
+ return dateDiff ( first . finishedAt , second . finishedAt ) ;
74
84
}
75
85
return diff ;
76
86
} ) ;
@@ -79,30 +89,30 @@ export function WorkflowTimeline(props: WorkflowTimelineProps) {
79
89
return < div /> ;
80
90
}
81
91
82
- const timelineStart = moment ( nodes [ 0 ] . startedAt ) . valueOf ( ) ;
83
- const timelineEnd = nodes . map ( node => moment ( node . finishedAt ) . valueOf ( ) ) . reduce ( ( first , second ) => Math . max ( first , second ) , moment ( timelineStart ) . valueOf ( ) ) ;
92
+ const timelineStart = new Date ( nodes [ 0 ] . startedAt ) . valueOf ( ) ;
93
+ const timelineEnd = nodes . map ( node => new Date ( node . finishedAt ) . valueOf ( ) ) . reduce ( ( first , second ) => Math . max ( first , second ) , new Date ( timelineStart ) . valueOf ( ) ) ;
84
94
85
95
function timeToLeft ( time : number ) {
86
96
return ( ( time - timelineStart ) / ( timelineEnd - timelineStart ) ) * Math . max ( parentWidth , MIN_WIDTH ) + NODE_NAME_WIDTH ;
87
97
}
88
98
89
99
const groups = nodes . map ( node => ( {
90
- startedAt : moment ( node . startedAt ) . valueOf ( ) ,
91
- finishedAt : moment ( node . finishedAt ) . valueOf ( ) ,
100
+ startedAt : new Date ( node . startedAt ) . valueOf ( ) ,
101
+ finishedAt : new Date ( node . finishedAt ) . valueOf ( ) ,
92
102
nodes : [
93
103
Object . assign ( { } , node , {
94
- left : timeToLeft ( moment ( node . startedAt ) . valueOf ( ) ) ,
95
- width : timeToLeft ( moment ( node . finishedAt ) . valueOf ( ) ) - timeToLeft ( moment ( node . startedAt ) . valueOf ( ) )
104
+ left : timeToLeft ( new Date ( node . startedAt ) . valueOf ( ) ) ,
105
+ width : timeToLeft ( new Date ( node . finishedAt ) . valueOf ( ) ) - timeToLeft ( new Date ( node . startedAt ) . valueOf ( ) )
96
106
} )
97
107
]
98
108
} ) ) ;
99
109
100
110
for ( let i = groups . length - 1 ; i >= 1 ; i -- ) {
101
111
const cur = groups [ i ] ;
102
112
const next = groups [ i - 1 ] ;
103
- if ( moment ( cur . startedAt ) . diff ( next . finishedAt , 'milliseconds' ) < 0 && moment ( next . startedAt ) . diff ( cur . startedAt , 'milliseconds' ) < ROUND_START_DIFF_MS ) {
113
+ if ( dateDiff ( cur . startedAt , next . finishedAt ) < 0 && dateDiff ( next . startedAt , cur . startedAt ) < ROUND_START_DIFF_MS ) {
104
114
next . nodes = next . nodes . concat ( cur . nodes ) ;
105
- next . finishedAt = nodes . map ( node => moment ( node . finishedAt ) . valueOf ( ) ) . reduce ( ( first , second ) => Math . max ( first , second ) , next . finishedAt . valueOf ( ) ) ;
115
+ next . finishedAt = nodes . map ( node => new Date ( node . finishedAt ) . valueOf ( ) ) . reduce ( ( first , second ) => Math . max ( first , second ) , next . finishedAt . valueOf ( ) ) ;
106
116
groups . splice ( i , 1 ) ;
107
117
}
108
118
}
@@ -113,7 +123,7 @@ export function WorkflowTimeline(props: WorkflowTimelineProps) {
113
123
< div className = 'workflow-timeline__row workflow-timeline__row--header' />
114
124
{ groups . map ( group => [
115
125
< div style = { { left : timeToLeft ( group . startedAt ) } } key = { `group-${ group . startedAt } ` } className = { classNames ( 'workflow-timeline__start-line' ) } >
116
- < span className = 'workflow-timeline__start-line__time' > { moment ( group . startedAt ) . format ( 'hh:mm' ) } </ span >
126
+ < span className = 'workflow-timeline__start-line__time' > { hhMMFormat ( group . startedAt ) } </ span >
117
127
</ div > ,
118
128
...group . nodes . map ( node => (
119
129
< div
0 commit comments