Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.



CONTEÚDO

Índice
maxLevel2

01. INTRODUÇÃO / OBJETIVO

Temos como objetivo desta técnica, apresentar um MVP de como customizar as telas HTML, através de intervenções em API Rest no back-end Progress.O código de API abaixo pode possuir diferenças de estrutura comparado com a forma utilizada pelas equipes de negócio. Algumas equipes, por exemplo

Para que caso surja a necessidade do cliente final customizar o resultado de uma tela, ele possa fazer isso de forma dinâmica e em tempo de renderização.

Para isso vamos utilizar o Framework PO-UI como front-end e seus componentes dinâmicos, comunicando com back-end Datasul Progress.

Esta documentação pode ser usada tanto pelos desenvolvedores internos a fim de disponibilizar a customização no produto padrão, quanto pelos desenvolvedores externos que necessitam criar customizações nessas telas HTML. Porém, em algumas seções da documentação podem conter links disponíveis apenas para desenvolvedores internos. 

02. VISÃO GERAL

No PO-UI, uma tela dinâmica trabalha recebendo uma lista de informações que serão utilizadas para apresentar os componentes da tela, e uma outra lista contendo os dados que serão apresentados nestes componentes.

Nesta técnica, vamos apresentar como fornecer estas duas listas para o PO-UI, onde poderemos customizá-las de acordo com a necessidade.

Este guia será divido basicamente em duas partes, como vamos trabalhar no back-end Progress e acessar esses dados através do front-end PO-UI.

Abaixo temos um fluxo das informações do PO-UI até a UPC em Progress:



Informações
titleIMPORTANTE

IMPORTANTE: Esta técnica está disponível a partir da versão 12.1.29 do Framework da Linha Datasul.

03. PRÉ-REQUISITOS

Temos como pré-requisito para execução da técnica citada abaixo: 

  • API Rest desenvolvida no último padrão divulgado pelo Framework, utilizando a técnica de construção de APIs (Desenvolvimento de APIs para o produto Datasul);

  • Utilização do Framework PO-UI na última versão disponível;

  • Utilização do Framework Tomcat Datasul;

  • Utilização da técnica de customização com EPC na api do programa a ser customizado;

  • Tela preparada para a customização;

04. TÉCNICAS

Técnica Back-End Progress:

Introdução:

A técnica back-end Progress é formada pelos passos abaixo:


Construção de API REST para tela customizada:

Para que possamos customizar uma tela HTML construída em PO-UI, necessitamos que o back-end nos retorne qual o metadado e os valores da tela em questão através de uma API Rest.

Sendo assim essa API deve conter no mínimo dois endpoints básicos:

  • Endpoint que retornará o metadados da tela;

  • Endpoint para retornar os valores da tela;

Cadastro da API Rest no Cadastro de Programas (men012aa) com a respectiva UPC:

Tendo criado a API REST que retorna os dados básicos para a tela, partimos para o segundo passo, que é a preparação do endpoint da API para a customização.

Esta API deverá ser inserida no cadastro de programas (MEN012AA), onde poderemos também especificar a UPC que será utilizada.

Na técnica de construção de APIs REST é informado sobre a utilização da include "utp/ut-api.i", pois esta include identificará se a API possui uma UPC cadastrada ou não.

Informações
titleIMPORTANTE

IMPORTANTE: A UPC para APIs REST possui um formato diferenciado das UPCs Padrões e de Ponto Estratégico, pois um dos parâmetros utilizados é um JsonObject.


Técnica de customização com EPC

Utilizar a include "include/i-epcrest.i" para chamada UPC na API Rest :

Enfim para chamarmos um programa de customização, criamos uma include que fará esta chamada. Abaixo segue mais detalhes sobre esta include.

Ela encontra-se na pasta include e possui o nome i-epcrest.i, conforme o exemplo abaixo:

Bloco de código
Informações
titleIMPORTANTE

IMPORTANTE: Não é permitido misturar tipos diferentes de UPCs no mesmo programa, pois as assinaturas são incompatíveis e poderão ocorrer erros de parâmetros.


Pré-Processadores da include i-epcrest.i:

Abaixo temos a lista de pré-processadores que devem ser passados para a include i-epcrest.i:

Preprocessador

Descrição

endpoint

Especifica o endpoint que esta sendo chamado pelo HTML. Uma API REST deve possuir 1 ou mais endpoints.

event

É o nome do evento que esta ocorrendo antes de chamar a UPC. Exemplo: beforeCreate, getAll, getMetaData, etc.

jsonVar

É a variável do tipo JsonObject que será passada como INPUT-OUTPUT para a UPC.

Informações
titleIMPORTANTE

IMPORTANTE: Todas as UPCs de API REST deverão importar os seguintes pacotes:

                       USING PROGRESS.json.*.

                       USING PROGRESS.json.ObjectModel.*.

                       USING com.totvs.framework.api.*.

Parâmetros recebidos na UPC da API REST:

Parametro

Tipo

Tipo de Dados

Descrição

pEndPoint

INPUT

CHARACTER

Contém o nome do endpoint que está sendo executado.

pEvent

INPUT

CHARACTER

Contém o nome do evento que está sendo executado.

pAPI

INPUT

CHARACTER

Contém o nome da API que está sendo executada.

jsonIO

INPUT-OUTPUT

JsonObject

Contém o JSON com os dados (campos ou valores) que poderão ser customizados.


Front-End PO-UI:

Introdução:

Para termos uma tela dinâmica, de acordo com o que o back-end retorna, precisamos utilizar os componentes dinâmicos ou as templates do PO-UI sendo eles:

Componentes:

  • Dynamic-Form;

  • Dynamic-View.

Templates:

  • Page-Dynamic-Detail;

  • Page-Dymic-Edit;

  • Page-Dynamic-Search;

  • Page-Dynamic-Table.

Comunicando com o Back-End Progress:

Basicamente para comunicar com o back-end teremos que ter dois serviços que irão alimentar as informações para tela:

  • Metadado

    • Serviço que irá retornar os campos e as propriedades da tela;

  • Values

    • Serviço que irá retornar os valores dos campos;


05. EXEMPLO DE UTILIZAÇÃO

Back-End Progress

Introdução:

Para exemplificar a técnica citada acima, criamos uma API Rest que irá retornar os dados da tabela de idiomas, chamando uma UPC que acrescenta algumas informações da tabela usuar_mestre.

Cadastro da UPC:

Primeiramente temos que cadastrar a API REST no cadastro de programas (MEN012AA) e também especificar a UPC a ser utilizada, conforme o exemplo abaixo:


Aviso

Atenção:

  • Ao cadastrar uma API e sua EPC, o nome externo da API/ENDPOINT NÃO deve possuir extensão.

  • Caso o PASOE esteja em um servidor Linux, no campo "Programa UPC" deve-se utilizar "/"(barra) entre os diretórios no lugar de "\"(contrabarra), ou o programa não será encontrado causando erro na execução.

  • Caso seja utilizado um caminho relativo, exemplo "upc/nome_upc.p", deve ser ajustado o propath do PASOE para conter o diretório raiz, pois o programa upc será executado no PASOE.


Na aba Opções, teremos que especificar o Template como "API REST", conforme o exemplo abaixo:


Acessar a opção "Grupo de segurança" e configurar os grupos de segurança que terão acesso à API que está sendo cadastrada.

API Rest com chamada de UPC:

Abaixo temos um exemplo de API REST com suas procedures que são:

  • pGetMetaData que retorna os metadados das telas;

  • pFindAll que retorna os valores dos campos em questão;

  • pFindById que retorna um registro de um determinado ID;

  • pCreate que cria um novo registro;

  • pUpdateById que altera um registro de um determinado ID;

  • pDeleteById que elimina 1 ou mais registros.

Como podemos verificar todas as procedures possuem chamadas para o programa de UPC:

Aviso
titleAtenção

O código de API apresentado a seguir pode possuir diferenças de estrutura comparado com a forma utilizada pelas equipes de negócio. Algumas equipes, por exemplo, criam um programa para as regras de negócio e fazem chamadas a esse programa nos métodos das APIs.
O importante aqui é atentar-se às técnicas utilizadas para disponibilizar os pontos de acesso à UPC, para que seja possível customizar a tela. 

Bloco de código
titleAPI REST - idiomas.p
linenumberstrue
collapsetrue

Programa UPC:

Abaixo temos um exemplo de uma UPC criada para a API REST:

Bloco de código
titleExemplo de UPC da API REST - upc-idioma.p
linenumberstrue
collapsetrue

Resultado ao chamar à API tendo uma UPC cadastrada:

Ao fazer as requisições, virão os seguintes resultados na UPC.

Bloco de código
titleResultado de leituras no backend Progress
linenumberstrue
collapsetrue

Front-End PO-UI

Introdução:

Para este exemplo vamos criar um CRUD com template dinâmico, onde serão mostrados os dados de acordo com o que o back-end retornar.

O desenvolvimento do front-end utilizando este campo componente se divide basicamente em três partes:

  • Routes:

    • Na definição da rota é onde vamos definir todos os caminhos dos componentes;

  • HTML

    • No HTML basta colocarmos os componentes, pois o metadados irá retornar o que precisamos para renderizar o componente;

  • TypeScript

    • No Typescript do componente vamos realizar uma pequena lógica para o tratamento dos dados de acordo com metadado;


Abaixo vamos mostrar como ficaram a parte de Listagem, Edição e Detalhe do nosso CRUD dinâmico.

Routes:

Abaixo segue exemplo de como ficará o arquivo de rotas de nossa aplicação CRUD.

Bloco de código
languagejs
titleapp-routing.module.ts
linenumberstrue
collapsetrue

Listagem:

É a tela inicial da nossa aplicação e mostra a lista de dados da tabela Idioma, onde foram adicionados através de customização três campos da tabela usuar_mestre. Esta tela dará acesso às outras funcionalidades como edição e detalhamento.

Bloco de código
languagexml
titleListagem - idioma-list.componente.html
linenumberstrue
collapsetrue
Bloco de código
languagejs
titleListagem - idioma-lista.component.ts
linenumberstrue
collapsetrue

Edição: 

Esta tela permite a inclusão de um novo registro na tabela Idioma e também a alteração de registros já existentes.

Bloco de código
languagexml
titleEdição: idioma-edit.component.html
linenumberstrue
collapsetrue
Bloco de código
languagejs
titleEdição - idioma-edit.component.ts
linenumberstrue
collapsetrue

Detalhe:

Esta tela apresenta os detalhes de um registro de Idioma, com suas customizações.

Bloco de código
languagexml
titleDetalhe: idioma-detail.component.html
linenumberstrue
collapsetrue
Bloco de código
languagejs
titleDetalhe: idioma-detail.component.ts
linenumberstrue
collapsetrue

06. VALIDAÇÃO DE COMPONENTES

Para os itens a seguir, são apresentados algumas formas de interação com os componentes presentes na interface, bem como possíveis validações sobre os mesmos. 

Esconder ou visualizar os campos

Como a geração da tela dinâmica é automática, para esconder determinados campos basta setar o atributo visible para FALSE na montagem do JsonObject de retorno do metadados. 

Bloco de código
languagejs
titleEsconder campos na interface
linenumberstrue
collapsetrue

Validação de componentes na interface

Uma boa prática em desenvolvimento de telas é a validação de alguns campos na própria interface, cujo intuito é reduzir requisições desnecessárias ao 'back-end'. As funcionalidades apresentadas a seguir podem ser utilizadas em conjunto com a validação do próprio Form ([p-disable-submit]="formEdit.form.invalid"), no qual pode desabilitar o botão de confirmação enquanto houver campos inválidos.

Utilização do pattern (RegEx)

Para a validação de campos textos, pode ser utilizado o atributo pattern qualquer expressão regular, caso não atenda ao RegEx, uma mensagem de erro definida em errorMessage é apresentada em tela. 

Bloco de código
languagejs
titleUtilização de pattern
linenumberstrue
collapsetrue

Utilização de limites em numeração

Com a utilização dos atributos minValue e maxValue, é possível efetuar a restrição de períodos da numeração que pode ser utilizado em conjunto com o type para restringir a digitação em somente números. Caso houver números inválidos, a mensagem definida em errorMessage é apresentada na tela.

Bloco de código
languagejs
titleUtilização intervalo de valores
linenumberstrue
collapsetrue

Utilização de máscaras para os campos

Quando é definida uma máscara mask, ocorre a restrição de digitação no próprio campo. Para o exemplo abaixo, é permitido digitar somente números e ao efetuar a digitação, a máscara será aplicada automaticamente.

Bloco de código
languagejs
titleUtilização de máscaras
linenumberstrue
collapsetrue

Validações no back-end

O po-dynamic-form permite dois tipos de validações, a validação do formulário completo ou por campo.

A validação do formulário completo vamos detalhar mais a frente.

A validação por campo é feito através da validação campo-a-campo, onde você conseguirá alterar algumas características do campo que esta sendo validado.

Aviso

Nas validações de campos é possível somente alterar as características do próprio campo validado, onde não é permitido alterar nas características de outros campos.

Bloco de código
languagejs
titleUtilização de validação de campo
linenumberstrue
collapsetrue


A adição da tag validate na definição do campo, onde deverá ser especificado a URL de validação, fará com que sempre que o campo for alterado pelo usuário, será enviado uma requisição para o back-end para realizar a validação desse campo.

JSon que recebemos da tela HTML

O componente PO-DYNAMIC-FORM, quando ocorre alguma alteração em seus campos, no LEAVE do campo, ele enviará um JSon com o seguinte formato para o back-end:

Tag

Tipo

Descrição

property

Character

Contêm o nome do campo que houve a alteração para ser validado.

value

Any

Contêm o valor atual do campo para ser validado. O tipo é o conforme o campo validado.


Onde o back-end receberá o seguinte JSon:

Bloco de código
languagejs
titleJSON enviado para o back-end de validação do campo
linenumberstrue
collapsetrue


JSon que retornamos para a tela HTML

A validação do campo, aguarda o seguinte formato de JSon:

Tag

Tipo

Descrição

value

Any

Contêm o novo valor para o campo. O tipo é o conforme o campo validado.

field

JSonObject

Contêm uma lista de propriedades que serão alteradas. OBS: Estas propriedades tem efeito somente sobre o campo que está sendo validado.

focus

Logical

Informa se o campo validado deverá ou não receber o focus.

_messages

JSonArray

Contêm uma lista de mensagens "de erro" que podem ser apresentadas ao voltar para o HTML.


O back-end, após processar e realizar a validação necessária, retornará para o front-end o seguinte JSon:

Bloco de código
languagejs
titleJSON de retorno do back-end da validação de campo
linenumberstrue
collapsetrue


Para utilizarmos a UPC de customização, tivemos que encapsular o JSon recebido no back-end, dentro da procedure pValidateField, e também o JSon a ser enviado para a tela HTML, conforme o exemplo abaixo:

Bloco de código
languagejs
titleJSon encapsulado para UPC de Validação de Campos
linenumberstrue
collapsetrue


Neste nosso exemplo, nós dividimos o JSon a ser enviado para UPC em três partes, que são:

Tag

Tipo

Descrição

property

Character

Contém o nome do campo que esta sendo validado.

value

Any

Contém o valor atual do campo para ser validado. O tipo é o conforme o campo validado.

root

JSonObject

Contém um JSonObject com que será retornado para o HTML e que poderá ser customizado na UPC. Tudo que for customizado deverá estar dentro desta tag.


Exemplo de JSon recebido pela UPC:

Bloco de código
titleJSon recebido na UPC para Validação do Campo
linenumberstrue
collapsetrue


Após a customização pela UPC, será devolvida para a API Rest apenas a tag root, com as customizações necessárias, conforme o exemplo abaixo onde temos o resultado de uma customização:

Bloco de código
titleJSon retornado pela UPC para Validações
linenumberstrue
collapsetrue

07. VALIDAÇÃO DE FORMULÁRIOS

O quê deve ser alterado no componente PO-DYNAMIC-FORM

Para validarmos um formulário, temos que configurar primeiro o nosso componente po-dynamic-form para ficar apto a enviar as ocorrências de validações. Para isso temos que especificar algumas propriedades no componente po-dynamic-form, são elas:

  • p-validate: onde informamos a URL que fará a validação do formulário, neste exemplo será "/api/trn/v1/idiomas/validateForm".

  • p-validate-fields: somente o p-validate não fará com que as requisições de validação sejam executadas, é preciso definir a propriedade p-validate-fields que recebe um array de strings (Ex.: ['codIdioma','desIdioma']) com os campos que irão disparar a requisição ao serviço indicado na propriedade validate, quando estes forem alterados. Essa informação deve vir no metadata de edição para que seja possível customizar as validações de formulário.

Bloco de código
languagejs
titleTag p-validate no po-dynamic-form
linenumberstrue
collapsetrue
Aviso

As validações de formulário validam somente os campos já existentes no formulário, sejam eles campos padrões ou inseridos nas customizações, não é permitido adicionar novos campos através da validação de formulário. Para adicionar novos campos deve-se utilizar a inserção no back-end alterando os retornos dos endPoints de metadata e dados da API, seja alterando o produto padrão ou via customização.

JSon que recebemos da tela HTML

O componente PO-DYNAMIC-FORM, quando ocorre alguma alteração nos campos indicados no validateFields e ao sair destes campos, realizará uma requisição ao endPoint de validateForm e enviará um JSon com o seguinte formato para o back-end:

Tag

Tipo

Descrição

property

Character

Contém o nome do campo que houve a alteração.

value

JSonObject

Contém os valores atuais de todos os atributos utilizados pelos campos do formulário.


Exemplo de Json:

Bloco de código
languagejs
titleJSon enviado pelo HTML para validação dos campos
linenumberstrue
collapsetrue


JSon que teremos que retornar para a tela HTML

As validações do formulário, aguardam o seguinte formato de JSon:

Tag

Tipo

Descrição

value

JSonObject

Objeto com os valores que devem ser alterados. Todos os campos que devem ter seu valor alterado no formulário devem ser informados nesse objeto, aqueles que não devem ser alterados não precisam estar referenciados.

fields

JSonArray

Contêm uma lista de campos com as suas propriedades que serão alteradas. Se não for alterada nenhuma propriedade de nenhum campo, não é necessário informar essa tag.

focus

Character

Contêm o campo que receberá o foco ao voltar para a tela HTML. Informar o atributo property do campo.

_messages

JSonArray

Contêm uma lista de mensagens "de erro" que deverão ser apresentadas ao voltar para o HTML.


Para retornar as informações para o PO-UI, temos que devolver o seguinte JSon:

Bloco de código
languagejs
titleJSon de retorno do backend para o HTML
linenumberstrue
collapsetrue


Para utilizarmos a UPC de customização, tivemos que encapsular o JSon recebido no back-end, dentro da procedure pValidateForm, e tambem o JSon a ser enviado para a tela HTML, conforme o exemplo abaixo:

Bloco de código
languagejs
titleJSon empacsulado para UPC de Validação de Formulários
linenumberstrue
collapsetrue


Neste nosso exemplo, nós dividimos o JSon a ser enviado para UPC em três partes, que são:

Tag

Tipo

Descrição

property

Character

Comtêm o nome do campo que esta sendo validado.

originalValues

JsonObject

Contêm um JSonObject com propriedades contendo os nomes dos campos e os seus respectivos valores.

root

JSonObject

Contêm um JSonObject com que será retornado para o HTML e que poderá ser customizado na UPC. Tudo que for customizado deverá estar dentro desta tag.


Exemplo de JSon recebido pela UPC:

Bloco de código
titleJSon recebido na UPC para Validação do Formulário
linenumberstrue
collapsetrue


Após a customização pela UPC, será devolvido para a API Rest apenas o conteúdo da propriedade root, com as customizações necessárias, conforme o exemplo abaixo onde temos o resultado de uma customização:

Bloco de código
titleJSon retornado pela UPC para Validações
linenumberstrue
collapsetrue

Trabalhando com vários formulários (Dynamic Form)

Em algumas situações precisamos utilizar vários componentes Dynamic Form em uma tela, quando precisamos agrupar campos seja utilizando um po-tabs ou po-accordion, por exemplo.
Nesse caso, há uma questão com relação a validação de formulários. Quando um campo dispara uma validação que altera características de um campo que está em outro formulário, essa validação não é realizada, sendo necessário realizar um tratamento diferente no front-end para o correto funcionamento.

A técnica consiste em atribuir uma função typescript ao p-validate do formulário, nessa função realizar a requisição ao back-end para o endpoint de validação e com o resultado dessa validação atualizar as variáveis de modelo utilizadas em todos os formulários.
Para facilitar esse tratamento foi criada a classe ValidateService no pacote de utilitários Dts-Backoffice-Utils. Você pode utilizar esse pacote para facilitar o desenvolvimento, ou caso prefira, pode copiar o tratamento realizado para o seu projeto.

Segue abaixo os links do projeto:

08. FACILITADORES PROGRESS

Criamos facilitadores para auxiliar no desenvolvimento das API's, ficam localizados na classe Progress "com.totvs.framework.api.JsonAPIUtils":

Método

Descrição

Assinatura/Exemplo

convertAblTypeToHtmlType

Converte os tipos nativos do Progress para os tipos esperados pelo PO-UI

Assinatura:

convertAblTypeToHtmlType (INPUT cType AS CHARACTER)

Exemplo:

ASSIGN cType = JsonAPIUtils:convertAblTypeToHtmlType ("integer").

O retorno no cType será "number", que é um formato reconhecido pelo PO-UI.

convertToCamelCase

Converter os nomes dos campos lidos da tabela, normalmente com "_", para "camel case", que é o mais comum utilizado em Json's.   

Assinatura:

convertToCamelCase (INPUT cKey AS CHARACTER)

Exemplo:

ASSIGN cField= JsonAPIUtils:convertToCamelCase ("cod_e_mail_usuar").

O retorno no cField será "codEMailUsuar", que é o campo em Camel Case.

getIdField

Retorna um campo do tipo ID para ser adicionado na lista de campos do Metadata. Este campo serve como chave do registro nos tratamentos de CRUD na parte HTML.

Assinatura:

getIdField()

Exemplo:

oIdiomas:add( JsonAPIUtils:getIdField() ).

09. TÉCNICA PARA TRADUÇÃO

A técnica para tradução de label, possui como base as recomendações de i18n do PO UI (https://po-ui.io/documentation/po-i18n) com algumas características adicionais. A seguir serão apresentadas alguns trechos de código que representam a utilização desta técnica de tradução em conjunto com formulários dinâmicos.

Para diferenciar a label que devem ser traduzida, deve-se inserir a key de tradução entre os caracteres chaves. Exemplo: { key }

Bloco de código
titleTrecho código - idiomas_upc.p
collapsetrue


Conforme a arquitetura de customização apresentada anteriormente, deve-se aguardar o resultado da requisição ao serviço metadata e posteriormente, efetuar os seus devidos tratamentos de tradução. 

Bloco de código
titleTrecho código - idioma-list.components.ts
collapsetrue


Para que o ponto de tradução seja único e compatível com as técnicas recomendadas pelo PO UI, deve-se efetuar o tratamento no front-end. Recomenda-se que seja realizado na função que retorna a lista de fields pois neste momento, são carregados todos os campos correspondentes à tela. 

Bloco de código
titleTrecho código - idioma.service.ts
collapsetrue


A arquitetura de tradução do PO UI cita: "... Existe também a possibilidade de utilizar ambos, onde será feito a busca das literais nas constantes e depois efetua a busca no serviço ...". Portanto pode-se configurar os arquivos de tradução com um serviço (URL) que retorna as literais adicionais desenvolvidas no "back-end", sendo assim, um complemento ao arquivo.

Observação: O exemplo da URL abaixo não segue as recomendações do PO UI (api/translations/idiomas). Foi desenvolvido em uma estrutura diferente para facilitar os códigos a conceito de POC.  

Bloco de código
titleTrecho código - app.module.ts
collapsetrue


Para o endpoint de tradução, pode ser utilizado uma chamada UPC conforme trecho de código a seguir:

Bloco de código
titleTrecho código - idiomas.p
collapsetrue


A Procedure correspondente ao serviço (URL) citado anteriormente, deve retornar um objeto no formato JSON de acordo com o idioma enviado por parâmetro.

Nota
titleNota

O exemplo a seguir efetua o tratamento somente do parâmetro language. Segundo a documentação do PO UI, outros parâmetros (context, literals) podem ser enviados, sendo necessária uma futura implementação de seu recebimento no back-end.

Bloco de código
titleTrecho código - idiomas_upc.p
collapsetrue

10. COMO DOCUMENTAR A TELA QUE PERMITE CUSTOMIZAÇÃO

Aviso
titleConteúdo interno!

Abaixo segue o link da documentação que ira auxiliar a documentar a tela que permite a customização e assim manter o padrão de desenvolvimento tanto na parte técnica, quanto na documentação das telas:

Documentação Customização HTML PO-UI  

e a pagina com exemplo de como deve ficar a documentação:

https://tdn.totvs.com/display/public/EN/Exemplo 

11. DICAS PARA DESENVOLVER UMA CUSTOMIZAÇÃO

As informações do que pode ser customizado na tela, em qual API REST deve ser cadastrada a UPC, quais os pontos e eventos de UPCexistentes, entre outras informações, podem ser localizadas no documento de customização da tela. 
Esse documento geralmente é disponibilizado juntamente com o documento de referência da tela.
Porém, em alguns casos pode ainda não ter haver existir essa documentação para mesmo algumas telas que permitem a permitindo alguma customização, então abaixo seguem algumas dicas onde de como podem ser obtidas algumas informações.

Expandir
titleComo saber qual a API REST utilizada pela tela HTML?
  1. Acessando a tela, clicando com o botão direito do mouse, pode-se utilizar a opção "Inspecionar" do navegador (F12). Essa opção irá abrir a "ferramenta do desenvolvedor". 
  2. Na opção Rede (Network) podem ser visualizadas as chamadas feitas pela tela e dentre elas estão as requisições para a API REST. Porém, atente-se ao fato de que, somente serão apresentadas as requisições executadas após o acionamento da funcionalidade de inspeção (F12). Portanto, caso a requisição que você deseja visualizar seja feita na abertura da tela, acione o F12 antes mesmo de executar a tela. 
  3. Uma tela desenvolvida com PO UI que permite customização, geralmente vai executar uma requisição para o endPoint "metadata". Procure por essa chamada na lista apresentada.
  4. Ao clicar na requisição do "metadata", serão apresentadas as informações dessa requisição. Na aba Cabeçalhos (Headers) será possível verificar a URL da API utilizada.
  5. Na aba Resposta (Response) é possível verificar o conteúdo retornado pela API com as informações que compõem a tela.

Expandir
titleComo saber quais os pontos de UPC são executados nessa tela?
  1. Cadastre uma UPC para a API Rest conforme apresentado no inicio dessa documentação.
  2.  Adicione linhas de logs na sua UPC para que sejam impressos os parâmetros recebidos por ela, conforme exemplo abaixo.

    Bloco de código
    titleUPC
    USING PROGRESS.json.*.
    USING PROGRESS.json.ObjectModel.*.
    USING com.totvs.framework.api.*.
     
    DEFINE INPUT        PARAMETER pEndPoint AS CHARACTER  NO-UNDO.
    DEFINE INPUT        PARAMETER pEvent    AS CHARACTER  NO-UNDO.
    DEFINE INPUT        PARAMETER pAPI      AS CHARACTER  NO-UNDO.
    DEFINE INPUT-OUTPUT PARAMETER jsonIO    AS JSONObject NO-UNDO.
    
    DEFINE VARIABLE jsonContent AS LONGCHAR NO-UNDO.
    
    //Repassa o conteúdo do JSON em formato de texto do parâmetro jsonIO para uma variável longchar
    jsonContent = jsonIO:GetJsonText().
    
    LOG-MANAGER:WRITE-MESSAGE("UPC EndPoint = " + pEndPoint, ">>>>").
    LOG-MANAGER:WRITE-MESSAGE("UPC Event = " + pEvent, ">>>>").
    LOG-MANAGER:WRITE-MESSAGE("UPC pAPI= " + pAPI, ">>>>").
    LOG-MANAGER:WRITE-MESSAGE("UPC jsonIO = " + STRING(jsonContent), ">>>>").
  3. Diferente de uma UPC de tela Progress que é executada no client e as mensagens são apresentadas em tela, essa UPC será executada pelo servidor PASOE, portanto precisa estar acessível no PROPATH do PASOE e ao executar a tela Web, as mensagens de log serão impressas no log do PASOE. Portanto, é necessário ter acesso ao arquivo de log do PASOE do ambiente testado. 


12. LINKS ÚTEIS


Aviso
titleConteúdo interno!

Link da documentação: desenvolvimento HTML Estático x Dinâmico

https://tdninterno.totvs.com/pages/releaseview.action?pageId=834824110


Documentação API Datasul:

Desenvolvimento de APIs para o produto Datasul

PO-UI:

13. CONCLUSÃO

A ideia era apresentar uma técnica para que possibilita-se as áreas de negócio, de forma segura e simples, disponibilizarem pontos de customização em suas API’s REST.

Acreditamos que a técnica apresentada permite que o back-end Progress acompanhe a evolução dos componentes PO-UI.

Com a parte de validação do formulário é possível tratar e validar os campos de acordo com a lógica de negócio que ocorre no back-end, onde sempre será recebido na API REST o campo que está sendo alterado e todos os valores dos demais campos da tela.

Na parte de validação por campo, é recebido na API REST somente o nome do campo e o seu valor atual. Acho importante informar que não é enviado o ID do registro, onde teremos que tomar cuidado para não perder o contexto do registro que estamos validando.

Contamos com seu feedback e sugestões para manter a melhoria continua nas documentações.