from pathlib import Path from htmltools import HTMLDependency, tags from shiny import App, reactive, ui from query import query_output_server, query_output_ui button_style = {"style": "margin: 15px"} www_dir = Path(__file__).parent / "www" app_ui = ui.page_fluid( HTMLDependency( "bootstrap", version="9.99", source={"subdir": str(www_dir)}, script={"src": "bootstrap.bundle.min.js"}, stylesheet={"href": "theme.css"}, ), ui.row( ui.column( 2, ui.row( button_style, ui.input_action_button("add_query", "Add Query"), ), ui.row( button_style, ui.input_action_button("remove_query", "Remove Query"), ), ), ui.column( 10, ui.tags.div(query_output_ui("initial_query"), id="module_container"), ), ), ) def server(input, output, session): mod_counter = reactive.Value(0) query_output_server("initial_query") @reactive.Effect @reactive.event(input.add_query) def _(): counter = mod_counter.get() + 1 mod_counter.set(counter) id = "query_" + str(counter) ui.insert_ui( selector="#module_container", where="afterBegin", ui=query_output_ui(id) ) query_output_server(id) @reactive.Effect @reactive.event(input.remove_query) def _(): ui.remove_ui(selector=f"#module_container .row:first-child") app = App(app_ui, server)