[Forms] Novas funcionalidades (ParameterBean e outras)

1 view
Skip to first unread message

Pedro Viegas

unread,
Sep 29, 2021, 9:24:46 AM9/29/21
to DIF2 Mailing list
Bom dia,

Segue um conjunto de funcionalidades/automatismos recentes nas forms da DIF que não tinham ainda sido documentadas:

@ParameterBean, a forma de declarar parâmetros para uma classe (tabela de BD)
Esta nova annotation irá simplificar imenso o trabalho de declarar parâmetros e os usar nas views, para classes que representam tabelas de BD.
Avançamos para um caso de uso:
@ParameterBean(linkToForm = "formCurso")
protected Cursos curso;
A linha acima declara os parâmetros de todos os campos da tabela/classe curso.
Esses parâmetros terão os tipos respetivos, todas as constraints associadas (maxSize, max, date, required).
Se desejarmos ter também os campos de uma relação podemos pedi-lo da seguinte forma:
@ParameterBean(linkToForm = aluno", manageRelations = {"individuo"})
protected Alunos aluno;
No exemplo acima todos os campos da classe individuo associada à classe aluno terão os respetivos parâmetros criados também. Podemos passar várias relações separadas por virgula, mas apenas de primeiro nível.
Para que funcione corretamente a view tem que ser gerada mediante a convenção, usando as cinstantes de exploração do ORM.
<dif:form name="formCurso">
<dif:textField id="<%="formCurso"+Cursos.Fields.CODECURSO%>" readonly="true" width=100/>
<dif:textField id="<%="formCurso"+Cursos.Fields.NAMECURSO%>" width="490" labelWidth="120"/>
<dif:textField id="<%="formCurso"+Cursos.Fields.HOMEPAGE%>" width="710"/>
<dif:checkBoxField id="<%="formCurso"+Cursos.Fields.CODEACTIVO%>"/>
<dif:checkBoxField id="<%="formCurso"+Cursos.Fields.CODEBOLONHA%>"/>
<dif:checkBoxField id="<%="formCurso"+Cursos.Fields.CODEPUBLICO%>"/>
<dif:checkBoxField id="<%="formCurso"+Cursos.Fields.PUBMOBILIDADE%>"/>
<dif:checkBoxField id="<%="formCurso"+Cursos.Fields.VALIDO%>"/>
</dif:form>
A nomenclatura é essencial. O ID tem que ser precedido do nome da form, e depois usar as constantes.
E como inicializar estes parâmetros ou passar para a BD? Simplesmente inicializar o objeto lendo-o da BD. Ou em alternativa para casos de exceção atribuir os valores a cada field do objeto.
this.curso = Cursos.getInstance(codeCurso);
Atualizar os dados na BD após um submit:
Cursos cursoInDB = Cursos.getInstance(this.codeCurso);
cursoInDB = Form.mergeBean(cursoInDB, this.curso, this.context, "formCurso");
cursoInDB = this.siges.getCSE().getCursosDataSet().update(cursoInDB);
O método utilitário mergeBean fará vários coisas:
  • Atualizar os atributos dos campos submetidos no objeto curso (deixando os restantes inalterados)
  • Atribuir os valores default dos campos (de acordo com o que a BD indica) para os campos não preenchidos.
Se desejarmos inicializar uma form e todos os seus campos via AJAX num cenário destes temos ainda um método gerado automáticamente quando existe um parameterBean associado à form para o fazer. Basta portanto chemar em JavaScript o seguinte:
loadformCurso(codeCurso);
Na stage para os dados serem lidos basta ter o método convencionado:
@OnAJAX("formCurso")
public Curso loadFormCurso() throws IllegalAccessException, DataSetException, InstantiationException
{
return Form.loadBean(this.context, Curso.class);
}


dif:comboField sem declarar onAjax
Para campos cuja lista de valores vem de uma tabela (FK) basta fazer o seguinte:
<dif:comboField id="<%="formRamo"+Ramos.FK().tableClassFos().CODECLASSFOS()%>"
dataSetBeanClass="<%=TableClassFos.class%>" width="450"/>
Se o campo em questão não tiver uma tabela como fonta da lista mas sim as várias opções de uma CK associada ao campo, então:
<dif:comboField id="<%="formCurso"+Cursos.Fields.CODEPERINS%>" width="340"
dataSetBeanClass="<%=Cursos.class%>"
dataSetField="<%=Cursos.Fields.CODEPERINS%>">
A lista de valores será obtida do LOVProvider, de forma automática cuja personalização será explicada num outro mail.

Requisito: as classes dadas ao atributo dataSetBeanClass foram o resultado do REVENG de um modelo de dados pelo MavenORMGenerator.


dif:pickerField sem declarar onAjax
Os dif:pickerField passam a poder ser chamados de várias formas. Sempre para dados obtidos via AJAX por conceção.
Dados de um evento AJAX:
<dif:pickerField id="<%="categoriesForm"+DocumentCategory.FK().documentCategory().ID()%>"
ajaxEvent=“categories" allowDelete="true"
label="${messages.parentcategoryid}" width="300"/>
Dados de uma tabela associada (FK) de onde vem a lista de valores:
<dif:pickerField id="<%="categoriesForm"+DocumentCategory.FK().documentCategory().ID()%>"
dataSetBeanClass="<%=DocumentCategory.class%>" allowDelete="true"
label="${messages.parentcategoryid}" width="300"/>
Dados do componente ListPicker incluso que pode obter dados de qualquer fonte e configurar as colunas desejadas da grid do picker, etc.
<dif:pickerField id="<%="controleTransicaoAnoGridForm"+ContItems.FK().id().CODEITEM()%>"
label="${messages.id_codeItem}" width="300" readonlyForUpdate="true">
<dif:listPicker dataSetBeanClass="<%=TableItemscont.class%>" title="${messages.id_codeItem}">
<dif:datasetFilter attribute="<%=TableItemscont.Fields.CODETIPO%>" value="P"/>
</dif:listPicker>
</dif:pickerField>
Dados de um componente que implementa o ListPicker:
<dif:pickerField id="docenteAgendamento" width="300">
<siges:docentePicker closeOnSelect="true"/>
</dif:pickerField>


Evento onChange num dif:pickerField
Passa a ser possível indicar um código JavaScript para ser executado quando o pickerField mudar de valor.
<dif:pickerField id="<%="inserirAlunoForm"+Alunos.FK().id().CODECURSO()%>"
onChange="obterNovoCodigoAlunofunc();"
label="${messages.descCourse}" width="500">
<siges:cursoPicker/>
</dif:pickerField>


dif:textField com campo maxSize automático
O campo size se omitido passa a ser preenchido com a constraint maxSize do respetivo parâmetro caso exista.
No caso do parâmetro faça parte de um @ParameterBean, receberá o valor definido pelo campo na BD de forma autmática.
Portanto, para campos de BD, regra omitir o size. Para outros definir no parameter e não no textfield para que seja validado em ambos os pontos, client e server.


dif:formSubTitle para separadores de campos de formulários
Para normalizar este elemento gráfico que tem levadoa HTML direto nos formulário com visual diferente foi criado o componente.

<dif:fieldset border="false" layout="tabular">
<dif:formSubTitle>${messages.dadosMilitares}</dif:formSubTitle>
<dif:comboField id="idRamoMilitar" label="${messages.ramomilitar}" width="300"
dataSetBeanClass="<%=TableRamoMilitar.class%>" connectByField="idRamoMilitar"
connectTo="idPostoMilitar"/>

image.png


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