Manter os campos desabilitados ao ser disparado um evento de fechar janela

Visão geral

Para garantir a integridade das operações e evitar comportamentos inesperados, o LATROMI possui um mecanismo nativo de gerenciamento de estados. Esse recurso monitora as interações do usuário em tempo real, que ao disparar um evento – como um clique em um botão de salvar ou processar, a plataforma bloqueia automaticamente novas interações até que o processo corrente seja finalizado.

Essa proteção impede o ‘duplo clique’ acidental ou disparos simultâneos que poderiam resultar em duplicidade de registros ou conflitos de lógicas.

Problema

Embora o mecanismo de proteção seja robusto, identificamos um cenário específico relacionado à latência de rede. Em situações onde a conexão do usuário apresenta instabilidade, verificamos um pequeno atraso entre a finalização do processo no servidor e o efetivo fechamento da janela no navegador. Esse intervalo era suficiente para que o sistema interpretasse que o evento já havia terminado e liberasse os componentes para interação antes que a janela fosse removida da tela.

Nessa brecha de milissegundos, o usuário poderia realizar uma ação indesejada — como clicar em outro botão ou alterar um campo — em um formulário que deveria estar em processo de encerramento. Esse comportamento gera inconsistências, pois a interação ocorre em um objeto que o sistema já considerava como ‘finalizado’.

Solução

A estratégia adotada para eliminar essa brecha de interação se baseia em uma premissa simples que após o fechamento solicitado, nenhuma outra ação do usuário deve ser permitida naquele objeto. Portanto, a partir do disparo do evento close, o bloqueio dos componentes passará a ser persistente, não sendo mais revertido após o processamento.

A correção será aplicada no método _callProcessEventServiceComplete, dentro do módulo de gerenciamento de formulários dinâmicos. A lógica seguirá os seguintes critérios:

  1. O método analisará a variável de retorno processResult.
  2. Será verificada a propriedade booleana processResult.closedRequired.
  3. Caso o valor seja true, o sistema não executará o desbloqueio dos componentes da tela.

Dessa forma, garantimos que os campos permaneçam inacessíveis durante todo o tempo de resposta do navegador, eliminando o risco de interações residuais antes do encerramento visual da janela.