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
-
successes obligatorio. Es un boolean que indica el resultado lógico de la acción. -
messagees opcional. Es un string que puede utilizar la UI consumidora. -
dataes opcional y genérico. DYONA no impone su estructura. Por ejemplo:data: {id: 1024,status: 'rejected',} -
refreshes 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
DyonaGridniDyonaScreen; - busca componentes montados;
- usa Redux, Event Bus o Context para refrescar;
- deduplica targets.
Reglas de runtime
refreshes opcional.- Si existe, debe ser un array no vacío.
- Cada elemento debe ser un objeto.
sourceIddebe 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.
refreshtambién puede existir consuccess: false.context.sourceIdno 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.