Saltar al contenido principal

BeforeSmartFormLoad

Este trigger se ejecuta al hacer clic en un elemento y antes de que se carguen sus campos (el Smart Form), es decir, antes de que aparezca lo siguiente:

'smart form'

A continuación, veremos un ejemplo de cómo utilizar este trigger junto con la acción 'reloadSmartForm'.

Ejemplo

En la captura siguiente, observamos un tipo de dato "cliente" que tiene vinculado un tipo de dato "cuotas". En este caso, la relación es: muchas cuotas pertenecen a un cliente (manyToOne).

Supongamos que deseamos agregar un campo en "cliente" (Suma Total) donde se sume el campo 'precio' de todas las cuotas vinculadas. A continuación, mostramos cómo hacerlo.

Primero seleccionamos el tipo de trigger, en este caso, beforeSmartFormLoad:

'trigger-before-smart-form-load'

Ahora empezamos con el código del plugin.

Primero hacemos un if para que el plugin solo aplique al tipo de elemento que queremos.

Importante: piensa que si seleccionas este trigger beforeSmartFormLoad, se va a ejecutar para TODOS los elementos cuando se carguen sus campos, entonces si solo lo quieres para ciertos tipos de elementos, es importante que no te olvides de comprobar su tipo. En este caso el tipo "cliente" que creamos tenía la id ``'6552166e6e64b2fe6547e588'``.
//@ts-ignore
async function totalumPlugin(trigger: TotalumTriggerI, modules: ModulesI): Promise<TotalumActionI[]> {

if (trigger.data.smartForm.item?.typeId !== '6552166e6e64b2fe6547e588') {
return [];
}

Tras confirmar que el plugin se ejecutará únicamente para el tipo 'cliente', obtenemos toda la información de este cliente y sus cuotas.

Dado que aún no hemos cargado todos los campos del elemento, solo disponemos de su id y typeId (la id del tipo 'cliente' en este caso). Por ello, realizamos un getItemById para obtener todos los campos del cliente.


const itemData: {id: string, typeId: string} = trigger?.data.smartForm.item?;

const cliente = (await modules.totalumSdk.crud.getItemById('cliente', itemData.id))?.data?.data;

const cuotas = (await modules.totalumSdk.crud.getItems('cuotas', {filter: [{cliente: cliente?._id}], pagination: {limit: 1000}}))?.data?.data;

Ya con el cliente y todas sus cuotas, sumamos las propiedades precio y actualizamos el cliente.

    let total = 0;

cuotas.map(cuota => {
total += cuota.precio
})

await modules.totalumSdk.crud.editItemById('cliente', cliente?._id, {
suma_total: total
})

Ahora el problema es que mientras se ejecutaba el plugin los campos del 'cliente' ya se han cargado, entonces no se va a mostrar la actualización que hemos hecho de suma_total. Para recargar el formulario desde el plugin, simplemente usamos una Action.

const newAction: TotalumActionI = {
actionType: 'reloadSmartForm',
params: {
smartForm: {
reloadSmartForm: true
}
}
};

return [newAction];

Las Actions recordemos que son una serie de funcionalidades que os damos para que podáis modificar el comportamiento de Totalum. En este caso necesitamos que se actualice el SmartForm (los campos del elemento). Simplemente creamos el objeto correspondiente de tipo TotalumActionI con los parámetros que necesita esta Action 'reloadSmartForm' y ponemos reloadSmartForm: true.

Devolvemos el array de actions (podemos enviar más de una) con la Action dentro y listo, cuando se acabe de ejecutar el plugin se actualizarán de nuevo los campos de ese elemento.