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.
Então direto ao ponto, "Ações Globais" são ações possíveis para um determinado tipo de registro.
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;
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 é adincioná-la à coleção. A próxima linha fará o trabalho.
this.globalActions.add(abrirCadastro);
O que temos?
Até agora temos isso:
__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);
O que isso faz? Bom, até agora 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.
abrirCadastro.onShow.set(function (globalAction, key) { globalAction.addParameter({name: 'baseClass', value: uwl.keys.tryGetClass(key)}); globalAction.addParameter({name: 'baseKey', value: key}); return globalAction; });
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);
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.
Mais informações em http://developer.erp.bematech.com/js-api/latest/uwi.field.Field.html#showGlobalActions e http://developer.erp.bematech.com/js-api/latest/bdo.datasource.Column.html#showGlobalActions.