import dash
from dash import Dash, html, Input, Output, State, callback, ALL, set_props
import dash_mantine_components as dmc
from dash_iconify import DashIconify
app = Dash(__name__)
app.layout = dmc.MantineProvider([
dmc.Container([
dmc.Title("Modificación de elementos dinámicos", order=1, mb="lg"),
# Botón que dispara el callback
dmc.Button("Procesar Notificaciones", id="process-btn", mb="xl"),
# Contenedor de notificaciones con IDs dinámicos
dmc.NotificationContainer(id="notification-container"),
# Lista de elementos con IDs dinámicos que NO están en el Output
dmc.Stack([
dmc.Card([
dmc.Text(f"Elemento {i}", id={"type": "dynamic-element", "index": i}),
dmc.Progress(value=0, id={"type": "progress-bar", "index": i})
], withBorder=True, p="md")
for i in range(1, 4)
], id="elements-container")
], size="lg")
])
@callback(
Output("notification-container", "sendNotifications"),
Input("process-btn", "n_clicks"),
prevent_initial_call=True
)
def process_elements(n_clicks):
"""
Este callback solo tiene la notificación en el Output,
pero modifica elementos dinámicos usando set_props
"""
import random
# Modificar elementos dinámicos que NO están en el Output
for i in range(1, 4):
# Actualizar texto del elemento dinámico
set_props(
{"type": "dynamic-element", "index": i},
{"children": f"Elemento {i} - Procesado {n_clicks}"}
)
# Actualizar barra de progreso dinámica
progress_value = random.randint(20, 100)
set_props(
{"type": "progress-bar", "index": i},
{"value": progress_value, "color": "green" if progress_value > 50 else "orange"}
)
# Retornar notificación (único elemento en Output)
return [{
"id": f"process-notification-{n_clicks}",
"title": "Procesamiento completado",
"message": f"Se han actualizado {3} elementos dinámicos",
"color": "green",
"autoClose": 3000
}]
if __name__ == "__main__":
app.run_server(debug=True)