/

Acciones asíncronas y notificaciones toast

Dispara el manejador de un botón de forma asíncrona con estados de texto de carga/éxito, y encola una notificación toast desde dentro de un hook o una función de botón.

Texto de carga/éxito en un botón

Las opciones before/loading/after de una llamada a ->button() controlan el texto del botón a través de cada fase de un clic asíncrono - inactivo, en curso y brevemente en caso de éxito - usando el mismo tratamiento de spinner que ya reciben Guardar/Eliminar (setButtonLoading() en core/xcrud.js):

$xcrud->button('Process', 'orderdetails_process_line', [
    'icon'    => 'fa fa-cogs',
    'confirm' => 'Process this order line?',
    'before'  => 'Process',
    'loading' => 'Processing…',
    'after'   => 'Processed ✓',
]);

Consulta Botones de fila personalizados para ver la lista completa de opciones.

Encolar un toast

toast($message, $type = 'success') encola un mensaje para la propia interfaz de ventanas emergentes toast de xcrud.js. Llámalo desde dentro de un hook o un manejador de botón - no desde el PHP de nivel superior de una página, ya que nada lo lee fuera de una petición de escritura:

function payments_after_insert(mixed $id, array $row, Xcrud $xcrud): void
{
    $xcrud->toast('Payment recorded.');
}

$type es una cadena de formato libre; xcrud.js reconoce 'success'/'error'/'info'/'warning' para el estilo/icono y recurre a 'info' para cualquier otra cosa, así que un error tipográfico degrada a un toast de color plano en lugar de desaparecer silenciosamente.

Usarlo en una página sin ninguna cuadrícula

Los estados de carga asíncronos y los toasts no están atados a un widget $xcrud montado - Xcrud::uiAssets() carga solo el CSS/JS del tema actual, y core/xcrud.js expone directamente window.Xcrud.setButtonLoading()/window.Xcrud.toast(), así que una página sin widget puede reutilizar exactamente el mismo tratamiento de spinner/toast en su propio botón simple:

<body>
    <?php echo Xcrud::uiAssets(); ?>
    <script src="core/xcrud.js"></script>

    <button type="button" id="demo-async-btn">Generate Report</button>

    <script>
        var btn = document.getElementById('demo-async-btn');

        btn.addEventListener('click', function () {
            window.Xcrud.setButtonLoading(btn, true, 'Processing…', 'none');

            fetch('core/demo_async.php', { method: 'POST' })
                .then(function (res) { return res.json(); })
                .then(function (json) {
                    window.Xcrud.setButtonLoading(btn, false, '', 'none');
                    window.Xcrud.toast(json.message || 'Done.', json.success ? 'success' : 'error');
                })
                .catch(function () {
                    window.Xcrud.setButtonLoading(btn, false, '', 'none');
                    window.Xcrud.toast('Network error.', 'error');
                });
        });
    </script>
</body>

Coloca Xcrud::uiAssets() y la etiqueta <script> de xcrud.js en <body>, no en <head> - el envoltorio de plantilla del router extrae solo el contenido de <body> de una página que produce su propio documento HTML completo, así que una etiqueta de recurso solo en <head> nunca llega a la página final.

Referencia

LlamadaPropósito
window.Xcrud.setButtonLoading(btn, isLoading, loadingText, ui)Alterna un botón entre estado inactivo y de carga (deshabilitado, spinner, texto de reemplazo) - el mismo ayudante que ya usan internamente los clics de Guardar/Eliminar/->button().
window.Xcrud.toast(message, type)Muestra una ventana emergente toast directamente del lado del cliente, sin un viaje de ida y vuelta al servidor para encolarla.
$xcrud->toast($message, $type = 'success')Encola un toast del lado del servidor, desde dentro de una función de hook/botón, entregado en la siguiente respuesta.
Xcrud::uiAssets()Emite las etiquetas de CSS/JS del tema actual sin montar un widget - para una página que quiere los ayudantes de xcrud.js pero no tiene cuadrícula.