Open
Description
Environment:
dash 2.17.1
dash_ag_grid 31.2.0
dash-bootstrap-components 1.6.0
dash-core-components 2.0.0
dash-html-components 2.0.0
dash-table 5.0.0
Describe the bug
When defining the cancel
behaviour of a Dash bootstrap component button within the callback signature I am greeted with the error
dash.exceptions.WildcardInLongCallback: long callbacks does not support dependencies with
pattern-matching ids
Received: <Input `{"index":["MATCH"],"type":"cancel-button"}.n_clicks`>
Using pattern matching IDs in the running
kwarg for the callback signature works perfectly fine but the cancel
kwarg does not.
Expected behavior
I expected the cancel behaviour to work as with buttons without pattern matching IDs after coming across what I thought were the fixes here.
Example
from dash import Dash, html, callback, Output, Input, DiskcacheManager, MATCH
import dash_bootstrap_components as dbc
import diskcache, time
cache = diskcache.Cache("./cache")
background_callback_manager = DiskcacheManager(cache)
app = Dash(__name__, background_callback_manager=background_callback_manager)
app.layout = html.Div(
[
html.Div([html.P(id={"type": "paragraph_id", "index": 1}, children=["Button 1 not clicked"])]),
dbc.Button(id={"type": "button_id", "index": 1}, children="Run Job 1!"),
dbc.Button(id={"type": "button_id", "index": 2}, children="Run Job 2!"),
dbc.Button(id={"type": "cancel_button_id", "index": 1}, children="Cancel Running Job 1!"),
dbc.Button(id={"type": "cancel_button_id", "index": 2}, children="Cancel Running Job 2!"),
html.Div([html.P(id={"type": "paragraph_id", "index": 2}, children=["Button 2 not clicked"])]),
]
)
@callback(
output=Output({"type": "paragraph_id", "index": MATCH}, "children"),
inputs=Input({"type": "button_id", "index": MATCH}, "n_clicks"),
running=[
(Output({"type": "button_id", "index": MATCH}, "disabled"), True, False),
(Output({"type": "cancel_button_id", "index": MATCH}, "disabled"), False, True),
],
cancel=[Input({"type": "cancel_button_id", "index": MATCH}, "n_clicks")],
background=True,
prevent_initial_call=True
)
def callback(n_clicks):
time.sleep(2.0)
return [f"Clicked {n_clicks} times"]
if __name__ == "__main__":
app.run(debug=True)
returns the following error:
dash.exceptions.WildcardInLongCallback: long callbacks does not support dependencies with
pattern-matching ids
Received: <Input `{"index":["MATCH"],"type":"cancel_button_id"}.n_clicks`>
However if I comment out the cancel
kwarg, the dashboard runs, the cancel buttons just don't function how I want them to.