diff --git a/shiny/api-examples/modal_remove/app-core.py b/shiny/api-examples/modal_remove/app-core.py new file mode 100644 index 000000000..08e47b8a5 --- /dev/null +++ b/shiny/api-examples/modal_remove/app-core.py @@ -0,0 +1,45 @@ +from shiny import App, Inputs, Outputs, Session, reactive, ui + + +def run_model(delay=10.0): + import time + + # Pretend to run a model for `delay` seconds + start_time = time.time() + while time.time() - start_time < delay: + pass + return time.time() + + +def the_modal(): + return ui.modal( + "The model is running, please wait.", + title="Running model", + easy_close=False, + footer=None, + ) + + +app_ui = ui.page_fluid( + ui.input_action_button("run", "Run Model"), +) + + +def server(input: Inputs, output: Outputs, session: Session): + model_result = reactive.value() + + @reactive.effect + @reactive.event(input.run) + def do_run_model(): + # Show the modal, blocking interaction with the UI + ui.modal_show(the_modal()) + + result = run_model(delay=4) + + # Now that we have model results, remove the modal + # and update the model result reactive value + ui.modal_remove() + model_result.set(result) + + +app = App(app_ui, server) diff --git a/shiny/api-examples/modal_remove/app-express.py b/shiny/api-examples/modal_remove/app-express.py new file mode 100644 index 000000000..c1389e778 --- /dev/null +++ b/shiny/api-examples/modal_remove/app-express.py @@ -0,0 +1,40 @@ +from shiny import reactive +from shiny.express import input, ui + + +def run_model(delay=10.0): + import time + + # Pretend to run a model for `delay` seconds + start_time = time.time() + while time.time() - start_time < delay: + pass + return time.time() + + +ui.input_action_button("run", "Run Model") + +model_result = reactive.value() + + +def the_modal(): + return ui.modal( + "The model is running, please wait.", + title="Running model", + easy_close=False, + footer=None, + ) + + +@reactive.effect +@reactive.event(input.run) +def do_run_model(): + # Show the modal, blocking interaction with the UI + ui.modal_show(the_modal()) + + result = run_model(delay=4) + + # Now that we have model results, remove the modal + # and update the model result reactive value + ui.modal_remove() + model_result.set(result) diff --git a/shiny/ui/_modal.py b/shiny/ui/_modal.py index cdfc76f76..a7dc57807 100644 --- a/shiny/ui/_modal.py +++ b/shiny/ui/_modal.py @@ -184,7 +184,7 @@ def modal_show(modal: Tag, session: Optional[Session] = None) -> None: session._send_message_sync({"modal": {"type": "show", "message": msg}}) -@add_example(ex_dir="../api-examples/modal") +@add_example() def modal_remove(session: Optional[Session] = None) -> None: """ Remove a modal dialog box.