Componente de Crosstab para ser usado com o Zeedhi, construído sobre o vue-pivot-table.
- [x] Suporte a agregações personalizadas
- [x] Formatação personalizada das células
- [x] Ordenação de colunas
- [x] Filtros de colunas
- [ ] Configuração de largura/altura e alinhamento dos cabeçalhos
- [ ] Permitir esconder os sub-cabeçalhos
O ZdCrosstab é composto pelos pacotes @zeedhi/zd-crosstab-common
e @zeedhi/zd-crosstab-vue
.
Utilize o comando abaixo para instalar ambos automaticamente:
npm install @zeedhi/zd-crosstab
Ou instale os pacotes separadamente:
npm install @zeedhi/zd-crosstab-vue @zeedhi/zd-crosstab-common
Para registrá-lo, adicione o seguinte código ao inicializar a aplicação (por exemplo no arquivo zeedhi.ts
)
import Vue from 'vue';
import { ZdCrosstab } from '@zeedhi/zd-crosstab';
Vue.component('ZdCrosstab', ZdCrosstab);
Para utilizá-lo em um Metadata, basta definir a propriedade component
como "ZdCrosstab". Use a propriedade cols
para definir os campos que representam as colunas e a propriedade rows
para definir as linhas:
{
"name": "crosstab",
"component": "ZdCrosstab",
"rows": [
{
"name": "type",
"label": "Type"
},
{
"name": "genre",
"label": "Genre"
}
],
"cols": [
{
"name": "nationality",
"label": "Nationality"
}
],
"datasource": {
"loadAll": true,
"data": [
{ "type": "Book", "genre": "Fantasy", "name": "Harry Potter", "nationality": "International" },
{ "type": "Book", "genre": "Fantasy", "name": "The Name of the Wind", "nationality": "International" },
{ "type": "Book", "genre": "Romance", "name": "O Alquimista", "nationality": "National" },
{ "type": "Book", "genre": "Romance", "name": "Capitães da Areia", "nationality": "National" },
{ "type": "Book", "genre": "Comic Strip", "name": "It's a Magical World", "nationality": "International" },
{ "type": "Movie", "genre": "Drama", "name": "The Shawshank Redemption", "nationality": "International" },
{ "type": "Movie", "genre": "Drama", "name": "The Godfather", "nationality": "International" },
{ "type": "Movie", "genre": "Action", "name": "The Dark Knight", "nationality": "International" },
{ "type": "Movie", "genre": "Drama", "name": "Cidade de Deus", "nationality": "National" },
{ "type": "Movie", "genre": "Action", "name": "Tropa de Elite", "nationality": "National" },
{ "type": "Movie", "genre": "Drama", "name": "Schindler's List", "nationality": "International" }
]
}
}
O próximo exemplo mostra as funcionalidades de agregação (propriedade reducer
), formatação (propriedades componentProps
ou formatter
) e ordenação (propriedade sort
)
{
"component": "ZdCard",
"name": "gdpCard",
"children": [
{
"name": "title",
"component": "ZdText",
"text": "GDP of various Countries",
"tag": "h3"
},
{
"name": "crosstab",
"component": "ZdCrosstab",
"rows": [
{
"name": "continent",
"label": "Continent",
"sort": "{{AppController.sort}}"
},
{
"name": "country",
"label": "Country",
"sort": "{{AppController.sort}}"
}
],
"cols": [
{
"name": "year",
"label": "Year",
"showFooter": true
}
],
"cell": {
"name": "gdp",
"reducer": "SUM",
"componentProps": {
"component": "ZdNumber",
"mask": {
"currencySymbol": " (bi USD)",
"currencySymbolPlacement": "s"
}
}
},
"datasource": {
"loadAll": true,
"data": [
{ "country": "United States", "year": 2010, "continent": "America", "gdp": 14990 },
{ "country": "United States", "year": 2011, "continent": "America", "gdp": 15540 },
{ "country": "China", "year": 2010, "continent": "Asia", "gdp": 6087 },
{ "country": "China", "year": 2011, "continent": "Asia", "gdp": 7552 },
{ "country": "India", "year": 2010, "continent": "Asia", "gdp": 1676 },
{ "country": "India", "year": 2011, "continent": "Asia", "gdp": 1823 },
{ "country": "Brazil", "year": 2010, "continent": "America", "gdp": 2209 },
{ "country": "Brazil", "year": 2011, "continent": "America", "gdp": 2616 },
{ "country": "Australia", "year": 2010, "continent": "Oceania", "gdp": 1146 },
{ "country": "Australia", "year": 2011, "continent": "Oceania", "gdp": 1397 }
]
}
}
]
}
// AppController.ts
export class AppController {
// Order items reversely
public sort = (a: number, b: number) => {
if (a < b) return 1;
if (a === b) return 0;
return -1;
};
}
Também é possível formatar as células de forma manual usando a propridade formatter
:
"cell": {
"name": "gdp",
"reducer": "SUM",
"formatter": "{{AppController.formatter}}"
}
// AppController.ts
export class AppController {
public formatter = (value: number, labels: ILabel[]) => {
return `$ ${value}`;
};
}
Nome | Tipo | Padrão | Descrição |
---|---|---|---|
datasource |
IDatasource |
Fonte de dados do componente | |
cell |
ICell |
{ reducerInitialValue: 0, align: 'right' } |
Configuração de exibição das células |
rows |
IField[] |
[] |
Campos que serão utilizados como linhas |
cols |
IField[] |
[] |
Campos que serão utilizados como colunas |
noDataText |
string |
'NO_DATA' |
Texto a ser exibido quando o datasource não possuir dados |
loadingSlot |
IComponentRender[] |
[{ name: 'name-loading', component: 'ZdText', text: 'Loading items...' }] |
Componente a ser renderizado enquanto o datasource estiver carregando |
height |
string | number |
'auto' |
Altura do componente |
dense |
boolean |
true |
Define se a altura das linhas será densa |
Nome | Parâmetros | Descrição |
---|---|---|
cellClick |
{ component, event, element, value, labels }: IEventParam<Crosstab> |
Evento disparado ao clicar em uma célula |
Nome | Tipo | Padrão | Descrição |
---|---|---|---|
name |
string |
Nome do campo | |
label |
string |
Label a ser exibida no Crosstab | |
showFooter |
boolean |
false |
Exibe a coluna no footer |
showHeader |
boolean |
true |
Exibe a coluna no header |
sort |
string | ((a: number, b: number) => number) |
Função utilizada para ordenar os campos. Esta função deve retornar 1, 0 ou -1, seguindo o mesmo padrão do Arrays.sort | |
valuesFiltered |
string[] |
Filtro de valores que podem ser renderizados. Deve ser um array de strings contendo os possíveis valores |
Nome | Tipo | Padrão | Descrição |
---|---|---|---|
name |
string |
Nome do campo a ser utilizado para agregar as células | |
align |
string |
'right' |
Alinhamento dos valores das células |
componentProps |
IDictionary |
Propriedades utilizadas para formatar as células. Elas serão formatadas de acordo com o componente utilizado | |
formatter |
string | ((value: number, labels: ILabel[]) => string | number) |
Função utilizada para formatar as células. Os parâmetros value e labels são passados por parâmetro para a função de formatação |
|
reducer |
string | ((sum: number, item: IDictionary) => number) |
'COUNT' |
Função utilizada para agregar os valores. Existem duas funções predefinidas, basta passar o nome delas para a propriedade: COUNT e SUM . Também é possível passar uma função personalizada para agregar os valores, utilizando um Accessor |
reducerInitialValue |
number |
0 |
Valor inicial do agregador |
Nome | Tipo |
---|---|
field |
any |
value |
string |