UNPKG

@kassdoug/tableadv

Version:

Componente Angular 16+ para criação de uma table com amis recursos. Projeto com base na ideia da lib DataTables

328 lines (265 loc) 8.95 kB
# Tableadv Componente Angular+2 para criação de uma table com recursos a mais. Uso com apis feitas com backend Laravel+Eloquent. # Backend Para informações sobre o backend Laravel, verifique o projeto em <a href="https://github.com/kassiodouglas/AdvComponentsAngular/">Github AdvComponentsAngular</a>. ## Configurações Crie um componente, para o exemplo UsersComponent. Em `users-component.ts`: Crie 3 propriedades 'tableadvIdUser','tableadvUsers', 'tableadvUsersHeader' e um método,'getDataUsers()'. Onde: - *tableadvIdUser*: recebe o id único da tabela; - *tableadvUsers*: recebe os dados vindos da api; - *tableadvUsersHeader*: é a configuração das colunas; - *getDataUsers()*: método que irá acessar o servicço dos dados na api. <br> <br> ### Configuração do ID Somente informe um nome único para a tabela: ``` tableadvIdUser:string = 'tableUsers' ``` <br> <br> ### Configuração das colunas Em tableadvUsersHeader, configure as colunas e a ordem delas, existem algumas propriedades obrigatórias: - *db: (string)*: nome da coluna no banco de dados a ser exibida; - *label: (string)*: texto a ser exibido no cabeçalho da tabela; ``` tableadvUsersHeader = [ { db:"name", label:"Nome do usuário" }, { db:"email", label:"Email do usuário" } ] ``` As outras propriedades são: - *search: (string | object)*: define se a coluna é pesquisavél e em qual coluna é feita a pesquisa; - *order: (object)*: define se a coluna é ordenável e qual a coluna a ordenar; ``` tableadvUsersHeader = [ { db:"name", label:"Nome do usuário", search: "name", order: {db:"name"} }, { db:"email", label:"Email do usuário", search: "email", order: {db:"email"} } ] ``` A prop `search` pode ser uma string ou um objeto, se a pesquisa for feita na tabela primária, somente definir o nome da coluna já basta. Agora, se a pesquisa precisa ser em uma tabela relacionada com a primária, é necessário informar mais informações. Como estamos usando modelos no backend Laravel, vamos passar as configurações do nome do modelo e da coluna no modelo. Exemplificando, o usuário precisa pegar um endereço em uma tabela relacionada, com o model 'address' e sua coluna 'name'. A prop 'db' também tem que buscar os dados no modelo e coluna: ``` tableadvUsersHeader = [ { db:"name", label:"Nome do usuário", search: "name", order: {db:"name"} }, { db:"email", label:"Email do usuário", search: "email", order: {db:"email"} }, { db:"address.name", label:"Endereço do usuário", search: {model:"address", field:"name"} } ] ``` A prop `individualfilter` indica quais colunas podem ser pesquisadas individualmente ou em grupo, funciona em conjunto com a prop search. Seta como 'true' para funcionar: ``` tableadvUsersHeader = [ { db:"name", label:"Nome do usuário", search: "name", order: {db:"name"}, individualfilter: true }, { db:"email", label:"Email do usuário", search: "email", order: {db:"email"}, individualfilter: true }, { db:"address.name", label:"Endereço do usuário", search: {model:"address", field:"name"}, individualfilter: true } ] ``` A prop `order` tem como propriedade obrigatória o 'db' que é o nome da coluna a ordenar na tabela. Se for uma ordenação na tabela primária, somente essa prop é necessária. Se for uma ordenação na tabela relacionada, é necessário mais dados. Exemplificando, ordenar pelo nome do endereço, no model address: ``` tableadvUsersHeader = [ { db:"name", label:"Nome do usuário", search: "name", order: {db:"name"} }, { db:"email", label:"Email do usuário", search: "email", order: {db:"email"} }, { db:"address.name", label:"Endereço do usuário", search: {model:"address", field:"name"}, order: { db:'address.name', table_secondary:"address", field_secondary:"name", field_inner_primary:"address_id" } } ] ``` Onde: - *db*: nome da coluna a ordenar; - *table_secondary*: nome da tabela (não do modelo) relacionada; - *field_secondary*: nome da coluna na tabela relacionada; - *field_inner_primary*: nome da coluna na tabela primária que se relaciona com o id da secundaria; <br> <br> ### Configuração dos dados Os dados da tabela virão de uma api que será consumida por um serviço (usersService). No método 'getDataUsers()', teremos a seguinte lógica: ``` getDataUsers(event:any){ if(event.id == this.tableadvIdUser){ this.usersService.get(event).subscribe({ next: (response)=>{ this.tableadvUsers = response } }) } } ``` Assim o retorno da api será atribuida a prop 'tableadvUsers'. E nesse método, é onde poderá alterar os dados da api para inserções de novas colunas, componentes ou transformar os dados. ``` getDataUsers(event:any){ if(event.id == this.tableadvIdUser){ this.usersService.get(event).subscribe({ next: (response)=>{ response.data.forEach((item:any) => { item['nova_coluna'] = "texto fixo na nova coluna" }); this.tableadvUsers = response } }) } } ``` Essa nova coluna, deve ser informada na prop 'tableadvUsersHeader': ``` tableadvUsersHeader = [ { db:"name", label:"Nome do usuário", search: "name", order: {db:"name"} }, { db:"email", label:"Email do usuário", search: "email", order: {db:"email"} }, { db:"address.name", label:"Endereço do usuário", search: {model:"address", field:"name"}, order: { db:'address.name', table_secondary:"address", field_secondary:"name", field_inner_primary:"address_id" } }, { db:"nova_coluna", label:"Nova coluna", }, ] ``` ### Uso com componentes externos Você pode criar uma coluna com base em um componente externo. Basta criar uma nova coluna em 'tableadvUsersHeader', vamos chamar de 'options'. ``` tableadvUsersHeader = [ { db:"name", label:"Nome do usuário", search: "name", order: {db:"name"} }, { db:"email", label:"Email do usuário", search: "email", order: {db:"email"} }, { db:"address.name", label:"Endereço do usuário", search: {model:"address", field:"name"}, order: { db:'address.name', table_secondary:"address", field_secondary:"name", field_inner_primary:"address_id" } }, { db:"options", label:"", //não exibirá texto no cabeçalho }, ] ``` Assim no método 'getDataUsers(), configure a coluna: ``` getDataUsers(event:any){ if(event.id == this.tableadvIdUser){ this.usersService.get(event).subscribe({ next: (response)=>{ response.data.forEach((item:any) => { item['option'] = { component: { instance: OptionsComponent, properties: { data: item } } } }); this.tableadvUsers = response } }) } } ``` Suponha que OptionsComponent, terá sua propria logica baseada em um objeto da api. Nosso caso, OptionsComponent irá exibir opções ao clicar em um icone. Para configurar é preciso informar a instancia do componente e suas propriedades se houver. ``` . . item['option'] = { component: { instance: OptionsComponent, properties: { data: item } } } . . ``` <br><br> Em `users-component.html`: No html simplesmente chame o seletor 'tableadv' e informe os atributos que configuramos: ``` <tableadv [id]="tableadvIdUser" [data]="tableadvUsers" [gridHeader]="tableadvUsersHeader" (onGetData)="getDataUsers($event)"></tableadv> ``` Onde: - *id*: o id único da tabela; - *data*: são os dados da api em array; - *gridHeader*: dados da configuração das colunas; * *onGetData*: evento que irá chamar o método getDataUsers(), que deve receber $event; <br><br> Em `app-module.ts`: Faça o import dos modulos: ``` import { TableAdvModule } from '@kassdoug/tableadv'; import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppComponent } from './app.component'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { CommonModule } from '@angular/common'; @NgModule({ declarations: [ AppComponent ], imports: [ TableAdvModule, BrowserModule, FormsModule, ReactiveFormsModule, CommonModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { } ```