11from multiprocessing import Lock
22from dash import Dash , Input , Output , dcc , html
3+ from dash .dependencies import stringify_id
34from dash .testing import wait
45import time
56
@@ -414,9 +415,9 @@ def updateDiv(n_clicks):
414415 assert dash_dcc .get_logs () == []
415416
416417
417- # multiple components , only one triggers the spinner
418- def test_ldcp010_loading_component_target_components ( dash_dcc ):
419-
418+ # update multiple props of same component , only targeted id/prop triggers spinner
419+ # test that target_components id can be a dict id
420+ def test_ldcp011_loading_component_target_components ( dash_dcc ):
420421 lock = Lock ()
421422
422423 app = Dash (__name__ )
@@ -425,53 +426,61 @@ def test_ldcp010_loading_component_target_components(dash_dcc):
425426 [
426427 dcc .Loading (
427428 [
428- html .Button (id = "btn-1" ),
429+ html .Button (id = { "type" : "button" , "index" : "one" } ),
429430 html .Button (id = "btn-2" ),
431+ html .Button (id = "btn-3" ),
430432 ],
431433 className = "loading-1" ,
432- target_components = {"btn-2" : "children" },
434+ target_components = {
435+ stringify_id ({"type" : "button" , "index" : "one" }): "className"
436+ },
433437 )
434438 ],
435439 id = "root" ,
436440 )
437441
438- @app .callback (Output ("btn-1" , "children" ), [Input ("btn-2" , "n_clicks" )])
442+ @app .callback (
443+ Output ({"type" : "button" , "index" : "one" }, "children" ),
444+ [Input ("btn-2" , "n_clicks" )],
445+ )
439446 def updateDiv1 (n_clicks ):
440447 if n_clicks :
441448 with lock :
442449 return "changed 1"
443-
444450 return "content 1"
445451
446- @app .callback (Output ("btn-2" , "children" ), [Input ("btn-1" , "n_clicks" )])
452+ @app .callback (
453+ Output ({"type" : "button" , "index" : "one" }, "className" ),
454+ [Input ("btn-3" , "n_clicks" )],
455+ )
447456 def updateDiv2 (n_clicks ):
448457 if n_clicks :
449458 with lock :
450- return "changed 2"
451-
452- return "content 2"
459+ return "new-class"
460+ return ""
453461
454462 dash_dcc .start_server (app )
455463
456- dash_dcc .wait_for_text_to_equal ("#btn-1" , "content 1" )
457- dash_dcc .wait_for_text_to_equal ("#btn-2" , "content 2" )
458-
459- with lock :
460- dash_dcc .find_element ("#btn-1" ).click ()
464+ btn1id = "#" + stringify_id ({"type" : "button" , "index" : "one" })
461465
462- dash_dcc .find_element (".loading-1 .dash-spinner" )
463- dash_dcc .wait_for_text_to_equal ("#btn-2" , "" )
464-
465- dash_dcc .wait_for_text_to_equal ("#btn-2" , "changed 2" )
466+ dash_dcc .wait_for_text_to_equal (btn1id , "content 1" )
466467
467468 with lock :
468469 dash_dcc .find_element ("#btn-2" ).click ()
469- spinners = dash_dcc .find_elements (".loading-1 .dash-spinner" )
470- dash_dcc .wait_for_text_to_equal ("#btn-1" , "" )
471470
472- dash_dcc .wait_for_text_to_equal ("#btn-1" , "changed 1" )
471+ spinners = dash_dcc .find_elements (".loading-1 .dash-spinner" )
472+ dash_dcc .wait_for_text_to_equal (btn1id , "" )
473+ dash_dcc .wait_for_text_to_equal (btn1id , "changed 1" )
473474 assert spinners == []
474475
476+ with lock :
477+ dash_dcc .find_element ("#btn-3" ).click ()
478+
479+ dash_dcc .find_element (".loading-1 .dash-spinner" )
480+ dash_dcc .wait_for_text_to_equal (btn1id , "" )
481+
482+ dash_dcc .wait_for_class_to_equal (btn1id , "new-class" )
483+
475484 assert dash_dcc .get_logs () == []
476485
477486
0 commit comments