@@ -31,7 +31,8 @@ import {
31
31
IPrioritizedCallback ,
32
32
LongCallbackInfo ,
33
33
CallbackResponse ,
34
- CallbackResponseData
34
+ CallbackResponseData ,
35
+ SideUpdateOutput
35
36
} from '../types/callbacks' ;
36
37
import { isMultiValued , stringifyId , isMultiOutputProp } from './dependencies' ;
37
38
import { urlBase } from './utils' ;
@@ -44,6 +45,8 @@ import {handlePatch, isPatch} from './patch';
44
45
import { getPath } from './paths' ;
45
46
46
47
import { requestDependencies } from './requestDependencies' ;
48
+ import { parsePMCId } from './patternMatching' ;
49
+ import { replacePMC } from './patternMatching' ;
47
50
48
51
export const addBlockedCallbacks = createAction < IBlockedCallback [ ] > (
49
52
CallbackActionType . AddBlocked
@@ -340,33 +343,53 @@ function updateComponent(component_id: any, props: any) {
340
343
} ;
341
344
}
342
345
343
- function sideUpdate ( outputs : any , dispatch : any ) {
344
- toPairs ( outputs ) . forEach ( ( [ id , value ] ) => {
345
- let componentId = id ,
346
- propName ;
346
+ /**
347
+ * Update a component props with `running`/`progress`/`set_props` calls.
348
+ *
349
+ * @param outputs Props to update.
350
+ * @param cb The originating callback info.
351
+ * @returns
352
+ */
353
+ function sideUpdate ( outputs : SideUpdateOutput , cb : ICallbackPayload ) {
354
+ return function ( dispatch : any , getState : any ) {
355
+ toPairs ( outputs )
356
+ . reduce ( ( acc , [ id , value ] , i ) => {
357
+ let componentId = id ,
358
+ propName ,
359
+ replacedIds = [ ] ;
360
+
361
+ if ( id . startsWith ( '{' ) ) {
362
+ [ componentId , propName ] = parsePMCId ( id ) ;
363
+ replacedIds = replacePMC ( componentId , cb , i , getState ) ;
364
+ } else if ( id . includes ( '.' ) ) {
365
+ [ componentId , propName ] = id . split ( '.' ) ;
366
+ }
347
367
348
- if ( id . startsWith ( '{' ) ) {
349
- const index = id . lastIndexOf ( '}' ) ;
350
- if ( index + 2 < id . length ) {
351
- propName = id . substring ( index + 2 ) ;
352
- componentId = JSON . parse ( id . substring ( 0 , index + 1 ) ) ;
353
- } else {
354
- componentId = JSON . parse ( id ) ;
355
- }
356
- } else if ( id . includes ( '.' ) ) {
357
- [ componentId , propName ] = id . split ( '.' ) ;
358
- }
368
+ const props = propName ? { [ propName ] : value } : value ;
359
369
360
- const props = propName ? { [ propName ] : value } : value ;
361
- dispatch ( updateComponent ( componentId , props ) ) ;
362
- } ) ;
370
+ if ( replacedIds . length === 0 ) {
371
+ acc . push ( [ componentId , props ] ) ;
372
+ } else if ( replacedIds . length === 1 ) {
373
+ acc . push ( [ replacedIds [ 0 ] , props ] ) ;
374
+ } else {
375
+ replacedIds . forEach ( ( rep : any ) => {
376
+ acc . push ( [ rep , props ] ) ;
377
+ } ) ;
378
+ }
379
+
380
+ return acc ;
381
+ } , [ ] as any [ ] )
382
+ . forEach ( ( [ id , idProps ] ) => {
383
+ dispatch ( updateComponent ( id , idProps ) ) ;
384
+ } ) ;
385
+ } ;
363
386
}
364
387
365
388
function handleServerside (
366
389
dispatch : any ,
367
390
hooks : any ,
368
391
config : any ,
369
- payload : any ,
392
+ payload : ICallbackPayload ,
370
393
long : LongCallbackInfo | undefined ,
371
394
additionalArgs : [ string , string , boolean ?] [ ] | undefined ,
372
395
getState : any ,
@@ -386,7 +409,7 @@ function handleServerside(
386
409
let moreArgs = additionalArgs ;
387
410
388
411
if ( running ) {
389
- sideUpdate ( running . running , dispatch ) ;
412
+ dispatch ( sideUpdate ( running . running , payload ) ) ;
390
413
runningOff = running . runningOff ;
391
414
}
392
415
@@ -496,10 +519,10 @@ function handleServerside(
496
519
dispatch ( removeCallbackJob ( { jobId : job } ) ) ;
497
520
}
498
521
if ( runningOff ) {
499
- sideUpdate ( runningOff , dispatch ) ;
522
+ dispatch ( sideUpdate ( runningOff , payload ) ) ;
500
523
}
501
524
if ( progressDefault ) {
502
- sideUpdate ( progressDefault , dispatch ) ;
525
+ dispatch ( sideUpdate ( progressDefault , payload ) ) ;
503
526
}
504
527
} ;
505
528
@@ -522,11 +545,11 @@ function handleServerside(
522
545
}
523
546
524
547
if ( data . sideUpdate ) {
525
- sideUpdate ( data . sideUpdate , dispatch ) ;
548
+ dispatch ( sideUpdate ( data . sideUpdate , payload ) ) ;
526
549
}
527
550
528
551
if ( data . progress ) {
529
- sideUpdate ( data . progress , dispatch ) ;
552
+ dispatch ( sideUpdate ( data . progress , payload ) ) ;
530
553
}
531
554
if ( ! progressDefault && data . progressDefault ) {
532
555
progressDefault = data . progressDefault ;
@@ -671,11 +694,19 @@ export function executeCallback(
671
694
672
695
const __execute = async ( ) : Promise < CallbackResult > => {
673
696
try {
697
+ const changedPropIds = keys < string > ( cb . changedPropIds ) ;
698
+ const parsedChangedPropsIds = changedPropIds . map ( propId => {
699
+ if ( propId . startsWith ( '{' ) ) {
700
+ return parsePMCId ( propId ) [ 0 ] ;
701
+ }
702
+ return propId ;
703
+ } ) ;
674
704
const payload : ICallbackPayload = {
675
705
output,
676
706
outputs : isMultiOutputProp ( output ) ? outputs : outputs [ 0 ] ,
677
707
inputs : inVals ,
678
- changedPropIds : keys ( cb . changedPropIds ) ,
708
+ changedPropIds,
709
+ parsedChangedPropsIds,
679
710
state : cb . callback . state . length
680
711
? fillVals ( paths , layout , cb , state , 'State' )
681
712
: undefined
@@ -721,7 +752,9 @@ export function executeCallback(
721
752
if ( inter . length ) {
722
753
additionalArgs . push ( [ 'cancelJob' , job . jobId ] ) ;
723
754
if ( job . progressDefault ) {
724
- sideUpdate ( job . progressDefault , dispatch ) ;
755
+ dispatch (
756
+ sideUpdate ( job . progressDefault , payload )
757
+ ) ;
725
758
}
726
759
}
727
760
}
0 commit comments