Árvore de páginas

Versões comparadas

Chave

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

...

2) Endpoint progress da área de negócio - Serve para obter os dados que serão apresentados nos campos personalizados;Sugerimos que essa API REST contenha os seguintes endpoints para um bom funcionamento:

Abaixo temos uma tabela que mostra os componentes dinâmicos do PO-UI com as respectivas requisições à API REST

Componente PO-UIEndpointTipo RequisiçãoDescrição

po-dynamic-view

po-dynamic-form

/byid/nome_do_programa/idGET

Serve para retornar um registro único, onde recebera no PathParms o "nome do programa" e o "id".

po-page-dynamic-table/nome_do_programaGETServe para retornar uma lista de registros, onde receberá no PathParams o "nome do programa".
po-dynamic-form/validateForm/nome_do_programaPOSTServe para validar o formulário, onde receberá no PathParams o "nome do programa".
po-dynamic-form/nome_do_programaPOSTServe para criar um novo registro, onde receberá no PathParams o "nome do programa".
po-dynamic-form/nome_do_programa/idPUTServe para alterar um registro, onde receberá no PathParams o "nome do programa" e o "id".
po-dynamic-form/nome_do_programa/idDELETEServe para eliminar um registro, onde receberá no PathParams o "nome do programa" e o "id".

Utílitário para facilitar

Para facilitar

3) Criação pela área de negócio de um componente PO-DYNAMIC-FORM e PO-DYNAMIC-VIEW. Se desejar, criar também um componente PO-DYNAMIC-TABLE, que servirá para navegar nos registros e permitir a visualização e edição dos registros personalizados.

Explicando o funcionamento da técnica:

O componente PO-DYNAMIC-FORM servirá para a edição e criação de um novo registro personalizado.

O componente PO-DYNAMIC-VIEW servirá para a visualização do registro personalizado.

Já o componente PO-PAGE-DYNAMIC-TABLE, caso você tenha criado, servirá para navegar nos registros e chamar as ações de Inclusão, Alteração e Eliminação de registros.

Os componentes dinâmicos do PO-UI funcionam da seguinte forma:

1) Serão feitas duas requisições ao servidor REST, uma para obter a lista de campos e outra para obter a lista de dados a serem apresentados;

2) Para buscar os valores dos dados a serem apresentados, será enviado o código do programa personalizado e também um id do "registro corrente" para obtenção dos valores;

3) Para buscar a lista de campos personalizados utilizando o endpoint progress fornecido pelo framework, que é o /api/btb/v1/personalizationView/metadata/ + codigo_do_programa.

05. EXEMPLO DE UTILIZAÇÃO

Cadastro de campos personalizados

A seguir são apresentados as telas necessárias para a realização do cadastro dos campos personalizados.

Ao localizar no menu o programa "Campos personalizados (html.personalization-metadata)", é apresentada uma tela em formato de 'lista' que conterá todos os campos (metadados) cadastrados no produto Datasul. Para cadastrar um campo que será utilizado na personalização, basta clicar no botão +Adicionar.

Image Removed

A tela a seguir apresenta o cadastro do 'metadado' relacionado a um campo que pode ser apresentado no programa como personalizado.

Image Removed

...

Código do programa "base" que podem ser aplicadas as técnicas de personalização

Nota
titleNota

É possível cadastrar os campos somente em programas que permitem a personalização

...

Identificador Campo

...

Nome Campo

...

Nome do campo que será apresentado na tela (label do campo)

Caso o campo não seja informado, o nome do campo apresentado será o informado no identificador.

...

Tipo do campo cadastrado

Caso o campo não seja informado, será considerado que o campo é do tipo string

Tipos de campos permitidos:

Tipo JavaScriptTipo ProgressDescrição
booleanlogicalValores lógicos
currencydecimalValores monetários
datedate

Valores de datas. 

Aceita os tipos string e Date padrão do Javascript, por exemplo: '2017-11-28' ou new Date(2017, 10, 28).

datetimedatetime

Valor de data com horário.

Aceita o tipo string no formato ISO-8601 estendido 'yyyy-mm-ddThh:mm:ss+|-hh:mm' e o tipo Date padrão

numberintegerValores numéricos
stringcharacterTextos
Informações
titleDica

Sugerimos a utilização do facilitador progress "com.totvs.framework.api.JsonAPIUtils", que faz a conversão dos tipos da dados do progress

para tipo de dados JavaScript e contêm o método abaixo :

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.

...

Caso o campo possuir alguma validação de máscaras, restrição de valores, é necessário informar neste campo (máscara de formatação do campo)

Exemplos:

Em um campo personalizado CNPJ, utilizamos o formato de exibição '99.999.999/9999-99'.

...

Informações

Observação: Em todas os componentes dinâmicos da tabela acima farão uma requisição para obter a lista de campos personalizados na API REST do framework, através da requisição "/api/btb/v1/personalizationView/metadata/" + código_do_programa


Utilitário facilitador no Progress

Foi criado no progress o utilitário btb/personalizationUtil.p, com seu include btb/personalizationUtil.i, que serverá para retornar para a área de negócio a lista de campos personalizáveis de um determonado programa, isso facilita para que seja enviado somente os valores dos campos personalizáveis. Por característica do PO-UI dinâmico, caso seja enviado os dados de campos que nao estão na lista de campos, o PO-UI irá apresentar o valor do campo com um label sendo o mesmo nome do campo. Obtendo essa lista de campos, podemos evitar o envio de informações que estão fora dessa lista de campos personalizados.


Include btb/personalizationUtil.i

Bloco de código
firstline1
titleInclude btb/personalizationUtil.i
linenumberstrue
DEFINE TEMP-TABLE ttPersonalization NO-UNDO 
    FIELD codProgDtsul AS CHARACTER
    FIELD codField     AS CHARACTER
    FIELD codType      AS CHARACTER
    FIELD codLabel     AS CHARACTER
    FIELD codValid     AS CHARACTER
    FIELD logReadOnly  AS LOGICAL INITIAL FALSE
    FIELD logEnable    AS LOGICAL INITIAL TRUE
    INDEX codigo IS PRIMARY codProgDtsul codField.


Procedures disponíveis no programa btb/personalizationUtil.p:

ProcedureParâmetrosDescrição/Exemplo
piGetTTPersonalizaton

INPUT cProg AS CHARACTER

OUTPUT TABLE ttPersonalization

Retorna a temp-table ttPersonalization com a lista de campos personalizáveis de um determinado programa.

Exemplo:

Bloco de código
firstline1
titleExemplo de chamada do utilitário btb/personalizationUtil.p
linenumberstrue
collapsetrue
{ btb/personalizationUtil.i }

DEFINE VARIABLE hPers AS HANDLE NO-UNDO.

RUN btb/personalizatinUtil.p PERSISTENT SET hPers.
RUN piGetTTPersonalizaton IN hPers ("codigo_do_programa", OUTPUT TABLE ttPersonalization).
DELETE PROCEDURE hPers.
piGetFieldList

INPUT cProg AS CHARACTER

OUTPUT cList AS CHARACTER

OUTPUT cTypeList AS CHARACTER

Retorna duas listas caracter, uma contendo a lista de campos e uma lista dos seus respectivos tipos, de um determinado programa.

OBS: As listas usam como separador a vírgula ",".

Exemplo:

Bloco de código
firstline1
titleExemplode chamada de procedure
linenumberstrue
collapsetrue
DEFINE VARIABLE hPers     AS HANDLE    NO-UNDO.
DEFINE VARIABLE cList     AS CHARACTER NO-UNDO.
DEFINE VARIABLE cTypeList AS CHARACTER NO-UNDO.

RUN btb/personalizatinUtil.p PERSISTENT SET hPers.
RUN piGetFieldList IN hPers ("codigo_do_programa", OUTPUT cList, OUTPUT cTypeList).
DELETE PROCEDURE hPers.


3) Criação pela área de negócio de um componente PO-DYNAMIC-FORM e PO-DYNAMIC-VIEW. Se desejar, criar também um componente PO-PAGE-DYNAMIC-TABLE, que servirá para navegar nos registros e permitir a visualização e edição dos registros personalizados.

Explicando o funcionamento da técnica:

Todos os componentes dinâmicos do PO-UI realizam, no mínimo, duas requisições REST, uma para obter a lista de campos personalizáveis e outra para obter os dados a serem apresentados nesses campos.

Abaixo temos o papel de cada componente dinâmico que podemos utilizar:

  • O componente PO-DYNAMIC-FORM servirá para a edição e criação de um novo registro personalizado;
  • O componente PO-DYNAMIC-VIEW servirá para a visualização do registro personalizado;
  • O componente PO-PAGE-DYNAMIC-TABLE, caso você tenha criado, servirá para navegar nos registros e chamar as ações de: Inclusão, Alteração e Eliminação de registros.

Na nossa técnica, em todas as requisições REST, será enviado

2) Para buscar os valores dos dados a serem apresentados, será enviado o código do programa personalizado e também um id do "registro corrente" para obtenção dos valores;

3) Para buscar a lista de campos personalizados utilizando o endpoint progress fornecido pelo framework, que é o /api/btb/v1/personalizationView/metadata/ + codigo_do_programa.


05. EXEMPLO DE UTILIZAÇÃO

Cadastro de campos personalizados

A seguir são apresentados as telas necessárias para a realização do cadastro dos campos personalizados.

Ao localizar no menu o programa "Campos personalizados (html.personalization-metadata)", é apresentada uma tela em formato de 'lista' que conterá todos os campos (metadados) cadastrados no produto Datasul. Para cadastrar um campo que será utilizado na personalização, basta clicar no botão +Adicionar.

Image Added


A tela a seguir apresenta o cadastro do 'metadado' relacionado a um campo que pode ser apresentado no programa como personalizado.

Image Added

CampoDescriçãoObrigatório
Código Programa Datasul

Código do programa "base" que podem ser aplicadas as técnicas de personalização

Nota
titleNota

É possível cadastrar os campos somente em programas que permitem a personalização

Sim

Identificador Campo

Identificador único do campo (por programa), necessário para a geração da tela personalizada (código do campo)Sim

Nome Campo

Nome do campo que será apresentado na tela (label do campo)

Caso o campo não seja informado, o nome do campo apresentado será o informado no identificador.

Não
Tipo Campo

Tipo do campo cadastrado

Caso o campo não seja informado, será considerado que o campo é do tipo string

Tipos de campos permitidos:

Tipo JavaScriptTipo ProgressDescrição
booleanlogicalValores lógicos
currencydecimalValores monetários
datedate

Valores de datas. 

Aceita os tipos string e Date padrão do Javascript, por exemplo: '2017-11-28' ou new Date(2017, 10, 28).

datetimedatetime

Valor de data com horário.

Aceita o tipo string no formato ISO-8601 estendido 'yyyy-mm-ddThh:mm:ss+|-hh:mm' e o tipo Date padrão

numberintegerValores numéricos
stringcharacterTextos
Informações
titleDica

Sugerimos a utilização do facilitador progress "com.totvs.framework.api.JsonAPIUtils", que faz a conversão dos tipos da dados do progress

para tipo de dados JavaScript e contêm o método abaixo :

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.

Não
Validação Campo

Caso o campo possuir alguma validação de máscaras, restrição de valores, é necessário informar neste campo (máscara de formatação do campo)

Exemplos:

Em um campo personalizado CNPJ, utilizamos o formato de exibição '99.999.999/9999-99'.

Não
Somente LeituraOpção para que o campo seja apresentado como 'somente leitura' (torna o campo readOnly)Sim
Habilita personalizaçãoOpção para habilitar ou desabilitar a apresentação da personalização por campo (torna o campo visível)Sim


Após cadastrar o campo, o mesmo é apresentado na tela inicial onde pode ser realizado filtros sobre seus resultados, bem como efetuar ações de edição ou exclusão.

Image Added


Ao clicar na opção de editar, não será possível modificar o código do programa Datasul vinculado e também seu identificador. Os demais campos estão habilitados para edição.

Image Added


Componentes PO-UI

Abaixo temos os códigos da parte HTML e TypeScript, que são:

1) Componente HTML (personalization-detail.component.html)

Bloco de código
languagexml
firstline1
titleComponente PO-UI
linenumberstrue
collapsetrue
<po-loading-overlay
  [hidden]="!showLoading">
</po-loading-overlay>

<po-page-detail
  p-title="Detalhe do Idioma"
  [p-breadcrumb]="breadcrumb"
  (p-edit)="editClick()"
  (p-back)="goBackClick()">

  <po-dynamic-view
    [p-fields]="fields"
    [p-value]="record">
  </po-dynamic-view>

</po-page-detail


2) Componente TypeScript (personalization-detail.component.ts)

Bloco de código
languagejs
firstline1
titleComponente TypeScript
linenumberstrue
collapsetrue
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { PoBreadcrumb, PoBreadcrumbItem } from '@po-ui/ng-components';

import { PersonalizationService } from '../personalization.service';

@Component({
  selector: 'app-personalization-detail',
  templateUrl: './personalization-detail.component.html',
  styleUrls: ['./personalization-detail.component.css']
})

export class PersonalizationDetailComponent implements OnInit {
  public static cProg = 'html.aplicativos-eai';

  // definicao das variaveis utilizadas
  public currentId: string;
  public fields: Array<any> = [];
  public record = {};
  public showLoading = false;

  public breadcrumb: PoBreadcrumb = { items: [] };
  public breadcrumbItem: PoBreadcrumbItem;

  // construtor com os servicos necessarios
  constructor(
    private service: PersonalizationService,
    private activatedRoute: ActivatedRoute,
    private route: Router
  ) { }

  // load do componente
  public ngOnInit(): void {
    this.activatedRoute.params.subscribe(pars => {
      this.showLoading = true;
      this.record = {};

      // Carrega o registro pelo ID
      // tslint:disable-next-line:no-string-literal
      this.currentId = pars['id'];

      // busca os valores dos dados a serem apresentados
      this.service.loadValuesById(this.currentId).subscribe(resp => {
        Object.keys(resp).forEach((key) => this.record[key] = resp[key]);

        // carrega a lista de campos somente apos receber os dados a serem apresentados
        this.service.loadMetadata().subscribe(metadata => {
          // tslint:disable-next-line:no-string-literal
          this.fields = metadata['fields'];
          this.showLoading = false;
        });
      });
    });

    this.setBreadcrumb();
  }

  private setBreadcrumb(): void {
    this.breadcrumbItem = { label: 'Home', link: '/' };
    this.breadcrumb.items = this.breadcrumb.items.concat(this.breadcrumbItem);
    this.breadcrumbItem = { label: 'Listagem de Idiomas' , link: '/personalization' };
    this.breadcrumb.items = this.breadcrumb.items.concat(this.breadcrumbItem);
    this.breadcrumbItem = { label: 'Detalhe do Idioma' };
    this.breadcrumb.items = this.breadcrumb.items.concat(this.breadcrumbItem);
  }

  // Redireciona quando clicar no botao Edit
  public editClick(): void {
    this.route.navigate(['/personalization', 'edit', this.currentId]);
  }

  // Redireciona quando clicar no botao Voltar
  public goBackClick(): void {
    this.route.navigate(['/personalization']);
  }
}


3) Componente HTML (personalization-edit.component.html)

Bloco de código
languagexml
firstline1
titleComponente PO-UI
linenumberstrue
collapsetrue
<po-loading-overlay
  [hidden]="!showLoading">
</po-loading-overlay>

<po-page-edit
  [p-title]="cTitle"
  [p-breadcrumb]="breadcrumb"
  [p-disable-submit]="formEdit.form.invalid"
  (p-cancel)="cancelClick()"
  (p-save)="saveClick()">

  <po-dynamic-form
    #formEdit
    p-auto-focus="string"
    [p-fields]="fields"
    [p-validate]="validationUrl"
    [p-value]="record">
  </po-dynamic-form>

</po-page-edit>


4) Componente TypeScript (personalization-edit.component.ts)

Bloco de código
languagexml
firstline1
titleComponente PO-UI
linenumberstrue
collapsetrue
import { Component, OnInit, ViewChild } from '@angular/core';
import { NgForm } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { PoBreadcrumb, PoBreadcrumbItem, PoDialogService, PoNotificationService } from '@po-ui/ng-components';

import { PersonalizationService } from './../personalization.service';

@Component({
  selector: 'app-personalization-edit',
  templateUrl: './personalization-edit.component.html',
  styleUrls: ['./personalization-edit.component.css']
})
export class PersonalizationEditComponent implements OnInit {
  // Define as variaveis a serem utilizadas
  public cTitle: string;
  public currentId: string;
  public record = {};
  public fields: Array<any> = [];
  public isUpdate = false;
  public showLoading = false;
  public validationUrl = this.service.getUrlAreaValidation();

  public breadcrumb: PoBreadcrumb = { items: [] };
  public breadcrumbItem: PoBreadcrumbItem;

   // Obtem a referencia do componente HTML
  @ViewChild('formEdit', { static: true })
  formEdit: NgForm;

  // Construtor da classe com os servicos necessarios
  constructor(
    private service: PersonalizationService,
    private activatedRoute: ActivatedRoute,
    private route: Router,
    private poDialog: PoDialogService,
    private poNotification: PoNotificationService
  ) { }

  // Load do componente
  public ngOnInit(): void {
    this.isUpdate = false;
    this.showLoading = true;

    // Carrega o registro pelo ID
    this.activatedRoute.params.subscribe(pars => {
      // tslint:disable-next-line:no-string-literal
      this.currentId = pars['id'];

      // Se nao tiver o ID definido sera um CREATE
      if (this.currentId === undefined) {
        this.isUpdate = false;
        this.cTitle = 'Novo Idioma';
      } else {
        this.isUpdate = true;
        this.cTitle = 'Edição do Idioma';
      }

      // Atualiza o breadcrumb de acordo com o tipo de edicao
      this.setBreadcrumb();

      // Se for uma alteracao, busca o registro a ser alterado
      if (this.isUpdate) {
        this.service.loadValuesById(this.currentId).subscribe(resp => {
          Object.keys(resp).forEach((key) => this.record[key] = resp[key]);

          // Em alteracao temos que receber o registro para depois buscar a lista de campos
          this.getMetadata();
        });
      } else {
        // Se for create, pega a lista de campos
        this.getMetadata();
      }
    });
  }

  private setBreadcrumb(): void {
    this.breadcrumbItem = { label: 'Home', action: this.beforeRedirect.bind(this) };
    this.breadcrumb.items = this.breadcrumb.items.concat(this.breadcrumbItem);
    this.breadcrumbItem = { label: 'Listagem de Idiomas', action: this.beforeRedirect.bind(this) };
    this.breadcrumb.items = this.breadcrumb.items.concat(this.breadcrumbItem);
    this.breadcrumbItem = { label: this.cTitle };
    this.breadcrumb.items = this.breadcrumb.items.concat(this.breadcrumbItem);
  }

  // Retorna a lista de campos
  private getMetadata() {
    this.service.loadMetadata().subscribe(metadata => {
        // tslint:disable-next-line:no-string-literal
        this.fields = metadata['fields'];
        this.showLoading = false;
    });
 }

  // Redireciona via breadcrumb
  private beforeRedirect(itemBreadcrumbLabel) {
    if (this.formEdit.valid) {
      this.route.navigate(['/']);
    } else {
      this.poDialog.confirm({
        title: 'Cancelamento de edição',
        message: 'Os dados ainda não foram gravados, confirma redirecinamento ?',
        confirm: () => this.route.navigate(['/'])
      });
    }
  }

  // Grava o registro quando clicado no botao Salvar
  public saveClick(): void {
    this.showLoading = true;
    if (this.isUpdate) {
      // Altera um registro ja existente
      this.service.update(this.currentId, this.record).subscribe(resp => {
        this.poNotification.success('Dados atualizados com sucesso');
        this.showLoading = false;
        this.route.navigate(['/personalization']);
      });
    } else {
      // Cria um registro novo
      this.service.create(this.currentId, this.record).subscribe(resp => {
        this.poNotification.success('Dados criados com sucesso');
        this.showLoading = false;
        this.route.navigate(['/personalization']);
      });
    }
  }

  // Cancela a edicao e redireciona ao clicar no botao Cancelar
  public cancelClick(): void {
    this.poDialog.confirm({
      title: 'Confirmar cancelamento',
      message: 'Voce deseja realmente cancelar a edição?',
      confirm: () => this.route.navigate(['/personalization'])
    });
  }
}


5) Componente HTML (personalization-list

Após cadastrar o campo, o mesmo é apresentado na tela inicial onde pode ser realizado filtros sobre seus resultados, bem como efetuar ações de edição ou exclusão.

Image Removed

Ao clicar na opção de editar, não será possível modificar o código do programa Datasul vinculado e também seu identificador. Os demais campos estão habilitados para edição.

Image Removed

Componente HTML com PO-DYNAMIC-VIEW

Abaixo temos os códigos da parte HTML, que são:

1) Componente HTML (personalization.component.html)

Bloco de código
languagexml
firstline1
titleComponente PO-UI
linenumberstrue
collapsetrue
<po-loading-overlay
  [hidden]="!showLoading">
</po-loading-overlay>

<po-page-dynamic-detailtable
  p-title="Personalização"auto-router
  [p-breadcrumb]="breadcrumbtitle="Listagem de Idiomas"
  ([p-edit)actions]="editClick()actions"
  ([p-back)breadcrumb]="goBackClick()breadcrumb">
  <po-dynamic-view
    [p-fields]="fields"
    [p-service-valueapi]="recordserviceApi">
  </po-page-dynamic-view>
</po-page-detail>table>


62) Componente TypeScript (personalization-list.component.ts)

Bloco de código
languagejsxml
firstline1
titleComponente TypeScriptPO-UI
linenumberstrue
collapsetrue
import { Component, OnInit } from '@angular/core';
import { PoBreadcrumb, PoBreadcrumbItem, PoNotificationService, PoBreadcrumbItem } from '@po-ui/ng-components';
import { PoPageDynamicTableActions } from '@po-ui/ng-componentstemplates';

import { PersonalizationService } from './../personalization.service';

@Component({
  selector: 'app-personalization-list',
  templateUrl: './personalization-list.component.html',
  styleUrls: ['./personalization-list.component.css']
})

export class PersonalizationComponentPersonalizationListComponent implements OnInit {
  // definicaoDefinicao das variaveis utilizadas
  public currentIdserviceApi: string;
  public fields: Array<any> = [];
  public showLoading = false;

  public literals;

  public record = {};
  public showLoading = false;
  public cProg = 'pedido-execucao-monitor' readonly actions: PoPageDynamicTableActions = {
    new: '/personalization/create',
    detail: '/personalization/detail/:id',
    edit: '/personalization/edit/:id',
    remove: true
  };

  public breadcrumb: PoBreadcrumb = { items: [] };
  public breadcrumbItem: PoBreadcrumbItem;

  // construtorConstrutor com os servicos necessariosda classe
  constructor(
    private service: PersonalizationService,
    private poNotification: PoNotificationService
  ) { }

  // loadLoad do componente
  public ngOnInit(): void {
    this.showLoadingfields = true[];
    this.recordserviceApi = {};
    // busca os valores dos dados a serem apresentadosthis.service.getUrlArea();
    this.showLoading = true;

    this.service.loadValues(this.cProg, 'esp'loadMetadata().subscribe(respmetadata => {
      // tslint:disable-next-line:no-string-literal
      console.log(resp)this.fields = metadata['fields'];
      Object.keys(resp).forEach((key) => this.record[key] = resp[key]);this.showLoading = false;
    });

    this.setBreadcrumb();
  //}

 carrega a lista de campos somente apos receber o registro a ser apresentado
      if (this.fields === null || this.fields.length === 0) {
        this.service.loadMetadata(this.cProg).subscribe(metadata => {
          // tslint:disable-next-line:no-string-literal
          this.fields = metadata['fields'];
          this.showLoading = false;
        });
      }
    });

    this.setBreadcrumb();
  }

  private setBreadcrumb(): void {
    this.breadcrumbItem = { label: 'Home', link: '/' };
    this.breadcrumb.items = this.breadcrumb.items.concat(this.breadcrumbItem);
    this.breadcrumbItem = { label: 'Personalização' };
    this.breadcrumb.items = this.breadcrumb.items.concat(this.breadcrumbItem);
  }

  // Redireciona quando clicar no botao Edit
  public editClick(): void {
    this.poNotification.information('Voce clicou na edição dos dados');
  }

  // Redireciona quando clicar no botao Voltar
  public goBackClick(): void {
    this.poNotification.information('Voce clicou para retornar para a tela anterior');
  }
}

3) Componente de serviço (personalization.service.ts)

private setBreadcrumb(): void {
    this.breadcrumbItem = { label: 'Home', link: '/' };
    this.breadcrumb.items = this.breadcrumb.items.concat(this.breadcrumbItem);
    this.breadcrumbItem = { label: 'Listagem de Idiomas' };
    this.breadcrumb.items = this.breadcrumb.items.concat(this.breadcrumbItem);
  }
}


7) Componente de serviço (personalization.service.ts)

Bloco de código
languagejs
firstline1
titleComponente de serviço
linenumberstrue
collapsetrue
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { PoNotificationService } from '@po-ui/ng-components';

const httpOptions: object = {
  headers: new HttpHeaders({
    'Content-Type': 'application/json',
    // 'Authorization': 'Basic ' + btoa('super:super@123'),
    // 'Access-Control-Allow-Origin': 'http://localhost:4200',
    // 'Access-Control-Allow-Headers': 'Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, X-Requested-With',
    // 'returnFormatVersion': '2',
  })
};

@Injectable({
  providedIn: 'root'
})
export class PersonalizationService {
  public progCode = 'html.aplicativos-eai';

  // Endpoint progress do framework para obtencao da lista de campos personalizados
  private urlMetadata = '/api/btb/v1/personalizationView/metadata/';

  // Endpoint progress da area de negocio para obtencao dos valores dos campos personalizados
  private urlArea = '/api/trn/v1/idiomaValues/';

  constructor(
    private http: HttpClient,
    private poNotification: PoNotificationService,
  ) { }

  public loadMetadata() {
    return this.http.post<any[]>(this.urlMetadata + this.progCode, httpOptions).pipe();
  }

  public loadValuesById(cId) {
    // tslint:disable-next-line:whitespace
    return this.http.get<any[]>(this.urlArea + 'byid/' + this.progCode + '/' + cId, httpOptions).pipe();
  }

  public loadAllValues() {
    return this.http.get<any[]>(this.urlArea + this.progCode + '/', httpOptions).pipe();
  }

  public create(cId, record) {
    return this.http.post<any[]>(this.urlArea + this.progCode + '/' + cId, record, httpOptions).pipe();
  }

  public update(cId, record
Bloco de código
languagejs
firstline1
titleComponente de serviço
linenumberstrue
collapsetrue
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { PoNotificationService } from '@po-ui/ng-components';

const httpOptions: object = {
  headers: new HttpHeaders({
    'Content-Type': 'application/json',
  })
};

@Injectable({
  providedIn: 'root'
})
export class PersonalizationService {
  // Endpoint progress do framework para obtencao da lista de campos personalizados
  private urlMetadata = '/api/btb/v1/personalizationView/metadata/';

  // Endpoint progress da area de negocio para obtencao dos valores dos campos personalizados
  private urlArea = '/api/trn/v1/idiomaValues/';

  private fieldList: Array<any> = [];

  constructor(
    private http: HttpClient,
    private poNotification: PoNotificationService,
  ) { }

  public loadMetadata(cProg) {
    return this.http.post<anyput<any[]>(this.urlMetadataurlArea + this.progCode + '/' + cProgcId, record, httpOptions).pipe();
  }

  public loadValuesdelete(cProgcId, cIdrecord) {
    return this.http.get<anyput<any[]>(this.urlArea + cProgthis.progCode + '/' + cId, record, httpOptions).pipe();
  }

  public getUrlArea(): string {
    return this.urlArea + this.progCode;
  }

  public getUrlAreaValidation(): string {
    return this.urlArea + 'validateForm/' + this.progCode;
  }
}


Endpoint em Progress da área de negócio

...