@@ -755,3 +755,78 @@ def updateDiv2(n_clicks):
755755 assert spinners == []
756756
757757 assert dash_dcc .get_logs () == []
758+
759+
760+ # target_components with "*" wildcard - matches all props
761+ def test_ldcp018_loading_component_target_components_wildcard (dash_dcc ):
762+ lock = Lock ()
763+
764+ app = Dash (__name__ )
765+
766+ app .layout = html .Div (
767+ [
768+ dcc .Loading (
769+ [
770+ html .Button ("1" , id = "btn-1" ),
771+ html .Button ("2" , id = "btn-2" ),
772+ html .Button ("3" , id = "btn-3" ),
773+ ],
774+ className = "loading-1" ,
775+ target_components = {"btn-2" : "*" },
776+ )
777+ ],
778+ id = "root" ,
779+ )
780+
781+ @app .callback (Output ("btn-2" , "children" ), [Input ("btn-1" , "n_clicks" )])
782+ def update_btn2_children (n_clicks ):
783+ if n_clicks :
784+ with lock :
785+ return "changed children"
786+ return "content 2"
787+
788+ @app .callback (Output ("btn-2" , "className" ), [Input ("btn-3" , "n_clicks" )])
789+ def update_btn2_class (n_clicks ):
790+ if n_clicks :
791+ with lock :
792+ return "changed-class"
793+ return "original-class"
794+
795+ @app .callback (Output ("btn-1" , "children" ), [Input ("btn-2" , "n_clicks" )])
796+ def update_btn1_children (n_clicks ):
797+ if n_clicks :
798+ with lock :
799+ return "changed 1"
800+ return "content 1"
801+
802+ dash_dcc .start_server (app )
803+
804+ dash_dcc .wait_for_text_to_equal ("#btn-1" , "content 1" )
805+ dash_dcc .wait_for_text_to_equal ("#btn-2" , "content 2" )
806+
807+ # Test that updating btn-2 children triggers spinner (wildcard matches)
808+ with lock :
809+ dash_dcc .find_element ("#btn-1" ).click ()
810+ dash_dcc .wait_for_element (".loading-1 .dash-spinner" )
811+ dash_dcc .wait_for_text_to_equal ("#btn-2" , "" )
812+
813+ dash_dcc .wait_for_text_to_equal ("#btn-2" , "changed children" )
814+
815+ # Test that updating btn-2 className also triggers spinner (wildcard matches)
816+ with lock :
817+ dash_dcc .find_element ("#btn-3" ).click ()
818+ dash_dcc .wait_for_element (".loading-1 .dash-spinner" )
819+
820+ # Verify className was updated
821+ dash_dcc .wait_for_class_to_equal ("#btn-2" , "changed-class" )
822+
823+ # Test that updating btn-1 does NOT trigger spinner (not targeted)
824+ with lock :
825+ dash_dcc .find_element ("#btn-2" ).click ()
826+ spinners = dash_dcc .find_elements (".loading-1 .dash-spinner" )
827+ dash_dcc .wait_for_text_to_equal ("#btn-1" , "" )
828+
829+ dash_dcc .wait_for_text_to_equal ("#btn-1" , "changed 1" )
830+ assert spinners == []
831+
832+ assert dash_dcc .get_logs () == []
0 commit comments