Novidades: WorkFlow context actions, FieldSets hierárquicos e FindParent across dif:components

0 views
Skip to first unread message

Pedro Viegas

unread,
Jan 24, 2022, 3:38:51 PM1/24/22
to DIF2 Mailing list
Boa tarde,

Foram adicionadas as seguintes novidades:

FiledSets dentro de FieldsSets
Passou a ser possível colocar um dentro do outro com esse conhecimento pelo componente.
Objetivo: Conseguir definir layouts vários para cada campo sem quebrar blocos responsivos.
Consequências:
  • Por exemplo o responsiveFieldsSets apenas será aplicado aos fieldSets de primeiro nível
  • Os fieldsSets de segundo nível passam a ser gerados consoante o layout dos seus fieldSets pais (fazendo uma row de table para os que assim o obrigam)
<dif:form name="protocolosEditorForm" layout="<%=FieldSet.LAYOUT_FREE%>" cssClass="centerBlock"
responsiveFieldset="true" readonly="true" noActions="true">
<dif:fieldset layout="<%=FieldSet.LAYOUT_TABULAR%>" border="false">
<dif:formSubTitle>${messages.dadosPedido}</dif:formSubTitle>
<dif:fieldset layout="<%=FieldSet.LAYOUT_TWOCOLUMN%>" border="false">
<dif:textField id="prioridade" width="20" readonly="true"
tip="${messages.prioridadeTip}"
label="${messages.prioridade}"/>
<dif:fileUploadField id="idDocumentoProva" label="${messages.idDocumentoProva}"
allowDelete="false" readonly="true"
docEntryId="${stage.protocoloIndividuo.idDocumentoProva}"/>
</dif:fieldset>
<dif:fieldset layout="<%=FieldSet.LAYOUT_POLL%>">
<dif:memoField id="descricaoNovoProtocolo" label="${messages.descNovoProtocolo}"
maxLength="500" rows="5" width="600"/>
</dif:fieldset>

<dif:fieldset layout="<%=FieldSet.LAYOUT_POLL%>" border="false">
<dif:memoField id="descricaoPedido" label="${messages.descDetalhePedido}" maxLength="500"
rows="5" width="600"/>
</dif:fieldset>

<dif:formSubTitle>${messages.dadosProtocolo}</dif:formSubTitle>
<dif:fieldset layout="<%=FieldSet.LAYOUT_POLL%>" border="false">
<dif:textField id="nome" label="${messages.descNovoProtocolo}" width="600"/>
</dif:fieldset>

<dif:comboField id="situacao" label="${messages.tableprotsituacao_id}"
dataSetBeanClass="<%=TableProtSituacao.class%>" width="300"/>
<dif:comboField id="tipoAluno" dataSetBeanClass="<%=TableTipalu.class%>" addNull="true"
label="${messages.tabletipalu_codeTipAlu}" width="300"/>
<dif:comboField id="tipoIsencao" dataSetBeanClass="<%=TableTipises.class%>" addNull="true"
label="${messages.tabletipises_codeTipise}" width="300"/>
<dif:textField id="referencia" label="${messages.referencia}" width="300"/>
</dif:fieldset>

<dif:fieldset layout="<%=FieldSet.LAYOUT_TABULAR%>" border="false">
<dif:formSubTitle>${messages.ambito}</dif:formSubTitle>
<dif:checkBoxField id="participaAluno" label="${messages.participaalu}">
<dif:checkBoxField id="participaCandidato" label="${messages.participacnd}"/>
</dif:checkBoxField>
<dif:checkBoxField id="participaDocente" label="${messages.participadoc}">
<dif:checkBoxField id="participaFuncionario" label="${messages.participafnc}"/>
</dif:checkBoxField>
<dif:checkBoxField id="renovavel" label="${messages.renovavel}"/>

<dif:formSubTitle>${messages.dates}</dif:formSubTitle>
<dif:dateField id="dateInicio" label="${messages.dateinicio}">
<dif:dateField id="dateFim" label="${messages.datefim}"/>
</dif:dateField>
<dif:dateField id="dateValidade" label="${messages.dateValidade}"/>
<dif:textField id="prazoRenuncia" label="${messages.prazorenuncia}"/>

<dif:formSubTitle>${messages.projetosWeb}</dif:formSubTitle>
<dif:comboField id="ambitoProj"
dataSetBeanClass="<%=TableProjAmbito.class%>" addNull="true"
label="${messages.tableprojambito_id}" width="300"/>
<dif:comboField id="natureza"
dataSetBeanClass="<%=TableProjNatureza.class%>" addNull="true"
label="${messages.tableprojnatureza_id}" width="300"/>
<dif:comboField id="orgaoEmissor"
dataSetBeanClass="<%=TableProtOrgaoEms.class%>" addNull="true"
label="${messages.tableprotorgaoems_id}" width="300"/>
</dif:fieldset>
</dif:form>
image.png
A responsividade é aplicada apenas aos dois fieldSets de topo. Os restantes respeitam os vários layouts encadeados.


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>
image.png

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,



Pedro Viegas
Director Departamento de Desenvolvimento
(Development Manager)
Digitalis Informática Lda
R&D: http://development.digitalis.pt



Reply all
Reply to author
Forward
0 new messages