@@ -153,8 +153,8 @@ export default function WorkflowSimulator({
153153 let currentGroupIndex = 0 ;
154154 let groupStartTime = performance . now ( ) ;
155155
156- // Track progress for activities with subgroups (series within parallel)
157- const subgroupProgress = { } ;
156+ // Track cumulative time spent on completed activities in each subgroup
157+ const subgroupCompletedTime = { } ;
158158
159159 const animate = ( timestamp ) => {
160160 if ( currentGroupIndex >= groupKeys . length ) {
@@ -207,34 +207,40 @@ export default function WorkflowSimulator({
207207 const subgroupActivities = withSubgroups [ subgroupKey ] ;
208208 const trackKey = `${ currentGroupIndex } -${ subgroupKey } ` ;
209209
210- if ( ! subgroupProgress [ trackKey ] ) {
211- subgroupProgress [ trackKey ] = { currentIndex : 0 , startTime : groupStartTime } ;
210+ // Initialize cumulative completed time for this subgroup
211+ if ( subgroupCompletedTime [ trackKey ] === undefined ) {
212+ subgroupCompletedTime [ trackKey ] = 0 ;
212213 }
213214
214- const track = subgroupProgress [ trackKey ] ;
215- let subgroupElapsed = timestamp - track . startTime ;
215+ // Calculate which activity is currently running based on elapsed time
216+ let remainingTime = elapsed ;
217+ let currentActivityIndex = 0 ;
216218
217- // Process activities in this subgroup sequentially
219+ // Find which activity should be running
220+ for ( let i = 0 ; i < subgroupActivities . length ; i ++ ) {
221+ if ( remainingTime >= subgroupActivities [ i ] . duration ) {
222+ remainingTime -= subgroupActivities [ i ] . duration ;
223+ currentActivityIndex = i + 1 ;
224+ } else {
225+ break ;
226+ }
227+ }
228+
229+ // Update states for all activities in this subgroup
218230 for ( let i = 0 ; i < subgroupActivities . length ; i ++ ) {
219231 const activity = subgroupActivities [ i ] ;
220232
221- if ( i < track . currentIndex ) {
233+ if ( i < currentActivityIndex ) {
222234 // Already completed
223235 newStates [ activity . originalIndex ] = { status : ActivityStatus . COMPLETED , progress : 100 } ;
224- } else if ( i === track . currentIndex ) {
236+ } else if ( i === currentActivityIndex ) {
225237 // Currently running
226- const progress = Math . min ( ( subgroupElapsed / activity . duration ) * 100 , 100 ) ;
238+ const progress = Math . min ( ( remainingTime / activity . duration ) * 100 , 100 ) ;
227239 newStates [ activity . originalIndex ] = {
228240 status : progress >= 100 ? ActivityStatus . COMPLETED : ActivityStatus . RUNNING ,
229241 progress : progress ,
230242 } ;
231-
232- if ( progress >= 100 ) {
233- track . currentIndex ++ ;
234- track . startTime = timestamp ;
235- } else {
236- groupComplete = false ;
237- }
243+ if ( progress < 100 ) groupComplete = false ;
238244 } else {
239245 // Not started yet
240246 newStates [ activity . originalIndex ] = { status : ActivityStatus . PENDING , progress : 0 } ;
0 commit comments