Tabela Genérica com Angular Material
- Operações Crud
- Paginação e Busca no backend
- Exibição de dados simples e aninhados
- Aplicação de máscara nos dados
- Pipe de enum
- Responsividade
<app-table
[dataTable]="tableData"
[columnDef]="tableColumns"
[showSearchBar]="true"
[showColumnName]="false"
[showMatSort]="false"
[showPaginator]="true"
[showCrudActions]="true"
[showCreateButton]="true"
[showRetrieveButton]="true"
[showRetrieveCell]="true"
[showUpdateButton]="true"
[showDeleteButton]="true"
[backendSearch]="true"
[backendPagination]="true"
[pageConfigDef]="configPage"
[newPageSize]="[1,3,5]"
(crud)="getCrudEvent($event)"
(search)="getSearchEvent($event)"
(paginate)="getPaginationEvent($event)"
></app-table><app-table
[dataTable]="tableData"
[columnDef]="tableColumns"
>
</app-table>| Nome | Valor Padrão | Tipo | Descrição |
|---|---|---|---|
| dataTable | [] | any[] | dados recebidos do componente pai |
| columnDef | [] | IColumn[] | definição das colunas no componente pai |
| Nome | Valor Padrão | Tipo | Descrição |
|---|---|---|---|
| backendPagination | false | boolean | habilita paginação de dados no backend |
| backendSearch | false | boolean | habilita pesquisa de dados no backend |
| pageConfigDef | new PageEvent | PageEvent | sobrescreve a configuração padrão de páginas |
| newPageSize | [] | number[] | sobrescreve a quantidade de itens por página |
| showSearchBar | false | boolean | exibe a barra de pesquisa |
| showColumnName | true | boolean | exibe o nome das colunas |
| showMatSort | true | boolean | exibe o ordenador (sort) da coluna |
| showPaginator | true | boolean | exibe o paginador (previous/next) da tabela |
| showCrudActions | false | boolean | exibe a coluna de ações crud |
| showCreateButton | false | boolean | exibe botão para criar objeto |
| showRetrieveButton | false | boolean | detalhes do objeto acessados via botão |
| showRetrieveCell | false | boolean | detalhes do objeto acessados via clique na linha |
| showUpdateButton | false | boolean | exibe botão para atualizar objeto |
| showDeleteButton | false | boolean | exibe botão para excluir objeto |
| Nome | Valor Padrão | Tipo | Descrição |
|---|---|---|---|
| crud | EventEmitter() | EventEmitter<CrudEvent> | emite qual ação crud e objeto foram solicitados |
| paginate | EventEmitter() | EventEmitter | emite tamanho e índice da página solicitada |
| search | EventEmitter() | EventEmitter<SearchEvent> | emite o valor a ser buscado no backend |
A exibição dos dados é de competência do componente <table-cell>
Presente dentro do componente da tabela, que possui os seguintes atributos:
| Nome | Valor Padrão | Tipo | Descrição |
|---|---|---|---|
| object | undefined | any | valor a ser exibido dentro de cada célula da tabela |
| columnName | undefined | string | nome da coluna exibido na tela do usuário |
| typeColumn | undefined | TypeColumn | tipo de dados que será exibido em cada coluna |
O método showDataTable()
permite a extração do valor a ser exibido em caso de objetos aninhados.
Basta indicar na definição de colunas, dentro do componente pai, o caminho correto
até o valor:
Uma empresa possui um proprietário e o objetivo é mostrar o nome dele na tabela
tableColumns: IColumn [] = [
// outras colunas
new Column('owner.name', 'Owner'),
];IFirm é o tipo de dados de uma empresa, cujo proprietário (owner) é uma pessoa
definido por IPerson
export interface IFirm {
// outros atributos
owner: IPerson;
}
export interface IPerson {
// outros atributos
name: string;
}O enum TypeColumn auxilia a utilização de máscaras dentro da tabela, para que
os dados possam ser exibidos de maneira agradável e compreensível.
Ele pode e deve ser modificado de acordo com a necessidade do projeto. Basta adicionar o valor
ao enum e determinar seu uso dentro do arquivo table-cell.component.html
export enum TypeColumn {
ShortDate = 'ShortDate',
//outros valores
Currency = 'Currency',
Cpf = 'Cpf',
// outros valores
}No HTML a diretiva ngSwitch será responsável por controlar qual máscara o dado deve receber.
O valor padrão ngSwitchDefault serve para strings simples. Ex: nome de uma pessoa.
<container-element [ngSwitch]="typeColumn">
<!-- máscara para cpf -->
<span *ngSwitchCase="columnType.Cpf">
{{ showDataTable(object, columnName) | mask: '000.000.000-00' }}
</span>
<!-- máscara para valores monetários -->
<span *ngSwitchCase="columnType.Currency">
{{ showDataTable(object, columnName) | currency }}
</span>
<!-- máscara para datas -->
<span *ngSwitchCase="columnType.ShortDate">
{{ showDataTable(object, columnName) | date: 'shortDate' }}
</span>
<span *ngSwitchDefault class="text-capitalize">
{{ showDataTable(object, columnName)?.toLocaleString().toLowerCase() }}
</span>
</container-element>É importante que o locale seja modificado no AppModule do projeto para que os pipes de data e valor monetário exibam os valores de acordo com a localidade desejada. Vide utils/providers.ts.
Para dados do tipo enum, há a possibilidade de formatá-lo com a ajuda de um pipe customizado.
Definimos o tipo da coluna no enum TypeColumn e criamos o enum do tipo do dado a ser exibido.
Ex: Gender.
export enum TypeColumn {
// outros valores
Gender = 'Gender',
}
export enum Gender {
F = 'Feminino',
M = 'Masculino'
}No componente <table-cell>:
get genderEnum() {
return Gender;
}<!-- máscara para enum de sexo -->
<span *ngSwitchCase="columnType.Gender">
{{ showDataTable(object, columnName) | enum: genderEnum }}
</span>Obs: o arquivo pipes/enum.pipe.ts declara pipe genérico que extrai valores de qualquer enum
A resposividade da tabela é de responsabilidade do arquivo table.component.css.
O atributo content: attr(data-label) utiliza o valor correspondente ao valor da coluna (columnValue), ou seja, o nome da coluna que é exibido no template, para exibi-lo ao lado dos dados.
Importante manter a referência [attr.data-label]="column.columnValue" a este atributo (content) no arquivo table.component.html.
- ngx-mask - v15.1.0
