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
.