Introdução ao UIFactory

De BIS Wiki
Revisão de 19h19min de 21 de julho de 2021 por Rodrigogml (discussão | contribs) (Criou página com 'O UIFactory é uma classe estática do BIS quer facilita a criação e integração dos componentes do Vaadin baseando na estrutura do framework do BIS. Há duas maneiras dif...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

O UIFactory é uma classe estática do BIS quer facilita a criação e integração dos componentes do Vaadin baseando na estrutura do framework do BIS.

Há duas maneiras diferentes de utilizar a UIFactory:

  • Métodos Estáticos - Os métodos estáticos do UIFactory tem funções variadas que basicamente se resumem a tarefas simples como uma "macro". Por exemplo, para criar e/ou configurar um componente do Vaadin para ser colocado na tela. O que muitas vezes são linhas que se repetem para definir o padrão visual do BIS. Ao utilizar um método estático do UIFactory deixamos o código mais legível e centralizamos essas configurações.
  • Instanciando a UIFactory com um VO - Ao instanciar uma UIFactory com um objeto, a UIFactory consegue disponibiliza diversos métodos para manipular diretamente o VO passado. Bem como criar partes "padrões" da tela, como campos já interligados nos com os atributos do VO (fazendo um BIND entre campo do vaadin e atributo do VO), criar campos de filtros, gerar o BISMO a partir do conteúdo dos campos de filtro, etc.


Métodos Estáticos

Campos

createField*

O método createField(...) cria campos do Vaadin em que sejam possíveis exibir a informação de um determinado atributo. Por isso recebem a classe do VO e a informação do atributo, além de outros parâmetros de configuração do padrão visual do BIS.


Criação dos Campos
Note que este método avalia o BISMetaAnnotation do atributo e o type para gerar e configurar o campo. Os campos são criados por este método são criados conforme a primeira necessidade encontrada. No entanto é possível forçar um tipo diferente de campo para o mesmo atributo de um VO utilizando os outros métodos que tem o prefixo createField_. Cada método gera um tipo de campo diferente e tem suporte à BISMetaAnnotations específicas.


Apenas Geram os Campos
Os métodos createField*() tem apenas a função de gerar os campos. E embora recebam uma classe de VO, o atributo e algumas vezes um BISDataFormatter, esses atributos são utilizados apenas para configurações visuais e atributos específicos do campo. Como tamanho máximo, obrigatoriedade, etc. Este métodos não fazem nenhum Bind entre uma instância do VO nem forçam a formatação do BISDataFormatter ao sair do campo.


applyBISDataFormatter()

Este método aplica no evento onBlur() do componente um BISDataFormatter. Desta forma é possível manter o conteúdo de um Field formatado mesmo que o usuário coloque as informações "de qualquer jeito". Por exemplo, para manter valores com determinada precisão de casas decimais, para aplicar pontuação em um CPF/CNPJ, etc.


Não utilize junto com métodos de Bind, createVOField*() ou createMOField*()
Os métodos de Bind, createVOField e createMOField já aplicam regra para reformatação internamente. Utilizar este método em campos que já foram passados/criados por alguns desses métodos aumentará o processamento ao perder o foco, ou em alguns casos terminar em loop eterno.


bind*

Os métodos de BIND permitem que um campo do Vaadin seja "conectado" em um atributo do VO diretamente. Desta forma quando o Bind é feito, o valor do VO é sincronizado no campo da tela. E sempre que o usuário alterar o valor no campo, o valor é automaticamente processado e atribuído diretamente no VO. Assim o VO está sempre com os dados que o usuário digitou.


BISDataFormatter
O Bind permite utilizar a estrutura do BISDataFormatter para formatar e validar os dados. Quando o dado informado pelo usuário não é válido, é exibido no campo a mensagem de erro e o valor do VO não é alterado. Uma vez que o valor é inválido, fica impossível converter para o objeto do Java.

Por isso, sempre antes de confirmar uma "tela", é necessário confirmar se todos os campos têm valor válido, pois o usuário pode ter informado algum valor errado e este não estar atualizado no VO.


Há 2 métodos de Bind estáticos. Um é genérico, permite associar qualquer campo criado à qualquer Bean do java. O outro é específico para BISVO. A diferença entre um e outro é que algumas informações sobre o atributo são tirados diretamente da BISMetaAnnotation. Simplificando o código e mantendo centralizadas as configurações do atributo.


Grid

Grid Listagem

O Grid (tabela de dados) é a maneira mais comum de exibir de dados no BIS. Podendo inclusive ser utilizada para manipulação em massa.

createGridForList()

Cria um Grid para exibir dados de uma lista de Beans quaisquer. Este método aceita trabalhar com qualquer tipo de Bean, considerando que ele tenha os métodos de Get/Set disponíveis.

setUpGrid()

Este método permite que um Grid seja configurado seguindo os padrões do BIS. Ele aceita vários parâmetros que permite que o desenvolvedor defina conforme a ocasião, como por exemplo se será de Simples ou Múltipla seleção.

No entanto faz alguns preparativos no Grid que garantem o bom funcionamento do componente conforme o padrão da estrutura do BIS.

Chame este método sempre depois de criar um Grid, mesmo que manualmente, para garantir as funcionalidades padrão do BIS em relação aos Grid.

Colunas

Há algumas maneiras diferentes de se colocar colunas no Grid. Utilizando os métodos estáticos ou manualmente.

addGridColumn()

Este métodos permitem colocar uma nova coluna em um grid baseado em um atributo de um BISVO. Permitindo inclusive configurar um BISDataFormatter.

addGridGVOColumn()
Estes métodos tem a mesma função de criar colunas no Grid baseando-se no BISVO. No entanto eles aceitam o Grid que tem o VO encapsulado dentro do GVO.

O GVO<VO> é um encapsulamento utilizado nos TreeGrids e nos Grid para MO controlados pela instância do UIFactory. Mais informações sobre sua funcionalidade no JavaDoc do GVO.

Colunas Customizadas

Uma coluna customizada pode exibir exatamente o que o desenvolvedor quiser. No entanto é preciso tomar cuidado com essas decisões, pois perdemos várias automações existentes, como por exemplo a questão de "sort" pela coluna.

Exemplo Coluna Customizada
final Column<CFlowCategoryMapVO, String> categoryColumn = paramGrid.addColumn(vo -> {
  if (vo.getCategoryVO() != null) {
    switch (vo.getCategoryVO().getOperation()) {
      case EXPENSE:
        return "(-) " + vo.getCategoryVO().getName();
      case INCOMING:
        return "(+) " + vo.getCategoryVO().getName();
    }
    return vo.getCategoryVO().getName();
  }
  return "";
});

Grid Editável

Um Grid editável é um Grid normal, com algumas configurações adicionais.

setUpGridEditor()

O primeiro passo para deixar o grid editável é chamar este método. Ele fará as configurações necessárias no Grid para que fique no padrão do BIS.

Automação pelo UIFactory

Ao instanciar o UIFactory, é possível utiliza-lo para automatizar diversas funcionalidades das "telas" do sistema.

Para instanciar é necessário passar um VO, ou pelo menos a classe do VO e posteriormente definir a instância do VO pelo método setVO().

Ao fazer isso o UIFactory oferecerá vários métodos para automatizar sua manipulação.

Manipulação do VO

createVOField*()

Os métodos createVOField() criam campos utilizando os métodos estáticos de createField*(). No entanto já é feito o bind entre o campo e o VO atribuído na instância do UIFactory.

Todo campo criado por este método é registrado dentro do UIFactory para manipulações futuras.


createVOField_Custom()

Este método permite que um componente criado manualmente (fora do UIFactory), seja vinculado à um atributo de um VO. Ao chamar este método e passar o componente criado, o componente ficará registrado e passará a ser manipulado igualmente pelo UIFactory como os campos criados internamente.


getVOField()

Uma vez criado o campo pelos métodos createVOField*(), o campo pode ser recuperado pelo UIFactory através do método getVOField() passando o caminho do atributo do VO. Evitando assim que os todos os campos precisem ter uma referência de classe para ser encontrado por diferentes partes do sistema. Será necessário, no caso, apenas que a instância da UIFactory esteja disponível.


reloadVOField()

Este método faz com que os valores do VO seja recarregado no campo correspondente.


reloadVOField_All()

Este método copia o valor do VO para todos os campos registrados no UIFactory de uma única vez.

Automatização do BISMO

O UIFactory permite criar campos baseado nos atributos do VO para realizar filtros e buscas. Em geral essa funcionalidade é utilizada para aplicação de filtros em telas de listagem com Grid.


createMOField*()

Este métodos criam campos para serem utilizados na aplicação de filtros do atributo. Os campos retornados devem ser exibidos no layout da janela para entrada de dados do usuário.

Todos os campos criados por este método ficam registrados no UIFactory, e seus valores serão utilizados para a criação do BISMO do método createBISMO().


createMOField_Custom()

Este método permite que um campo seja feito manualmente pelo desenvolvedor, e ainda assim ser registrado como um campo de filtro para o BISMO.

Ao utilizar este método é necessário passar um listener, que será chamado para que o conteúdo desse campo gere o filtro necessário no BISMO. O listener é chamado toda vez que o método createBISMO() for chamado para recuperar o BISMO.


createBISMO()

Este método cria um BISMO já populado com os filtros utilizando os valores dos campos de MO. Esse BISMO pode ser utilizado para solicitação direta no banco de dados dos objetos correspondentes.


baseBISMO

O Base BISMO é um BISMO que pode ser colocado como base do BISMO criado pelo createBISMO(). Ou seja, é possível colocar um BISMO que servirá de base para o BISMO criado pelo createBISMO(). Esse BISMO de base é clonado toda vez, e colocados os filtros adicionais gerados pelos conteúdos dos combos.

Esse recurso é funcional quando queremos que um filtro esteja sempre ativo na listagem, como por exemplo esconder itens que não são excluídos, mas estão desabilitados.