Ações globais

Se eu possuo um produto e o módulo de vendas, certamente eu poderei vendê-lo. Se eu possuo um cliente, ele poderá abrir um pedido e fazer compras. Essas são ações que quase sempre são possíveis para um registro e podem ser previamente programadas para que apareçam aonde o registro for exibido. “Ações Globais” são ações possíveis para um determinado tipo de registro.

Como funciona?

Antes de começarmos a criar uma ação vamos primeiro entender como isso tudo funciona.

Coleção de ações

Em todas as classes existe um atributo chamado globalActions do tipo uwl.classes.GlobalActions que representa a coleção de ações possíveis.

Hierarquia

Esta coleção é cumulativa conforme se avança na hierarquia, ou seja, uma classe sempre vai possuir as ações definidas na sua mãe. Essa coleção só tende a crescer conforme se avança na árvore hierárquica, pois não é possível remover ações, somente adicionar.

Representação

Cada ação é representada por um Link o qual é montado baseado nas informações disponíveis nos objetos do tipo uwl.classes.GlobalAction presentes na coleção anteriormente apresentada. A semelhança entre os dois não é mera coincidência.

Condições

Hoje as ações somente são possíveis para campos que:

  • Sejam lookups Note que para a definição de ações é necessário que uma classe seja dada, se um campo não for lookup não temos como ter esta informação;
  • Não permitam seleção múltipla Por definição, uma ação é particular de um registro;

Exemplo

Vamos utilizar de exemplo o caso mais comum do nosso sistema, a ação de abrir um cadastro. Quero que apareça a ação de abrir o cadastro caso o registro pertença à classe Cadastrais. Para essa ação eu quero que seja aberto o processo Explorer.ip e que sejam passados parâmetros pra ele para que abra na classe correta e posicionado no registro em que eu cliquei.

Criando a ação

Primeiro temos que definir a ação. Então no código da classe Cadastrais eu acrescento o seguinte:

__includeOnce('ufs:/uwl/classes/globalAction.js');
var abrirCadastro = new uwl.classes.GlobalAction('abrirCadastro');
abrirCadastro.help = 'Abre o cadastro da classe no processo Explorer.';
abrirCadastro.hint = 'Abrir cadastro';
abrirCadastro.caption = 'Abrir cadastro';
abrirCadastro.targetKey = -1898145512; //Explorer.ip
abrirCadastro.interaction = 'main';

O que fiz foi criar uma ação chama abrirCadastro que leva à interação main no processo de chave -1898145512. O resto das definições são explicadas na documentação.

Ativando a ação

A ação está criada, mas nada ainda a associa à classe. Já explicamos que para cada classe existe uma coleção de ações previamente criada. Então tudo o que temos que fazer é adicioná-la à coleção. A próxima linha fará o trabalho.

this.globalActions.add(abrirCadastro);`

O que temos?

Até agora temos:

__includeOnce('ufs:/uwl/classes/globalAction.js');
var abrirCadastro = new uwl.classes.GlobalAction('abrirCadastro');
abrirCadastro.help = 'Abre o cadastro da classe no processo Explorer.';
abrirCadastro.hint = 'Abrir cadastro';
abrirCadastro.caption = 'Abrir cadastro';
abrirCadastro.targetKey = -1898145512; //Explorer.ip
abrirCadastro.interaction = 'main';
this.globalActions.add(abrirCadastro);

Esse código apenas define que a classe Cadastrais terá a ação abrirCadastro que levará ao processo Explorer.ip. Para alcançar o nosso objetivo ainda devemos definir os parâmetros baseClass e baseKey para o processo saber o que carregar.

Adicionando comportamentos para a ação

Precisamos adicionar os parâmetros para que alcancemos o objetivo. Mas não existe neste momento como saber qual a classe e a chave para passarmos para o Explorer. Mas para resolver problemas como este podemos alterar uma ação global ou até a coleção antes dela ser exibida através do método onShow.

Assim temos:

__includeOnce('ufs:/uwl/classes/globalAction.js');
var abrirCadastro = new uwl.classes.GlobalAction('abrirCadastro');
abrirCadastro.help = 'Abre o cadastro da classe no processo Explorer.';
abrirCadastro.hint = 'Abrir cadastro';
abrirCadastro.caption = 'Abrir cadastro';
abrirCadastro.targetKey = -1898145512;
abrirCadastro.interaction = 'main';
abrirCadastro.onShow.set(function (globalAction, key) {
    globalAction.addParameter({name: 'baseClass',
      value: uwl.keys.tryGetClass(key)});
    globalAction.addParameter({name: 'baseKey',
      value: key});
    return globalAction;
});
this.globalActions.add(abrirCadastro);

Ocultando

Para ocultar a exibição de ações globais deve-se olhar para quem a está definindo. Hoje isso pode ser definido no Field e no Column, através da propriedade showGlobalActions.