WorkFlow context actions
Quando um workflow tem uma stage de detail a mesma passa a poder fornecer botões para o componente WorkflowActions.
Para tal basta que qualquer actionItem na view tenha o parâmetro adicional showAsWorkflowAction.
<dif:formActions cssClass="actionsbuttons alignLeft">
<dif:actionItem type="submit" label="${messages.atualizarProtocolo}"/>
<dif:actionItem label="${messages.associarProtocolo}" cssClass="editIcon"
javascript="openProtocoloPicker();" showAsWorkflowAction="true"/>
</dif:formActions>
O botão da form, é renderizado no seu local, com a sua normal funcionalidade mas hidden.
O component WorkflowActions irá renderizar um botão com o mesmo nome e características gráficas, mas que simplesmente chama o que está escondido.
Estes botões ficam sempre antes dos que o estado do Workflow adiciona.
Passa a ser possível encadear componentes com a stage mãe quando usado o dif:component
Quando colocamos uma stage dentro de outra da seguinte forma:
<dif:component stageID="${stage.detailsStageID}"
parameters="workFlowInstanceID=${difrequest.parameters.workflowinstanceid}"/>
A stage chamada não conseguia procurar componentes pai (ancestor) dentro da stage que a inclui.
Passa a ser possível se for usado o método
AbstractDIFTag.findAncestorWithClass(Class<T> clazz)
O exemplo acima da Action que foi adicionada ao WorkflowActions é precisamente um caso destes.
Esta funcionalidade deverá ser usada com o seguinte conhecimento:
As Tags da view filha, não devem ser passadas para os objetos da view pai.
Isto porque após finalizar a execução da view filha, ao devolver para a execução do resto da view da mãe, o pageContext destas (filhas) estará desligado do httpRequest.
Desta forma todos os métodos que obtém os request/responses não estarão usáveis (NullPointerException).
Tirando este cuidado não haverá qualquer problema.
Nota: No caso acima existia este problema. Foi necessário substituir a referencia para a tag ActionItem dentro do ActionItemObject que é passado ao WorkflowActions por uma tag válida para geração.
for (ActionItemObject item : workflowContext.getCustomActions())
{
// Add JS call to original action
item.setJavascript("Ext.get('" + item.getID() + "').dom.click();");
item.setID(this.getDocumentTag().getComponentGeneratedId());
item.setType(ActionItemType.CUSTOM.name());
item.setShowAsWorkflowAction(false);
item.bindToNewTag(this);
this.getItems().add(item);
}
Obrigado.
Com os melhores cumprimentos,