Skip to content

Pattern Maching ID not working in Dash callback cancel #2955

Open
@bionictoucan

Description

@bionictoucan

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2considered for next cyclebugsomething brokendash-callbacksrelated to callbacks

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions