Saltar al contenido principal

Action Result + Refresh

Toda acción de DYONA devuelve el mismo contrato público de resultado:

type DyonaActionRefreshTarget = {
sourceId: string;
};

type DyonaActionResult<TData = unknown> = {
success: boolean;
message?: string;
fieldErrors?: Record<string, string>;
data?: TData;
refresh?: DyonaActionRefreshTarget[];
};

Propiedades del resultado​

  • success es obligatorio. Es un boolean que indica el resultado lógico de la acción.

  • message es opcional. Es un string que puede utilizar la UI consumidora.

  • data es opcional y genérico. DYONA no impone su estructura. Por ejemplo:

    data: {
    id: 1024,
    status: 'rejected',
    }
  • refresh es opcional y declarativo. Por ejemplo:

    refresh: [
    {sourceId: 'orders'},
    {sourceId: 'dashboard'},
    ]

    Significa: “Estas fuentes lógicas pueden haber quedado desactualizadas.” No significa que Action Engine vaya a recargarlas automáticamente.

Action Feedback en DyonaForm​

Cuando onSubmit o una acción custom onAction devuelve un DyonaActionResult, DyonaForm presenta el resultado sin requerir un Alert manual.

Success​

{success: true, message: 'Registro guardado correctamente.'}

Muestra feedback de éxito que se cierra automáticamente. Sin message, DYONA usa su mensaje genérico localizado.

Error general​

{success: false, message: 'No se pudo completar la operación.'}

Muestra feedback de error persistente que el usuario puede cerrar manualmente.

Error asociado a campos​

{success: false, message: 'No se pudo guardar.', fieldErrors: {name: 'El nombre ya existe.'}}

fieldErrors se integra con la validación y el resumen de errores existentes. Permanece al editar y se limpia al comenzar un nuevo submit o action válido. Un handler que devuelve void conserva el comportamiento anterior; un error técnico lanzado no se transforma en success: false.

Probar Action Feedback en el Lab →

Arquitectura​

Executor de la acción
↓
DyonaActionResult
↓
refresh: [{sourceId: 'orders'}]
↓
Consumidor / futuro orquestador
decide cómo reaccionar

Action Engine valida refresh, lo transporta y devuelve el mismo resultado producido por el executor.

Action Engine no:

  • ejecuta refresh;
  • llama a executeDyonaDataSource;
  • conoce DyonaGrid ni DyonaScreen;
  • busca componentes montados;
  • usa Redux, Event Bus o Context para refrescar;
  • deduplica targets.

Reglas de runtime​

  • refresh es opcional.
  • Si existe, debe ser un array no vacío.
  • Cada elemento debe ser un objeto.
  • sourceId debe ser un string no vacío.
  • La validación usa el contenido luego de trim.
  • El engine no modifica ni normaliza sourceId.
  • Se permiten targets repetidos.
  • refresh también puede existir con success: false.
  • context.sourceId no se convierte automáticamente en un refresh target.

Resultado exitoso​

const executor: DyonaActionExecutor = async () => ({
success: true,
message: 'Pedido rechazado',
data: {
id: 1024,
status: 'rejected',
},
refresh: [
{sourceId: 'orders'},
],
});

Un resultado fallido también puede refrescar​

Esto también es válido:

{
success: false,
message: 'La operación se completó solo parcialmente',
refresh: [
{sourceId: 'orders'},
],
}

Una operación puede fallar parcialmente y aun así modificar datos, por lo que un consumidor puede necesitar reaccionar a sus targets de refresh.

Relación con Action Dialog​

DyonaActionDialog no procesa refresh. Entrega el DyonaActionResult completo mediante onResult(result) sin eliminar message, fieldErrors, data ni refresh.

El ejemplo actual del Lab de Action Dialog ya demuestra esto con refresh: [{sourceId: 'orders'}].

Continuá con Action Engine o Action Dialog.

Ver Result + Refresh en el Lab de Action Dialog