As you can see from this if I press the download button the download pop-up comes. After downloading, if I try to delete other cards, the download popup comes again. Why is it happening?
Here is a minimal reproducible example
STEPS to reproduce
- Press the download button and download or cancel whatever you like
- Now try to delete some other card by pressing the delete button
Observation: The download pop up should come again
import json
import dash
import dash_bootstrap_components as dbc
from dash import dcc
from dash.dependencies import Input, Output, ALL, State
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.layout = dbc.Container([
dbc.Row([
dcc.Download(id="download-1"),
'card 1',
dbc.Col(dbc.Button('download', id='download-btn-1')),
dbc.Col(dbc.Button('delete', id={'type': 'delete', 'id': 'card-1'}))
], className='bg-warning m-2 p-2', id='card-1'),
dbc.Row([
dcc.Download(id="download-2"),
'card 2',
dbc.Col(dbc.Button('download', id='download-btn-2')),
dbc.Col(dbc.Button('delete', id={'type': 'delete', 'id': 'card-2'}))
], className='bg-warning m-2 p-2', id='card-2'),
dbc.Row([
dcc.Download(id="download-3"),
'card 3',
dbc.Col(dbc.Button('download', id='download-btn-3')),
dbc.Col(dbc.Button('delete', id={'type': 'delete', 'id': 'card-3'}))
], className='bg-warning m-2 p-2', id='card-3'),
], id='container-body')
@app.callback(
Output('download-1', 'data'),
Input('download-btn-1', 'n_clicks'),
prevent_initial_call=True
)
def download_1(n_clicks):
return dict(content="data 1", filename="hello.txt")
@app.callback(
Output('download-2', 'data'),
Input('download-btn-2', 'n_clicks'),
prevent_initial_call=True
)
def download_1(n_clicks):
return dict(content="data 2", filename="hello.txt")
@app.callback(
Output('download-3', 'data'),
Input('download-btn-3', 'n_clicks'),
prevent_initial_call=True
)
def download_1(n_clicks):
return dict(content="data 3", filename="hello.txt")
@app.callback(
Output('container-body', 'children'),
Input({'type': 'delete', 'id': ALL}, 'n_clicks'),
State('container-body', 'children'),
prevent_initial_call=True
)
def delete_children(n_clicks, children):
card_id_to_be_deleted = json.loads(dash.callback_context.triggered[0]['prop_id'].split('.')[0])['id']
index_to_be_deleted = None
for index, c in enumerate(children):
if c['props']['id'] == card_id_to_be_deleted:
index_to_be_deleted = index
break
children.pop(index_to_be_deleted)
return children
if __name__ == '__main__':
app.run_server(debug=True)